Hilfe wo ist die Bremse?



  • Hallo liebe Profis,

    ich habe ein meinem Fenster ein paar Childfenster, welche Buttons sind und frage über Subclassing -> WM_MOUSEMOVE ab, ob die Maus über ihnen ist.
    Das heißt, alle Buttons nutzen dieselbe WNDPROC.
    Sobald ich in dieser WNDPROC etwas anderes mache als einen Wert zurückzugeben, habe ich einen unglaublichen Speicherauflauf und binnen einer halben Minute ist meine Applikation so langsam geworden, dass ich sie nicht anders killen kann als über den Taskmanager den Prozess abzubrechen.

    Nur eine Frage: Wie kann das sein?

    Subclassing kann doch wohl unmöglich so eine schlechte Methode sein?

    lg Max



  • Mit ziemlicher Sicherheit hast Du irgendwo ein Speicherleak...

    Also so in etwa: Mit jeder Abarbeitung von z.B. WM_MOUSEMOVE wird Speicher (oder auch Handles) angefordert aber nicht wieder freigegeben...

    Also, ohne Quellcode können wir hier nur durchs Wasserglas die Diagnose erstellen 🙄

    Martin



  • Was machst du denn "anderes als einen Wert zurückzugeben"?



  • Okay okay, hier die WNDPROC:

    LRESULT CALLBACK WndButton(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
    	HCURSOR hCursor;
    	TRACKMOUSEEVENT tme;
    	HDC hDC = GetWindowDC(hWnd);
    	switch (msg)
    	{
    		case WM_MOUSELEAVE:
    		{
    			InvalidateRect(hWnd,NULL,true);
    			UpdateWindow(GetParent(hWnd));
    			break;
    		}
    		case WM_MOUSEMOVE:
    		{
    			hCursor = SetCursor(LoadCursor(NULL,IDC_HAND));
    			ShowCursor(true);
    			tme.cbSize      = sizeof(TRACKMOUSEEVENT);
    			tme.dwFlags     = TME_HOVER|TME_LEAVE;
    			tme.dwHoverTime = HOVER_DEFAULT;
    			tme.hwndTrack   = hWnd;
    			TrackMouseEvent(&tme);
    			Line(hDC,0,0,Contacts.Width,0,RGB(0,200,60));
    			Line(hDC,0,0,0,Contacts.Height,RGB(0,200,60));
    			Line(hDC,Contacts.Width,0,Contacts.Width,Contacts.Height,RGB(0,200,60));
    			Line(hDC,0,Contacts.Height-1,Contacts.Width,Contacts.Height-1,RGB(0,200,60));
    			break;
    		}
    	}
    	return CallWindowProc(BUTTON_PROC,hWnd,msg,wParam,lParam);
    }
    

    Line()

    void Line(HDC hDC,int X1,int Y1,int X2,int Y2,__in COLORREF Color)
    {
    	HPEN hPen = CreatePen(PS_SOLID,0,Color);
    	SelectObject(hDC,hPen);
    	MoveToEx(hDC,X1,Y1,(LPPOINT)NULL);
    	LineTo(hDC,X2,Y2);
    	SelectObject(hDC,hPen);
    	DeleteObject(hPen);
    	return;
    }
    

    Vielen Dank für Eure schnellen Antworten!

    lg Max



  • Eins ist schonmal sicher falsch:

    MSDN schrieb:

    GetWindowDC:
    (...)
    After painting is complete, the ReleaseDC function must be called to release the device context. Not releasing the window device context has serious effects on painting requested by applications.

    p.S.: es ist sicher besser GetWindowDC nur dann aufzurufen wenn du auch einen DC brauchst, sonst wird für jede kleine Message immer GetWindowDC aufgerufen - was unnötig Performance verplempert.



  • Oh mein Gott, mehr war nicht nötig, nie zuvor war meine Applikation so schnell 😃

    TAUSEND DANK!!!

    lg Max



  • MaDsTyLe schrieb:

    nie zuvor war meine Applikation so schnell 😃

    So, und jetzt ab ins Bett! Und zwar genauso schnell wie nie zuvor ... 😃



  • Wird gemacht! 😃

    Gute Nacht Euch allen!

    lg Max


Log in to reply