Mouseover bei Staticcontrol
-
Ich möchte wenn die Maus über ein bestimtes Picturecontrol gefahren
wird das Icon darin ändern. Ich versuche das über die PreTranslate Message,
aber das Icon wird nicht gewechselt.Es wird beim ersten zeigen des Dialoges noch groß dargestellt.
Aber sobald ich die Maus bewege wird das Icon irgendwie in ca 16x16
dargestellt, obgleich es diese nur die 128x128 Version des Icon gibt!?
Wie kann ich das Icon denn wieder in echter Größe zeigen lassen?BOOL Icons::PreTranslateMessage(MSG* pMsg) { if ((pMsg->hwnd == GetDlgItem(IDC_STATICSDL)->m_hWnd) && (pMsg->message == WM_MOUSEMOVE)) { HICON m_hIcon; m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON2);//wird nie gezeigt? sdi.SetIcon(m_hIcon); } else { HICON m_hIcon; m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON8);//originalicon 128x128 sdi.SetIcon(m_hIcon); //sdi ist die Membervariable des Picturecontrol } return CDialog::PreTranslateMessage(pMsg); }
-
Hallo, ich habe es jetzt mit dem wechseln des Icon gelöst.
else if ((pMsg->hwnd != GetDlgItem(IDC_STATICSDL)->m_hWnd) && (pMsg->message == WM_MOUSEMOVE))
Aber wie ich die Originalgröße hinbekomme ist mir ein Rätsel.
Bitte bitte helfen.
-
*verzweifel* Kann ich wirklich nur 16x16 und 32x32 laden?
-
Schau dir mal LoadImage an. Damit solltest Du das Icon in der richtigen Größe Laden können, falls vorhanden.
Gruß
-
Meinst du so?
::AfxGetMainWnd()->SetIcon((HICON)LoadImage(::AfxGetInstanceHandle(),"c:\\test128x128.ico",IMAGE_ICON,128,128,LR_LOADFROMFILE),TRUE);
Dann kann ich es ja nur aus einer Datei laden oder?
Und als ich das eben so probierte hat sich zwar kein Fehler ergeben,
aber es wurde auch nicht das Icon geändert
-
Habs jetzt zwar gelöst, aber das Bild flackert immer extrem, wenn ich die
Maus bewege.BOOL Icons::PreTranslateMessage(MSG* pMsg) { if ((pMsg->hwnd == GetDlgItem(IDC_STATICSDL)->m_hWnd)) { HICON hIconSmall = (HICON)LoadImage( ::AfxGetInstanceHandle(), MAKEINTRESOURCE( IDI_ICON8 ),IMAGE_ICON, 128, 128,FALSE); sdi.SetIcon(hIconSmall); } else if ((pMsg->hwnd != GetDlgItem(IDC_STATICSDL)->m_hWnd)) { HICON hIconSmall = (HICON)LoadImage(::AfxGetInstanceHandle(), MAKEINTRESOURCE( IDI_ICON9 ), IMAGE_ICON, 128, 128, FALSE); sdi.SetIcon(hIconSmall); } return CDialog::PreTranslateMessage(pMsg); }
-
Schreib doch einfach noch eine Abfrage drumherum welche prüft ob bereits das entsprechende Icon geladen ist. Ansonsten solltest du auch noch OnEraseBackground überschreiben können um das Flackern zu verhindern, macht bei mir aber oft Probleme
-
Hmm, wie OnEraseBackground überschreiben? Ich steh noch ziemlich am Anfang der C++ Pyramiede
-
Die PreTranslateMessage haste doch auch überschrieben, genauso machste das mit der OnEraseBackground.
BOOL Icons::OnEraseBkgnd(CDC* pDC) { return TRUE; }
So zeichnet das Framework den Hintergrund nicht neu.
-
Dann wird aber der ganze Dialog transparent.
-
Naja wie gesagt diese Variante ist nicht unbedingt zu empfehlen, versuch doch die Sache mit der Abfrage, da reichen ein paar statics völlig aus.
BOOL Icons::PreTranslateMessage(MSG* pMsg) { static BOOL bStaticDsl = FALSE; if ((pMsg->hwnd == GetDlgItem(IDC_STATICSDL)->m_hWnd) && !bStaticDsl) { HICON hIconSmall = (HICON)LoadImage( ::AfxGetInstanceHandle(), MAKEINTRESOURCE( IDI_ICON8 ),IMAGE_ICON, 128, 128,FALSE); sdi.SetIcon(hIconSmall); bStaticDsl = TRUE; } else if ((pMsg->hwnd != GetDlgItem(IDC_STATICSDL)->m_hWnd) && bStaticDsl) { HICON hIconSmall = (HICON)LoadImage(::AfxGetInstanceHandle(), MAKEINTRESOURCE( IDI_ICON9 ), IMAGE_ICON, 128, 128, FALSE); sdi.SetIcon(hIconSmall); bStaticDsl = FALSE; } return CDialog::PreTranslateMessage(pMsg); }