WM_CTLCOLOR Message



  • Hallo
    ich habe in meinem Programm einen Dialog in dem der Gerätezustand eines Messgerätes angezeigt wird.
    Wird vom Gerät ein Fehler erkannt sendet es eine Meldung über RS232 und im Dialog wird der Hintergrund eines Statischen Textfeldes Rot dargestellt.
    Da sich der Zustand des Gerätes während der Laufzeit des Programmes ändern kann, und somit der Hintergrund auch neu gesetzt werden muss, möchte ich ein WM_CTLCOLOR Message senden, um die OnCtlColor-Methode erneut aufzurufen.

    this->SendMessage(WM_CTLCOLOR, NULL, NULL);
    

    wenn ich nun diese Nachricht an meinen Dialog sende, bekomme ich ein Unbehandelte Ausnahme mit Zugriffs-Verletzung.

    case AfxSig_CTLCOLOR:
    		{
    			// special case for OnCtlColor to avoid too many temporary objects
    			ASSERT(message == WM_CTLCOLOR);
    			AFX_CTLCOLOR* pCtl = reinterpret_cast<AFX_CTLCOLOR*>(lParam);
    			CDC dcTemp; 
    			dcTemp.m_hDC = pCtl->hDC;
    			CWnd wndTemp; 
    			wndTemp.m_hWnd = pCtl->hWnd;
    			UINT nCtlType = pCtl->nCtlType;
    			// if not coming from a permanent window, use stack temporary
    			CWnd* pWnd = CWnd::FromHandlePermanent(wndTemp.m_hWnd);
    

    Der Befehlszeiger zeigt auf dcTemp.m_hDC = pCtl->hDC;

    Weiß jemand was ich falsch mache? Oder kennt jemand eine andere Lösung?



  • Lös besser nur ein Neuzeichnen aus. Invalidate müsste das sein. 🙂



  • Okay, werde das mal ausprobieren. Hoffe mal das mein Dialog dann nicht anfängt zu flackern.



  • maRKus23 schrieb:

    Okay, werde das mal ausprobieren. Hoffe mal das mein Dialog dann nicht anfängt zu flackern.

    Dann mach das Invalidate nur auf das Control und nur dann, wenn sich was geändert hat. 🙂



  • So hat super funktioniert, danke!


Anmelden zum Antworten