Welche Methode löst WM_CtlColor aus?



  • Welche Methode sendet die WM_CTLCOLOR Message?
    Versuche in meinem Programm die Buttons, beim Klicken und bei empfang einer USEr Message, zu färben.

    Wie mach ich das?

    Such jetzt schon 2 tage nahc Antworten.... 😞



  • Die brauchst du nicht selber auslösen, die kommt von alleine. 😉



  • Ja schon, aber wenn ich meine Buttons oder Editboxen oder ähnliches ändern will mach ich das in OnCtlColor, welche bei WM_CTLCOLOR aufgerufen wird. Nur beim Neuzeichnen(durch Redraw oder UpdateWindow) wird OnCtlColor nicht aufgerufen!



  • Hast du die Farbänderung im OnCtlColor vom Dialog? Dann musst du auch den Dialog neuzeichen, fürchte ich.
    Oder du machst das im Control, dann brauchst du eine eigene Klasse.



  • Ich ändere die Farben der Buttons in OnCtlColor!
    Wie gehts es denn im Control?

    Hab auch schon versucht Buttons selbst zu zeichnen mit einer eigenen Button Klasse, die ich aus dem Netz habe. hab aber sobald die Funktion zum Ändern der Buttonfarbe aufgerufen wurde eine Access violation bekommen!



  • monne81 schrieb:

    Ich ändere die Farben der Buttons in OnCtlColor!

    Welcher Klasse?

    Wie gehts es denn im Control?

    Hab auch schon versucht Buttons selbst zu zeichnen mit einer eigenen Button Klasse, die ich aus dem Netz habe. hab aber sobald die Funktion zum Ändern der Buttonfarbe aufgerufen wurde eine Access violation bekommen!

    Zeig mal, wie du es versucht hast, ich glaube das wäre der richtige Weg. 🙂



  • Ok festhalten:
    Das ist meine OnCtlColor im ServiceCall Dialog

    HBRUSH CDlgServiceCall::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    	//StandardBrush, wie in InitInstance in SetDialogBkColor definiert
    	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
    	switch(pWnd->GetDlgCtrlID())
    	{
    	case IDC_BUTTON_D1left:
    		{
    			if(DeskLeft[0])
    				return m_brush_yellow;
    			else
    				return  m_brush_white;
    
    		}
    		break;
    	case IDC_BUTTON_D1right:
    		{
    			if(DeskRight[0])
    			  	return m_brush_yellow;
    			 else
    				return m_brush_white;
    		}
    		break;
    			case IDC_BUTTON_D2left:
    		{
    			if(DeskLeft[1])
    				return m_brush_yellow;
    			else
    				return  m_brush_white;
    
    		}
    		break;
    .
    .
    .
    

    ich erhalte jetzt durch eine WM_User-Message das der Benutzer was gedrückt hat
    (an einem externen Gerät, Daten kommen über RS232 aber das funktioniert ohne Probleme!)
    Die WM_Message wird von folgender Funktion abgefangen:

    void CDlgServiceCall::OnSetServiceCall(int side, int pult) 
    {
    //	ShowWindow(SW_SHOW);
    //	::InvalidateRect(m_hWnd, NULL, TRUE);
    	ShowWindow(SW_HIDE);	
    	if(side==1)
    	{
    		DeskLeft[pult-1]=TRUE;
    	}
    	else
    	{
    		DeskRight[pult-1]=TRUE;	
    	}
    	//Neuzeichnen
    
    //	OnPaint();
    	//Invalidate();
    //	CButton Button1;
    //	Button1.GetDlgItem(IDC_BUTTON_D1left);
    //	RedrawWindow(NULL, NULL, RDW_INVALIDATE);
    
    //	UpdateWindow();
    	ShowWindow(SW_SHOWNA);
    }
    

    Wenn ich jetzt über RedrawWindow oder über Invalidate und UpdateWindow das Fensterneuzeichnen lassen will passiert nichts!

    es funktioniert nur wenn ich am angang ShoWindow(SW_HIDE) und am Ende ShowWindow(SW_SHOW) mache!!! Aber das ist kacke weil sich der Hintergrund immer ändert und flackert.

    Ich will aber das nochmal die OnCTlColor aufgerufen wird oder besser die Buttons neueingefärbt.

    Verstehst Du was ich meine???? 😕



  • So, ich habe jetzt eine Idee, was du vor hast. 🙂

    Mir sind folgende Zeilen aufgefallen, die in dem Zusammenhang total falsch erscheinen:

    //    CButton Button1;
    //    Button1.GetDlgItem(IDC_BUTTON_D1left);
    //    RedrawWindow(NULL, NULL, RDW_INVALIDATE);
    

    Versuch mal:

    GetDlgItem(IDC_BUTTON_D1left)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    

    Das ist aber nur ein Verdacht von mir, ungetestet!



  • I´ll try! 🙂



  • Der Herr salbe Dein Haupt mit Öl und gebe Dir eingroßes fass Bier!!! 👍

    Es funktioniert, ohne Flackern 😃

    Thanx!!!!!!!!!

    Jetzt kann es endlich weitergehen...



  • Schön! 👍

    Hast du denn verstanden, wo der Unterschied ist?
    Meine eine Zeile ist ja deine drei nur zusammengefasst.
    Lang wäre so:

    CWnd* pButton1 = NULL; // CButton geht nur mit Cast
    pButton1 = GetDlgItem(IDC_BUTTON_D1left);
    pButton1->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    


  • Ja jetzt hab ich den Unterschied verstanden!
    ist ja eigentlich auch logisch! Ich hab nur die ganze Zeit nach einem anderen Weg gesucht (Aufruf von OnCTlColor oder UpdateWindow)!

    Hab durch Deinen Vorschlag auch ne Menge Code gespart!!!
    ich kann ja mal den Code posten:

    void CDlgServiceCall::OnSetServiceCall(int side, int pult) 
    {	
    	if(side==1)
    		DeskLeft[pult-1]=TRUE;
    	else
    		DeskRight[pult-1]=TRUE;
    
    	RedrawButtons(side, pult);
    
    }
    void CDlgServiceCall::OnDeleteServiceCall(int side, int pult) 
    {
    	if(side==1)
    		DeskLeft[pult-1]=FALSE;
    	else
    		DeskRight[pult-1]=FALSE;
    
    	RedrawButtons(side, pult);
    }
    

    mein Funktion, welch die Buttons neu zeichnet:

    void CDlgServiceCall::RedrawButtons(int side, int pult)
    {
    	if(side==1)
    	{
    		switch(pult)
    		{
    		case 1:
    			GetDlgItem(IDC_BUTTON_D1left)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 2:
    			GetDlgItem(IDC_BUTTON_D2left)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 3:
    			GetDlgItem(IDC_BUTTON_D3left)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 4:
    			GetDlgItem(IDC_BUTTON_D4left)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 5:
    			GetDlgItem(IDC_BUTTON_D5left)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 6:
    			GetDlgItem(IDC_BUTTON_D6left)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 7:
    			GetDlgItem(IDC_BUTTON_D7left)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 8:
    			GetDlgItem(IDC_BUTTON_D8left)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 9:
    			GetDlgItem(IDC_BUTTON_D9left)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 10:
    			GetDlgItem(IDC_BUTTON_D10left)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 11:
    			GetDlgItem(IDC_BUTTON_D11left)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 12:
    			GetDlgItem(IDC_BUTTON_D12left)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		}
    	}
    	else
    	{	
    		switch(pult)
    		{
    		case 1:
    			GetDlgItem(IDC_BUTTON_D1right)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 2:
    			GetDlgItem(IDC_BUTTON_D2right)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 3:
    			GetDlgItem(IDC_BUTTON_D3right)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 4:
    			GetDlgItem(IDC_BUTTON_D4right)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 5:
    			GetDlgItem(IDC_BUTTON_D5right)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 6:
    			GetDlgItem(IDC_BUTTON_D6right)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 7:
    			GetDlgItem(IDC_BUTTON_D7right)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 8:
    			GetDlgItem(IDC_BUTTON_D8right)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 9:
    			GetDlgItem(IDC_BUTTON_D9right)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 10:
    			GetDlgItem(IDC_BUTTON_D10right)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 11:
    			GetDlgItem(IDC_BUTTON_D11right)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    		case 12:
    			GetDlgItem(IDC_BUTTON_D12right)->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    			break;
    
    		}
    	}
    
    }
    

    Die OnCtlColor blieb gleich!

    Ok vielleicht hilfts ja noch jemandem weiter!



  • der switch sieht IIHHH aus 👎



  • Warum ist der Switch IIIHHHH?

    Funktioniert einwandfrei in meiner Anwendung!

    Was wäre Dein Vorschlag es besser zu machen?

    greetz



  • Du kannst dir deine IDs so einstellen, daß sie numerisch hintereinander stehen, dann würde sich das reduzieren zu:

    if(side==1)
      GetDlgItem(IDC_BUTTON_D1left+(pult-1))->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    else
      GetDlgItem(IDC_BUTTON_D1right+(pult-1))->RedrawWindow(NULL, NULL, RDW_UPDATENOW);
    


  • Oder pack sie in ein Array wo der Wert der Index ist. 🙂



  • Ja klar die IDC sind ja eigentlich nichts anderes als Int Werte!

    OK dann werd ich mal den Switch kicken!

    Danke für Eure tipps! Man lernt nie aus!


Anmelden zum Antworten