Ereignisse (SetFocus/KillFocus) einbauen..



  • Hallo alle zusammen,

    ich habe folgende Situation:

    Ich habe einen Dialog mit vielen Checkboxen. Zur besserern optischen Unterscheidung möchte ich gerne die CheckBox mit einem gelben Hintergrund belegen wenn sie den Focus haben. Wenn der Focus wieder weg ist dann möchte ich wieder die normale Hintergrundfarbe haben.

    Also ich bräuchte eine Funktion welche beim Focuserhalt und beim Focusverlust angesprochen wird. In diesen Funktionen könnte ich dann jeweils die Farbe ändern. Ich habe bei der Entwicklungsumgebung Microsoft eMbedded Visual C++ mal im ClassWizard geschaut und da gibt es kein solches Ereignis (SetFocus - KillFocus) für Checkboxen.

    Wie kann ich diese Funktionen händisch hinzufügen. Ich habe es mal probiert indem ich ein EditFeld das Ereignis "SetFocus" zugeordnet habe und dann die IDC der CheckBox übergeben habe, aber es geht nicht.

    1. Problem:

    Wie kann ich das den jetzt lösen? Kann mir vielleicht jemand sagen wo ich was eingeben muß damit es funktioniert?

    2. Problem:

    Wie bekomme ich die "originale" Hintergrundfarbe heraus? Ich will diese ja dann bei Focusverlust wieder vergeben.

    Ich würde mich freuen wenn du mir weiter helfen könntest.

    Gruß Rudi



  • Ich weiß nicht, ob das hier auch bei Embedded funktioniert:

    BOOL CMyView::PreTranslateMessage(MSG* pMsg) 
    {
    	// Wurde eine Taste gedrückt?
    	if (pMsg->message == WM_KEYDOWN)
    	{
    		UINT  nKeyCode = pMsg->wParam; // virtual key code of the key pressed
    
    		// Tabtaste?
    		if  (nKeyCode == VK_TAB)
    		{
    			CWnd* pAlt = GetFocus();
    

    pAlt zeigt jetzt auf das Control, was den Focus hat. Damit solltest du arbeiten können.

    Wobei... da fällt mir ein: Nimm doch in der OnCtlColor GetFocus und prüfe, ob du gerade das Fenster zeichnest, was den Focus hat. 😃

    Die Originalfarbe bekommst du mit:

    ::GetSysColor(COLOR_3DFACE)
    


  • Also ich habe schon eine "Version" mit OnCtlColor

    HBRUSH ATHC_Edit_Grundeinstellung::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr;// = CDialogBase::OnCtlColor(pDC, pWnd, nCtlColor);
    /*CWnd *FocusWnd;
    CWnd *ElementWnd_1;
    CWnd *ElementWnd_2;
    FocusWnd = GetFocus();
    COLORREF Hintergrund;
    Hintergrund = RGB(255,255,255);*/
    
    switch( pWnd->GetDlgCtrlID() ) 
    { 
      case IDC_ATHC_CHB_1_1:          //CheckBox 1
      { 
         COLORREF Hintergrund; 
         Hintergrund = RGB(255,255,255); 
    
         if(GetFocus()->m_hWnd == pWnd->m_hWnd)
         { 
    	Hintergrund = RGB(255,0,0); 
             //Hintergrund = m_HatFocusHintergrund; 
         }
         else
         { 
             Hintergrund = RGB(190,190,190); 
             //Hintergrund = m_KeinFocusHintergrund; 
         } 
         hbr= (CreateSolidBrush(Hintergrund)); 
         break; 
      }  
      case IDC_ATHC_CHB_1_2:       //CheckBox 2
      { 
         COLORREF Hintergrund; 
         Hintergrund = RGB(255,255,255); 
    
         if(GetFocus()->m_hWnd == pWnd->m_hWnd)
         { 
    	Hintergrund = RGB(255,0,0); 
             //Hintergrund = m_HatFocusHintergrund; 
         }
         else
         { 
             Hintergrund = RGB(190,190,190); 
             //Hintergrund = m_KeinFocusHintergrund; 
         } 
         hbr= (CreateSolidBrush(Hintergrund)); 
         break; 
         }   
         default:   hbr= CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
       }//switch... */
        m_cCHB_1_1.Invalidate();
        m_cCHB_1_2.Invalidate();
    
       return hbr;
    

    Mit einer CheckBox klapps das ja schon ganz gut aber sobald ich mehr als eine case auswahl mache klapps das nicht mehr. Es wird nur noch die 2Checkbox geändert und die erste wird gar nicht mehr richtig angezeigt. hat einen weisen hintergrund und man erkennt sie garnet. Was ist den hier dann der Fehler?

    Also mit "OnCtlColor" klappt das nicht so gut. Das mit den Tasten ist zwar ne lösung aber nicht sehr komfortabel. Es gibt dann noch Tab und die Pfeile und die Maus und was es alles dabei gibt. Das ganze dann für ca. 50 Checkboxen ist schon etwas zu aufwendig.

    Es muß doch auch eine "SetFocus" und "KillFocus" ereignis geben oder?

    Hast du oder jemand noch ne andere Idee?



  • Versuch bitte mal:

    HBRUSH ATHC_Edit_Grundeinstellung::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    	HBRUSH hbr = CDialogBase::OnCtlColor(pDC, pWnd, nCtlColor);
    
    	if(GetFocus()->m_hWnd == pWnd->m_hWnd)
    	{
            HBRUSH B = CreateSolidBrush(RGB(255,0,0)); //Hintergrundfarbe 
            return (HBRUSH) B; 
    	}
    	else
    	{
            HBRUSH B = CreateSolidBrush(::GetSysColor(COLOR_3DFACE)); //Hintergrundfarbe 
            return (HBRUSH) B; 
    	}
    
    	return hbr;
    }
    

    RGB(255,0,0) ist übrigens rot und nicht gelb. 😉



  • Ihr produziert GDI Leaks am laufenden Band.



  • estartu_de schrieb:

    Versuch bitte mal:

    HBRUSH ATHC_Edit_Grundeinstellung::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    	HBRUSH hbr = CDialogBase::OnCtlColor(pDC, pWnd, nCtlColor);
    	
    	if(GetFocus()->m_hWnd == pWnd->m_hWnd)
    	{
            HBRUSH B = CreateSolidBrush(RGB(255,0,0)); //Hintergrundfarbe 
            return (HBRUSH) B; 
    	}
    	else
    	{
            HBRUSH B = CreateSolidBrush(::GetSysColor(COLOR_3DFACE)); //Hintergrundfarbe 
            return (HBRUSH) B; 
    	}
    	
    	return hbr;
    }
    

    RGB(255,0,0) ist übrigens rot und nicht gelb. 😉

    Also er springt ja schon richtig....die Dialog wird nicht aktualisiert.

    Was kann man den da machen?



  • Vieleicht fehlt noch der Aufruf von Invalidate() ?



  • Habe ich auch schon ausprobiert.

    Einmal für jede CheckBox oder Invalidat();

    Wird nicht aktualisiert.



  • Wenn gar nichts hilft, musst du die Checkbox selber malen.
    Stichwort Ownerdrawn.
    Guck mal auf www.codeproject.de

    Wenn du da nix findest kann ich dir Morgen mehr zeigen. 🙂 Aber ich hab meine Vorlage auch von da.


Anmelden zum Antworten