Problem mit Dialog, wird einfach weis!
-
Hallo,
ich habe gerade ein richtiges Problem festgestellt in meinem Programm. Und zwar wenn man sich über meinem Window eine Weile mit der Maus bewegt, dann wird es irgendwann komplett weis und hier und dar mal noch ein Icon, und das ganze dupliziert im linken oberen Eck. Und alle meine anderen Windows werden auch nicht mehr richtig gepainted, die haben dan auch irgendwelche Defeckte. Ich habe keine Ahnung wie es zu so etwas kommen kan, und auch nicht einmahl wo ich suchen könnte.Ich habe hier mal zwei Bilder die das ganze darstellen:
So sieht es normal aus
http://www.software.palmasol.net/Bild-hc-032.jpg
und so nach dem es weis wird
http://www.software.palmasol.net/Bild-hc-033.jpgUnd das ist meine WM_PAINT:
void CTabCtrlVS2010::OnPaint(HWND hwnd, LPPAINTSTRUCT ps) { RECT rc; HDC hdcMem; HBITMAP hbmMem, hbmOld; HBRUSH hBrush; GetClientRect(hwnd, &rc); hdcMem = CreateCompatibleDC(ps->hdc); hbmMem = CreateCompatibleBitmap(ps->hdc, rc.right-rc.left, rc.bottom-rc.top); hbmOld = (HBITMAP)SelectObject(hdcMem, hbmMem); hBrush = CreateSolidBrush(RGB(43,60,89)); FillRect(hdcMem, &rc, hBrush); DeleteObject(hBrush); CalculateRects(hdcMem); for(int i = 0; i < Tabs.size(); ++i) { if(Tabs[i].bActive && Tabs[i].bEnabled) { RECT rect = Tabs[i].rcTab; // Do the Gradient and other Background COLORREF rgbTop; COLORREF rgbBottom; COLORREF rgb; if(bIsActive) { rgbTop = RGB(255,253,237); rgbBottom = RGB(255,249,208); rgb = RGB(255,232,166); } else { rgbTop = RGB(241,248,255); rgbBottom = RGB(220,227,237); rgb = RGB(201,214,223); } FillRect(hdcMem, &rect, CreateSolidBrush(rgb)); GRADIENT_RECT gradientRect = { 0, 1 }; TRIVERTEX triVertext[ 2 ] = { rect.left, rect.top, GetRValue(rgbTop) << 8, GetGValue(rgbTop) << 8, GetBValue(rgbTop) << 8, 0x0000, rect.right, (rect.bottom-2)/2, GetRValue(rgbBottom) << 8, GetGValue(rgbBottom) << 8, GetBValue(rgbBottom) << 8, 0x0000 }; GradientFill(hdcMem, triVertext, 2, &gradientRect, 1, GRADIENT_FILL_RECT_V); SetPixel(hdcMem,rect.left,0,RGB(43,60,89)); SetPixel(hdcMem,rect.right-1,0,RGB(43,60,89)); // Draw the Text and Icons if(Tabs[i].pictureid != -1) { SelectObject(hdcMem, hFont); RECT captionrect = Tabs[i].rcTab; captionrect.bottom-=2; if(Tabs[i].bPictureRight) { captionrect.left += 6; captionrect.right -= 21; if(Tabs[i].bCloseButton) captionrect.right -= 20; SetBkMode(hdcMem, TRANSPARENT); SetTextColor(hdcMem, RGB(13,0,5)); DrawText(hdcMem, Tabs[i].Title.c_str(), -1, &captionrect, DT_SINGLELINE | DT_CENTER |DT_VCENTER); ImageList_Draw(hImageList, Tabs[i].pictureid, hdcMem, Tabs[i].rcTab.right-18-(Tabs[i].bCloseButton?20:0), (Tabs[i].rcTab.bottom-14)/2, ILD_NORMAL); } else { captionrect.left += 21; if(Tabs[i].bCloseButton) captionrect.right -= 20; SetBkMode(hdcMem, TRANSPARENT); SetTextColor(hdcMem, RGB(13,0,5)); DrawText(hdcMem, Tabs[i].Title.c_str(), -1, &captionrect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); ImageList_Draw(hImageList, Tabs[i].pictureid, hdcMem, Tabs[i].rcTab.left+6, (Tabs[i].rcTab.bottom-14)/2, ILD_NORMAL); } } } else if(!Tabs[i].bActive && Tabs[i].bEnabled) { FillRect(hdcMem, &Tabs[i].rcTab, CreateSolidBrush(RGB(43,60,89))); if(Tabs[i].bMouseOverTab && (CurLButtonDown == -1 || CurLButtonDown == i)) { HRGN RoundedFrame = CreateRoundRectRgn(Tabs[i].rcTab.left,Tabs[i].rcTab.top,Tabs[i].rcTab.right+1,Tabs[i].rcTab.bottom,2,2); hBrush = CreateSolidBrush(RGB(85,102,120)); FillRgn(hdcMem,RoundedFrame,hBrush); DeleteObject(hBrush); hBrush = CreateSolidBrush(RGB(152,164,178)); FrameRgn(hdcMem,RoundedFrame,hBrush,1,1); DeleteObject(hBrush); DeleteObject(RoundedFrame); } if(Tabs[i].pictureid != -1) { SelectObject(hdcMem, hFont); RECT captionrect = Tabs[i].rcTab; captionrect.bottom-=2; if(Tabs[i].bPictureRight) { captionrect.left += 6; captionrect.right -= 21; if(Tabs[i].bCloseButton) captionrect.right -= 20; SetBkMode(hdcMem, TRANSPARENT); SetTextColor(hdcMem, RGB(248,255,255)); DrawText(hdcMem, Tabs[i].Title.c_str(), -1, &captionrect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); ImageList_Draw(hImageList, Tabs[i].pictureid, hdcMem, Tabs[i].rcTab.right-18-(Tabs[i].bCloseButton?20:0), (Tabs[i].rcTab.bottom-14)/2, ILD_NORMAL); } else { captionrect.left += 21; if(Tabs[i].bCloseButton) captionrect.right -= 20; SetBkMode(hdcMem, TRANSPARENT); SetTextColor(hdcMem, RGB(248,255,255)); DrawText(hdcMem, Tabs[i].Title.c_str(), -1, &captionrect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); ImageList_Draw(hImageList, Tabs[i].pictureid, hdcMem, Tabs[i].rcTab.left+6, (Tabs[i].rcTab.bottom-14)/2, ILD_NORMAL); } } } else if(!Tabs[i].bEnabled) { FillRect(hdcMem, &Tabs[i].rcTab, CreateSolidBrush(RGB(43,60,89))); if(Tabs[i].pictureid != -1) { SelectObject(hdcMem, hFont); RECT captionrect = Tabs[i].rcTab; captionrect.bottom-=2; IMAGELISTDRAWPARAMS Params = {0}; Params.cbSize = sizeof(Params); Params.himl = hImageList; Params.i = Tabs[i].pictureid; Params.hdcDst = hdcMem; Params.fState = ILD_BLEND50; if(Tabs[i].bPictureRight) { captionrect.left += 6; captionrect.right -= 21; if(Tabs[i].bCloseButton) captionrect.right -= 20; SetBkMode(hdcMem, TRANSPARENT); SetTextColor(hdcMem, RGB(248,255,255)); DrawText(hdcMem, Tabs[i].Title.c_str(), -1, &captionrect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); Params.x = Tabs[i].rcTab.right-18-(Tabs[i].bCloseButton?20:0); Params.y = (Tabs[i].rcTab.bottom-14)/2; ImageList_DrawIndirect(&Params); } else { captionrect.left += 21; if(Tabs[i].bCloseButton) captionrect.right -= 20; SetBkMode(hdcMem, TRANSPARENT); SetTextColor(hdcMem, RGB(248,255,255)); DrawText(hdcMem, Tabs[i].Title.c_str(), -1, &captionrect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); Params.x = Tabs[i].rcTab.left+6; Params.y = (Tabs[i].rcTab.bottom-14)/2; ImageList_DrawIndirect(&Params); } } } if(Tabs[i].bEnabled && Tabs[i].bCloseButton && (LButtonDownCloseButton() == i || LButtonDownCloseButton() == -1 || Tabs[i].bActive)) { RECT rect = Tabs[i].rcTab; rect.left = rect.right-19; rect.right -= 4; rect.top = 3; rect.bottom = 18; if(Tabs[i].bMouseOverCloseButton && ((LButtonDownCloseButton() == i && CurLButtonDown == i) || CurLButtonDown == -1)) { // White/Orange Background hBrush = CreateSolidBrush((Tabs[i].bLButtonDownCloseButton&&i==CurMouseOver&&Tabs[i].bMouseOverCloseButton&&bMouseOverACloseButton?RGB(252,230,172):RGB(255,255,246))); FillRect(hdcMem, &rect, hBrush); DeleteObject(hBrush); // Orange Frame hBrush = CreateSolidBrush(RGB(220,195,139)); FrameRect(hdcMem, &rect, hBrush); DeleteObject(hBrush); // Black X HPEN hPen = CreatePen(PS_SOLID, 1, RGB(114,106,104)); SelectObject(hdcMem, hPen); MoveToEx(hdcMem, rect.left+3, rect.top+3, NULL); LineTo(hdcMem, rect.right-4, rect.bottom-4); MoveToEx(hdcMem, rect.left+5, rect.top+3, NULL); LineTo(hdcMem, rect.right-2, rect.bottom-4); MoveToEx(hdcMem, rect.left+3, rect.bottom-5, NULL); LineTo(hdcMem, rect.right-4, rect.top+2); MoveToEx(hdcMem, rect.left+5, rect.bottom-5, NULL); LineTo(hdcMem, rect.right-2, rect.top+2); DeleteObject(hPen); hPen = CreatePen(PS_SOLID, 1, RGB(7,1,0)); SelectObject(hdcMem, hPen); MoveToEx(hdcMem, rect.left+4, rect.top+3, NULL); LineTo(hdcMem, rect.right-3, rect.bottom-4); MoveToEx(hdcMem, rect.left+4, rect.bottom-5, NULL); LineTo(hdcMem, rect.right-3, rect.top+2); DeleteObject(hPen); } else if(Tabs[i].bEnabled && (Tabs[i].bActive || Tabs[i].bMouseOverTab)) { BOOL bNothing = FALSE; // Grey/Orange X HPEN hPen, hPen1; if(bIsActive && (Tabs[i].bActive || CurLButtonDown != -1)) { hPen = CreatePen(PS_SOLID, 1, RGB(177,159,119)); hPen1 = CreatePen(PS_SOLID, 1, RGB(118,96,47)); } else if(!bIsActive && Tabs[i].bActive) { hPen = CreatePen(PS_SOLID, 1, RGB(145,151,165)); hPen1 = CreatePen(PS_SOLID, 1, RGB(93,99,111)); } else if(Tabs[i].bMouseOverTab) { hPen = CreatePen(PS_SOLID, 1, RGB(159,168,177)); hPen1 = CreatePen(PS_SOLID, 1, RGB(204,212,223)); } else { bNothing = TRUE; } if(!bNothing) { SelectObject(hdcMem, hPen); MoveToEx(hdcMem, rect.left+3, rect.top+3, NULL); LineTo(hdcMem, rect.right-4, rect.bottom-4); MoveToEx(hdcMem, rect.left+5, rect.top+3, NULL); LineTo(hdcMem, rect.right-2, rect.bottom-4); MoveToEx(hdcMem, rect.left+3, rect.bottom-5, NULL); LineTo(hdcMem, rect.right-4, rect.top+2); MoveToEx(hdcMem, rect.left+5, rect.bottom-5, NULL); LineTo(hdcMem, rect.right-2, rect.top+2); SelectObject(hdcMem, hPen1); MoveToEx(hdcMem, rect.left+4, rect.top+3, NULL); LineTo(hdcMem, rect.right-3, rect.bottom-4); MoveToEx(hdcMem, rect.left+4, rect.bottom-5, NULL); LineTo(hdcMem, rect.right-3, rect.top+2); DeleteObject(hPen); DeleteObject(hPen1); } } } } HBRUSH rgb; if(bIsActive) rgb = CreateSolidBrush(RGB(255,232,166)); else rgb = CreateSolidBrush(RGB(201,214,223)); if(CurTabSel != -1 && GetEnabledTabsCount() > 0) { RECT rect1 = rc; RECT rect2 = rc; rect1.top = 19; rect1.bottom = 23; rect2.top = rc.bottom-4; FillRect(hdcMem, &rect1, rgb); FillRect(hdcMem, &rect2, rgb); if(CurTabSel != 0) SetPixel(hdcMem,rc.left,19,RGB(43,60,89)); SetPixel(hdcMem,rc.right-1,19,RGB(43,60,89)); SetPixel(hdcMem,rc.left,rc.bottom-1,RGB(43,60,89)); SetPixel(hdcMem,rc.right-1,rc.bottom-1,RGB(43,60,89)); } DeleteObject(rgb); BitBlt(ps->hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, hdcMem, 0, 0, SRCCOPY); SelectObject(hdcMem, hbmOld); DeleteObject(hbmMem); DeleteDC(hdcMem); }
Vielen Dank
Johannes
-
Du hast einige handle leaks. z.B.:
FillRect(hdcMem, &rect, CreateSolidBrush(rgb));
So sollte es im Allgemeinen aussehen:
hOld = SelectObject(hdc,CreateGDIObjectXyz()) ... DeleteObject(SelectObject(hdc,hOld))
-
gdiler hat recht.
Du wenn ein GDI Objekt in einem DC selektiert wird und dort noch aktiv ist, dann wird dieses nicht gelöscht (kann nicht gelöscht werden). Gleichzeitig werden die Standard-Objekte auch nicht entsorgt, die mit dem DC ereugt wurden.
-
Vielen Dank, da hatte ich wirklich einfach nur ein paar übersehen, es sieht aus als würde es jetzt funktionieren!!!
-
Johannes251298 schrieb:
es sieht aus als würde es jetzt funktionieren!!!
Taskmanager starten, Reiter Prozesse, Menu->Ansicht->Spalten Auswählen->GDI-Objekte aktivieren.
Programm laufen lassen, eventuell Fenster vergrößern/kleinern, und überprüfen ob die Anzahl der handels über längere Zeit konstant bleibt :xmas1: