Neuzeichnen von Buttons



  • Servus!
    Wie bringe ich meinen Dialog dazu, seine Buttons neuzuzeichnen mit OnCtlColor???

    In einem Dialog färbe ich die Buttons je nach Benutzereingabe mit
    OnCtlColor:

    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;
    	case IDC_BUTTON_D2right:
    		{
    			if(DeskRight[1])
    			  	return m_brush_yellow;
    			 else
    				return m_brush_white;
    		}
    .
    .
    .		break;
    

    Wenn mein Dialog eine von mir erstellte WM bekommt, soll er die Buttons neu zeichnen:

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

    Ich hab schon ziemlich viel probiert (siehe Auskommentierte Zeilen)
    aber es funktioniert nur wenn ich am Anfang der Methode

    ShowWindow(SW_HIDE)
    

    und am Ende

    ShowWindow(SW_SHOW)
    

    eingebe!

    Aber so flackert es und das Fenster im Hintergrund scheint manchmal durch!

    Am besten wäre es mit InvalidateRect oder so, da ich nur die Mitte des Screens neuzeichnen möchte(Nur die Buttons)!

    Wer weiß was?????? 😕



  • Hast du schon versucht, den ::InvalidateRect() Aufruf etwas weiter hinten in die Nachrichten-Methode zu setzen?



  • Ja ich hab ihn auch schon ganz am Ende aber noch vor UpadateWindow gehabt!

    Das Problem ist, das Programm führt Invalidate aus und zeichnet Den Dialog mit WM_Paint auch neu (sehe ich an einem Textfeld am unteren Rand) nur springt es nicht in OnCTlColor!!!


Anmelden zum Antworten