Irgendwas läuft da schief ;O
-
Servus Leute,
ich habe ein Problem mit einem Programm, an dem ich momentan schreibe : Einem Chat-Programm, ein kleines.
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.
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.
Die Nachrichten werden aber ganz normal in dem Fenster, in dem Client A mit Client C chattet ausgegeben.Hier ist der Code, der eigentlich für die entsprechenden Nachrichten das RICHTIGE Fenster finden sollte :
void GuiMaintainer::UpdateWindowOutput( const char* text, std::string szChatPartner ) { if ( NmbrOfChatWindows == 0 ) { createChatWindow( szChatPartner ); UpdateWindowOutput ( text , szChatPartner ); return; } for ( int i = 0; i < NmbrOfChatWindows; i ++ ) { if ( ChatWindowHandles[i]->chatPartner == szChatPartner ) { std::string temp(text); ChatWindowHandles[i]->OutputData.push_back(temp); SendMessage( ChatWindowHandles[i]->output , LB_ADDSTRING, 0,0); SizeListItems( ChatWindowHandles[i]->output , ChatWindowHandles[i]->OutputData ); SendMessage( ChatWindowHandles[i]->output , WM_VSCROLL, SB_BOTTOM, 0); break; } else if ( i == NmbrOfChatWindows-1 ) { createChatWindow( szChatPartner ); UpdateWindowOutput( text , szChatPartner ); } } }Das vector-struct was hier verwendet wird :
struct chatwindow { HWND mainWindow, input, output; std::vector < std::string > OutputData; std::string chatPartner; }; std::vector < std::tr1::shared_ptr<chatwindow> > ChatWindowHandles;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 :
void GuiMaintainer::SizeListItems( HWND list, const std::vector<std::string>& Data) { if(!Data.size()) return; HDC hdc = GetDC(list); SelectObject(hdc, reinterpret_cast<HFONT>(SendMessage(list, WM_GETFONT, 0, 0))); bool erasebk = false; for(size_t i=0;i<Data.size();++i) { RECT itm; SendMessage(list, LB_GETITEMRECT,i,reinterpret_cast<LPARAM>(&itm)); int h = DrawText(hdc, Data[i].c_str(), Data[i].length(), &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); }Und der entsprechende Teil in der Call-back function :
case WM_DRAWITEM : { for( int i = 0; i < NmbrOfChatWindows; i ++ ) { if ( ChatWindowHandles[i]->output == GetDlgItem( ChatWindowHandles[i]-> mainWindow, wParam) ) { LPDRAWITEMSTRUCT lpd = reinterpret_cast<LPDRAWITEMSTRUCT>(lParam); switch (lpd->itemAction) { case ODA_SELECT: case ODA_DRAWENTIRE: if(ChatWindowHandles[i]->OutputData.size() < lpd->itemID) { break; } SetBkMode(lpd->hDC, TRANSPARENT); FillRect(lpd->hDC, &lpd->rcItem, (lpd->itemState & ODS_SELECTED)? GetSysColorBrush(COLOR_HIGHLIGHT): GetSysColorBrush(COLOR_WINDOW)); DrawText(lpd->hDC, ChatWindowHandles[i]->OutputData[lpd->itemID].c_str(), ChatWindowHandles[i]->OutputData[lpd->itemID].length(), &lpd->rcItem, DT_LEFT | DT_WORDBREAK ); case ODA_FOCUS: break; } } } }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.
Danke schonmal im Voraus
MFG
-
Hmm_/ schrieb:
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.
Die Nachrichten werden aber ganz normal in dem Fenster, in dem Client A mit Client C chattet ausgegeben.Na, in welchem Fenster denn nun ?
-
[gg]site:msdn.microsoft.com
Hacker schrieb:
Hmm_/ schrieb:
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.
Die Nachrichten werden aber ganz normal in dem Fenster, in dem Client A mit Client C chattet ausgegeben.Na, in welchem Fenster denn nun ?
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.