<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Irgendwas läuft da schief ;O]]></title><description><![CDATA[<p>Servus Leute,</p>
<p>ich habe ein Problem mit einem Programm, an dem ich momentan schreibe : Einem Chat-Programm, ein kleines.<br />
Problem-Beschreibung : Angenommen es sind 3 Clienten connected. A B und C. A und B chatten schon miteinander, außerdem chattet auch C mit A. D.h : Bei Client A werden nun 2 Fenster offen sein : Eins mit Client B und eins mit Client C.<br />
Nun geschieht es immer wieder mal, besonders wenn Client C viele Nachrichten in kurzer Zeit hintereinander an Client A schickt, dass diese Nachrichten im Falschen Fenster ausgegeben werden; eben in dem Fenster, in dem Client A eig. mit Client B chattet. Diese werden aber nicht sofort angezeigt, sondern erst wenn Client B wieder eine Nachricht an Client A schickt. Manchmal blockweise, manchmal auch pro Eingabe eine Nachricht.<br />
Die Nachrichten werden aber ganz normal in dem Fenster, in dem Client A mit Client C chattet ausgegeben.</p>
<p>Hier ist der Code, der eigentlich für die entsprechenden Nachrichten das RICHTIGE Fenster finden sollte :</p>
<pre><code class="language-cpp">void GuiMaintainer::UpdateWindowOutput( const char* text, std::string szChatPartner ) {

	 if ( NmbrOfChatWindows == 0 ) {
		createChatWindow( szChatPartner );
		UpdateWindowOutput ( text , szChatPartner );
		return;
	 }
     for ( int i = 0; i &lt; NmbrOfChatWindows; i ++ ) {
         if ( ChatWindowHandles[i]-&gt;chatPartner == szChatPartner ) {

            std::string temp(text);
            ChatWindowHandles[i]-&gt;OutputData.push_back(temp);
            SendMessage( ChatWindowHandles[i]-&gt;output , LB_ADDSTRING, 0,0);
            SizeListItems( ChatWindowHandles[i]-&gt;output , ChatWindowHandles[i]-&gt;OutputData );
            SendMessage( ChatWindowHandles[i]-&gt;output , WM_VSCROLL, SB_BOTTOM, 0);
			break;
         }
		 else if ( i == NmbrOfChatWindows-1 ) {

              createChatWindow( szChatPartner );
              UpdateWindowOutput( text , szChatPartner );

              }      
     }   

}
</code></pre>
<p>Das vector-struct was hier verwendet wird :</p>
<pre><code class="language-cpp">struct chatwindow {
       HWND mainWindow, input, output;
       std::vector &lt; std::string &gt; OutputData;
       std::string chatPartner;
};

std::vector &lt; std::tr1::shared_ptr&lt;chatwindow&gt; &gt; ChatWindowHandles;
</code></pre>
<p>Die Funktion, die die eigentliche Ausgabe macht hat mir ein Member aus der Foren-Community geschrieben, da ich das mit dem Zeilenbruch etc. nicht hinbekommen hab. An der wirds aber nicht liegen, lief bis jetzt immer perfekt. Trotzdem poste ich sie eben :</p>
<pre><code class="language-cpp">void GuiMaintainer::SizeListItems( HWND list, const std::vector&lt;std::string&gt;&amp; Data) {
                   if(!Data.size()) return;
                   HDC hdc = GetDC(list);
                   SelectObject(hdc, reinterpret_cast&lt;HFONT&gt;(SendMessage(list, WM_GETFONT, 0, 0)));
                   bool erasebk = false;
                   for(size_t i=0;i&lt;Data.size();++i) {
                       RECT itm;
                       SendMessage(list, LB_GETITEMRECT,i,reinterpret_cast&lt;LPARAM&gt;(&amp;itm));
                       int h = DrawText(hdc,
                       Data[i].c_str(),
                       Data[i].length(),
                       &amp;itm,
                       DT_LEFT | DT_WORDBREAK | DT_CALCRECT);
                       if(h != SendMessage(list, LB_GETITEMHEIGHT,i,0)) {
                       erasebk  = true; 
                       SendMessage(list, LB_SETITEMHEIGHT, i, h);
                       }
                   }
                   ReleaseDC(list,hdc);
                   InvalidateRect(list, 0, erasebk); 
}
</code></pre>
<p>Und der entsprechende Teil in der Call-back function :</p>
<pre><code class="language-cpp">case WM_DRAWITEM : {

for( int i = 0; i &lt; NmbrOfChatWindows; i ++ ) {

                  if ( ChatWindowHandles[i]-&gt;output == GetDlgItem( ChatWindowHandles[i]-&gt; mainWindow, wParam)   ) {

                       LPDRAWITEMSTRUCT lpd = reinterpret_cast&lt;LPDRAWITEMSTRUCT&gt;(lParam);
                       switch (lpd-&gt;itemAction) {
                       case ODA_SELECT:
                       case ODA_DRAWENTIRE:

                       if(ChatWindowHandles[i]-&gt;OutputData.size() &lt; lpd-&gt;itemID) { break; } 
                       SetBkMode(lpd-&gt;hDC, TRANSPARENT);
                       FillRect(lpd-&gt;hDC, &amp;lpd-&gt;rcItem,
                               (lpd-&gt;itemState &amp; ODS_SELECTED)? GetSysColorBrush(COLOR_HIGHLIGHT): GetSysColorBrush(COLOR_WINDOW));

                       DrawText(lpd-&gt;hDC,
                                ChatWindowHandles[i]-&gt;OutputData[lpd-&gt;itemID].c_str(),
                                ChatWindowHandles[i]-&gt;OutputData[lpd-&gt;itemID].length(),
                                &amp;lpd-&gt;rcItem,
                                DT_LEFT | DT_WORDBREAK );
                       case ODA_FOCUS:
                            break; 
                       }
                  }
             }
}
</code></pre>
<p>Ich hoffe ich hab alles wichtige drin. Ich glaube ja, dass es eigentlich in der GuiMaintainer::UpdateWindowOutput liegen müsste, finde da aber eigentlich nichts fehlerhaftes.</p>
<p>Danke schonmal im Voraus<br />
MFG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/292698/irgendwas-läuft-da-schief-o</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 20:03:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292698.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 15 Sep 2011 16:45:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Irgendwas läuft da schief ;O on Thu, 15 Sep 2011 16:45:37 GMT]]></title><description><![CDATA[<p>Servus Leute,</p>
<p>ich habe ein Problem mit einem Programm, an dem ich momentan schreibe : Einem Chat-Programm, ein kleines.<br />
Problem-Beschreibung : Angenommen es sind 3 Clienten connected. A B und C. A und B chatten schon miteinander, außerdem chattet auch C mit A. D.h : Bei Client A werden nun 2 Fenster offen sein : Eins mit Client B und eins mit Client C.<br />
Nun geschieht es immer wieder mal, besonders wenn Client C viele Nachrichten in kurzer Zeit hintereinander an Client A schickt, dass diese Nachrichten im Falschen Fenster ausgegeben werden; eben in dem Fenster, in dem Client A eig. mit Client B chattet. Diese werden aber nicht sofort angezeigt, sondern erst wenn Client B wieder eine Nachricht an Client A schickt. Manchmal blockweise, manchmal auch pro Eingabe eine Nachricht.<br />
Die Nachrichten werden aber ganz normal in dem Fenster, in dem Client A mit Client C chattet ausgegeben.</p>
<p>Hier ist der Code, der eigentlich für die entsprechenden Nachrichten das RICHTIGE Fenster finden sollte :</p>
<pre><code class="language-cpp">void GuiMaintainer::UpdateWindowOutput( const char* text, std::string szChatPartner ) {

	 if ( NmbrOfChatWindows == 0 ) {
		createChatWindow( szChatPartner );
		UpdateWindowOutput ( text , szChatPartner );
		return;
	 }
     for ( int i = 0; i &lt; NmbrOfChatWindows; i ++ ) {
         if ( ChatWindowHandles[i]-&gt;chatPartner == szChatPartner ) {

            std::string temp(text);
            ChatWindowHandles[i]-&gt;OutputData.push_back(temp);
            SendMessage( ChatWindowHandles[i]-&gt;output , LB_ADDSTRING, 0,0);
            SizeListItems( ChatWindowHandles[i]-&gt;output , ChatWindowHandles[i]-&gt;OutputData );
            SendMessage( ChatWindowHandles[i]-&gt;output , WM_VSCROLL, SB_BOTTOM, 0);
			break;
         }
		 else if ( i == NmbrOfChatWindows-1 ) {

              createChatWindow( szChatPartner );
              UpdateWindowOutput( text , szChatPartner );

              }      
     }   

}
</code></pre>
<p>Das vector-struct was hier verwendet wird :</p>
<pre><code class="language-cpp">struct chatwindow {
       HWND mainWindow, input, output;
       std::vector &lt; std::string &gt; OutputData;
       std::string chatPartner;
};

std::vector &lt; std::tr1::shared_ptr&lt;chatwindow&gt; &gt; ChatWindowHandles;
</code></pre>
<p>Die Funktion, die die eigentliche Ausgabe macht hat mir ein Member aus der Foren-Community geschrieben, da ich das mit dem Zeilenbruch etc. nicht hinbekommen hab. An der wirds aber nicht liegen, lief bis jetzt immer perfekt. Trotzdem poste ich sie eben :</p>
<pre><code class="language-cpp">void GuiMaintainer::SizeListItems( HWND list, const std::vector&lt;std::string&gt;&amp; Data) {
                   if(!Data.size()) return;
                   HDC hdc = GetDC(list);
                   SelectObject(hdc, reinterpret_cast&lt;HFONT&gt;(SendMessage(list, WM_GETFONT, 0, 0)));
                   bool erasebk = false;
                   for(size_t i=0;i&lt;Data.size();++i) {
                       RECT itm;
                       SendMessage(list, LB_GETITEMRECT,i,reinterpret_cast&lt;LPARAM&gt;(&amp;itm));
                       int h = DrawText(hdc,
                       Data[i].c_str(),
                       Data[i].length(),
                       &amp;itm,
                       DT_LEFT | DT_WORDBREAK | DT_CALCRECT);
                       if(h != SendMessage(list, LB_GETITEMHEIGHT,i,0)) {
                       erasebk  = true; 
                       SendMessage(list, LB_SETITEMHEIGHT, i, h);
                       }
                   }
                   ReleaseDC(list,hdc);
                   InvalidateRect(list, 0, erasebk); 
}
</code></pre>
<p>Und der entsprechende Teil in der Call-back function :</p>
<pre><code class="language-cpp">case WM_DRAWITEM : {

for( int i = 0; i &lt; NmbrOfChatWindows; i ++ ) {

                  if ( ChatWindowHandles[i]-&gt;output == GetDlgItem( ChatWindowHandles[i]-&gt; mainWindow, wParam)   ) {

                       LPDRAWITEMSTRUCT lpd = reinterpret_cast&lt;LPDRAWITEMSTRUCT&gt;(lParam);
                       switch (lpd-&gt;itemAction) {
                       case ODA_SELECT:
                       case ODA_DRAWENTIRE:

                       if(ChatWindowHandles[i]-&gt;OutputData.size() &lt; lpd-&gt;itemID) { break; } 
                       SetBkMode(lpd-&gt;hDC, TRANSPARENT);
                       FillRect(lpd-&gt;hDC, &amp;lpd-&gt;rcItem,
                               (lpd-&gt;itemState &amp; ODS_SELECTED)? GetSysColorBrush(COLOR_HIGHLIGHT): GetSysColorBrush(COLOR_WINDOW));

                       DrawText(lpd-&gt;hDC,
                                ChatWindowHandles[i]-&gt;OutputData[lpd-&gt;itemID].c_str(),
                                ChatWindowHandles[i]-&gt;OutputData[lpd-&gt;itemID].length(),
                                &amp;lpd-&gt;rcItem,
                                DT_LEFT | DT_WORDBREAK );
                       case ODA_FOCUS:
                            break; 
                       }
                  }
             }
}
</code></pre>
<p>Ich hoffe ich hab alles wichtige drin. Ich glaube ja, dass es eigentlich in der GuiMaintainer::UpdateWindowOutput liegen müsste, finde da aber eigentlich nichts fehlerhaftes.</p>
<p>Danke schonmal im Voraus<br />
MFG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119824</guid><dc:creator><![CDATA[Hmm_&#x2F;]]></dc:creator><pubDate>Thu, 15 Sep 2011 16:45:37 GMT</pubDate></item><item><title><![CDATA[Reply to Irgendwas läuft da schief ;O on Thu, 15 Sep 2011 18:18:48 GMT]]></title><description><![CDATA[<p>Hmm_/ schrieb:</p>
<blockquote>
<p>Nun geschieht es immer wieder mal, besonders wenn Client C viele Nachrichten in kurzer Zeit hintereinander an Client A schickt, <strong>dass diese Nachrichten im Falschen Fenster ausgegeben werden</strong>; eben in dem Fenster, in dem Client A eig. mit Client B chattet. Diese werden aber nicht sofort angezeigt, sondern erst wenn Client B wieder eine Nachricht an Client A schickt. Manchmal blockweise, manchmal auch pro Eingabe eine Nachricht.<br />
Die Nachrichten werden aber <strong>ganz normal in dem Fenster, in dem Client A mit Client C chattet ausgegeben.</strong></p>
</blockquote>
<p>Na, in welchem Fenster denn nun ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119858</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 15 Sep 2011 18:18:48 GMT</pubDate></item><item><title><![CDATA[Reply to Irgendwas läuft da schief ;O on Thu, 15 Sep 2011 18:20:57 GMT]]></title><description><![CDATA[<p>[gg]site:msdn.microsoft.com</p>
<p>Hacker schrieb:</p>
<blockquote>
<p>Hmm_/ schrieb:</p>
<blockquote>
<p>Nun geschieht es immer wieder mal, besonders wenn Client C viele Nachrichten in kurzer Zeit hintereinander an Client A schickt, <strong>dass diese Nachrichten im Falschen Fenster ausgegeben werden</strong>; eben in dem Fenster, in dem Client A eig. mit Client B chattet. Diese werden aber nicht sofort angezeigt, sondern erst wenn Client B wieder eine Nachricht an Client A schickt. Manchmal blockweise, manchmal auch pro Eingabe eine Nachricht.<br />
Die Nachrichten werden aber <strong>ganz normal in dem Fenster, in dem Client A mit Client C chattet ausgegeben.</strong></p>
</blockquote>
<p>Na, in welchem Fenster denn nun ?</p>
</blockquote>
<p>Die Nachrichten, die Client C schickt, kommen ganz normal im entsprechenden Fenster an. Leider tritt dann dieser Effekt, den ich beschrieben habe, auf, wenn Client B wieder was senden will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2119863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2119863</guid><dc:creator><![CDATA[Hmmm_&#x2F;]]></dc:creator><pubDate>Thu, 15 Sep 2011 18:20:57 GMT</pubDate></item></channel></rss>