Unerklärliches Problem!
-
Sorry, dass der Titel nicht sehr aussagekräftig ist, aber ich habe ein Prob was ich mir wirklich nicht erklären kann und ich weiss nicht woran es liegt!
Ich beschreibe am Besten erst einmal das Programm im Groben.
Ich habe eine Klasse main.cpp mit dem int WINAPI WinMain Eintritt. In dieser Funktion erstelle ich mir ein Hauptfenster mit Menüs!wc.style = 0; // CS = "class style" wc.lpfnWndProc = WndProc; //IMPORTANT: the Event handle function wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hI; wc.hIcon = LoadIcon (NULL, IDI_APPLICATION); wc.hCursor = LoadCursor (NULL, IDC_ARROW); wc.hbrBackground = BackgroundColor; wc.lpszMenuName = NULL; wc.lpszClassName = szName; RegisterClass (&wc); definitions.saveLanguageTemp(); StartSplash startSplash; startSplash.showSplash(wc, cx, cy, hI); // creates the window hwnd = CreateWindow (szName, "Power Watch 0.2", WS_SYSMENU | WS_OVERLAPPEDWINDOW, xOld, yOld, width, heigth, NULL, NULL, hI, NULL); ShowWindow (hwnd, iCmdShow); UpdateWindow (hwnd); // message-loop while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); }Im Menü erstelle ich diverse Einträge.
Auszug:hSubMenu = CreatePopupMenu(); // defines PopUp AppendMenu(hSubMenu, MF_STRING, ID_FILE_NEW, "New"); //name and ID AppendMenu(hSubMenu, MF_STRING, ID_FILE_EXIT, "Exit"); AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "File");/*appends the SubMenu to the Menu */Bei Klick auf "New" erzeuge ich in einer separaten Klasse ein Dialogfenster und übergebe das Handle des Hauptfensters, um es dort als parent zu verwenden!
hNew = CreateWindow (szNew, "New", WS_CAPTION | WS_VISIBLE | WS_OVERLAPPED | WS_SYSMENU, (cx/2)-250, (cy/2)-200, stNew.DialogWidth(), stNew.DialogHeigth(), hwnd, // Handle of the parent NULL, NULL, NULL);In diesem Dialogfenster befindet sich eine Listbox mit Einträgen ganzzahlig von 1 bis 15. Man wählt eine Zahl und klickt auf OK. Dann wird die Zahl in einer Datei gespeichert und ein weiteres Fenster in einer anderen Klasse erzeugt!
Das Handle übergebe ich auch dieses mal!UMF.createDocument(wc_Docu, hwnd_Docu, x, y);Dann wird das Fenster erstellt:
hDocument = CreateWindow( szDocument, "Units", WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | WS_POPUP, xOld, yOld, width, heigth, hDocu, NULL, NULL, NULL);In diesem Fenster werden Grafiken angezeigt. Die Fensterhöhe ist abhängig von der ausgewählten Zahl im "New" Dialog!
Da nicht alles in das Fenster passt, wird gescrollt (hori und verti)!
Das funktioniert auch wunderbar! Allerdings nicht lange!
Und zwar wird nach einigen mal Scrollen, Text zwar weiterhin angezeigt (und auch gescrollt), aber keine Grafiken mehr!
Text:TextOut (hdc, globalRect.left + 30, globalRect.top + stdUnitMatrix.DrawHeigth() * i + 20, "Box", lstrlen("Box"));ein horizontaler Strich:
penBorder = CreatePen(PS_SOLID, 2, RGB (255,255,0) ); SelectObject(hdc, penBorder); MoveToEx( hdc, globalRect.left, globalRect.top + stdUnitMatrix.DrawHeigth() * i + stdUnitMatrix.DrawHeigth(), NULL ); LineTo (hdc, globalRect.left + stdUnitMatrix.DrawWidth(), globalRect.top + stdUnitMatrix.DrawHeigth() * i + stdUnitMatrix.DrawHeigth());eine Grafik:
hdcmem=CreateCompatibleDC(hdc); SelectObject(hdcmem, V_L1); BitBlt (hdc, globalRect.left + 520, 50 + globalRect.top + stdUnitMatrix.DrawHeigth() * i, bitmap.bmWidth, bitmap.bmHeight, hdcmem,0,0,SRCCOPY); DeleteDC(hdcmem);i ist die Variable mit dem vorher ausgewählten Wert!
Als unangenehmer Nebeneffekt sind nach Programmende die Kontextmenüs in Windows schwarz. Die Taskleiste auch. Bewege ich die Maus darüber tauchen die Symbole und Grafiken langsam wieder auf!
Starte ich mein Programm neu und erstelle wieder ein neues Fenster, funktioniert das Scrollen wieder rum eine Zeit lang, bis oben beschriebener Effekt wieder auftritt!
Ich habe mir mal eine Zählvariable erstellt, die jedesmal wenn WM_VSCROLL auf gerufen wird, um eins erhöht wird und dann in eine Datei gespeichert wird!
Diese Zahl ist umgekehrt proportional zur der ausgewählten im Newdialog!
Wähle ich 14 aus, tritt das Problem nach ca. 600 WM_VSCROLL Aufrufen auf, wähle ich 7 nach ca. 1200 Aufrufen!
Ich vermute mal, dass das irgendein Problem mit den Handles von 2 Fenstern ist (bzw. Nachrichtenschleife). Ich weiss aber nicht, wo ich da ansetzen könnte um das Problem zu erkennen bzw. ein zugrenzen!
Ein Problem mit den Scrollbars schliesse ich zu 99% aus, da Text ja weiterhin gescrollt und angezeigt wird!
Ich weiss da einfach nicht weiter. Wahrscheinlich ist es irgend etwas ganz banales!
Falls jemand eine Idee hat, wäre das schön!
Bei Bedarf kommt auch noch weiterer Quelltext, wollte bloß nicht zuviel posten jetzt (ist vermutlich schon lang genug der Beitrag)!
Gruß
-
Hört sich nach GDI Leak an. Lies dir mal durch wie man bei GDI die Sachen richtig freigibt.
-
Ja geil! Funktioniert!

Danke!
Hatte vergessen den Pen zu löschen!
DeleteObject(penBorder);
Juhu, war mir fast klar, dass das was banales ist!
-
Bei SelectObject muß man auch noch was beachten, was du wahrscheinlich nicht gemacht hast. Immer das Original wider reinselektieren bevor man den DC freigibt. Windows XP stört sich nicht daran, wenn du es nicht machst, aber ich glaub ältere Windows schon.
-
Du meinst so:
pDC->SelectObject(bla);
Ja, das werde ich noch ändern.
Danke für den Tipp!