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.jpg

    Und 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))
    

  • Mod

    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:


Anmelden zum Antworten