Ich habe ein Fenster von CWnd abgeleitet, in dem ich einige OwnerDrawn Buttons erstellen. Die Buttons sind von CButton abgeleitet.Wie ändere ich BackgroundColor OnMouseHover C++ MFC
Jetzt möchte ich zu BackgroundColor meiner Schaltflächen wechseln, wenn der Benutzer darüber schwebt.
Deshalb implementiert ich bereits, dass die OnMouseHover() und die OnMouseLeave() Nachrichten gesendet zu werden:
BEGIN_MESSAGE_MAP(CFooterButton, CButton)
ON_WM_MOUSEHOVER()
ON_WM_MOUSEMOVE()
ON_WM_MOUSELEAVE()
END_MESSAGE_MAP()
void CFooterButton::OnMouseMove(UINT nFlags, CPoint point)
{
//start tracking of Hover and Leave Event
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.hwndTrack = m_hWnd;
tme.dwHoverTime = HOVER_DEFAULT;
TrackMouseEvent(&tme);
CButton::OnMouseMove(nFlags, point);
}
void CFooterButton::OnMouseHover(UINT nFlags, CPoint point)
{
HDC hdc = *GetWindowDC();
SetBkColor(hdc,RGB(54, 125, 184));
CButton::OnMouseHover(nFlags, point);
}
Im Debugger und Spy ich kann, dass der Code zu sehen ist immer genannt, aber nichts passiert. Da ich relativ neu in MFC/C++ bin, nehme ich an, dass ich die DC nicht richtig verwende. Kann mir jemand erklären, warum es nicht funktioniert und wie ich es beheben kann?
Das Ändern des Hintergrunds in 'OnMouseHover' wird nicht viel bewirken, da die Hintergrundfarbe beim Malen des Hintergrunds oder des Fensters zurückgesetzt wird. Sie könnten 'OnEraseBkgn' überschreiben und die Farbe dort einstellen. –
@KarstenKoop, also muss ich nur Invalidate() aufrufen, wenn OnMouseHover aufgerufen wird und dann Handle OnEraseBkgn? –
Ich denke, ein besserer Ansatz wäre, den Button als Besitzer zu definieren und die Hintergrundfarbe mit dem DC zu zeichnen. – rrirower