Kontextmenu erscheint an der falschen Stelle!!!
-
Moin Moin.
Habe ein kleines MFC SDI Programm geschrieben dessen Ansicht von CrichEditView erbt.
Ich habe dann mit dem Klassenassistent meiner Ansicht WM_CONTEXTMENU zugefügt.
Ich musste leider feststellen das OnContextMenu(CWnd* pWnd, CPoint point) gar nicht aufgerufen wird. Habe zur Kontrolle eine TRACE-Anweiseung eingefügt. Bekomme keine Ausgabe im Debuger. OnContextMenu(C... wird also nicht aufgerufen.Nun habe ich mit dem Klassenassistenten die
Nachricht OnRButtonDown(UINT nFlags, CPoint point) in meiner Ansicht eingefügt um dort mein Kontextmenu aufzurufen.void CMyZettelView::OnRButtonDown(UINT nFlags, CPoint point)
{
TRACE("\nDer rechte button wurde geklickt\n\n");
CMenu menu;
menu.LoadMenu(IDR_MENU1);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x, point.y, this);
CRichEditView::OnRButtonDown(nFlags, point);
}Jetzt erscheint das Kontextmenu und solange mein Programm den ganzen Monitor bedeckt auch an der richtigen Stelle. Wenn ich mein Ansichtsfenster aber verkleinere (sagen wir auf ein-viertel des Bildschirms)
erscheint das Kontextmenu nicht mehr bei meiner Maus sondern ziemlich weit versetzt.
Der Versatz ist abhängig davon wo sich die Ansicht meines Programms auf dem Monitor befindet.
Ich vermute das die Koordinaten der Maus zum Zeitpunkt des Mausklicks und die Koordinaten an denen das Kontextmenu erscheint irgendwie unterscheiden.Was kann ich tun?
plutonium2
-
ScreenToClient
Merk dir die Funktion gut, die braucht man dauernd!!!

-
OnRButtonDown() bekommt Client-Koordinaten (relativ zur linken oberen Ecke des Fensters), TrackPopupMenu() erwartet Screen-Koordinaten (relativ zur linken oberen Ecke des Bildschirms), also mußt du deine Koordinaten umrechnen.
(und dafür gibt es die Methode ClientToScreen())
-
Hey super.
Das funktioniert ja ganz toll mit ClientToScreen();.
Vielen Dank für die schnelle Hilfe.
Echt super.
plutonium2
-
man hätte auch ganz einfach die curserposition nehmen können.
GetCursorPos(&point);
-
Tag LowFly.
Habe das mal mit der Cursoposition versucht.
Geht bei mir aber nicht. Das popup erscheint immer links oben am Monitor.
Ist mein Versuch so richtig oder wie hast du das gemeint?
Übrigens der Cursor ist nicht immer da wo ich mit der rechten maustaste hinklicke.void CMyZettelView::OnRButtonDown(UINT nFlags, CPoint point)
{
CPoint mp = GetCursorPos(&point);
CMenu menu;
menu.LoadMenu(IDR_MENU1);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
mp.x, mp.y, this);CRichEditView::OnRButtonDown(nFlags, point);
}
-
void CMyZettelView::OnRButtonDown(UINT nFlags, CPoint point) { GetCursorPos(&[b]point[/b]); //hier holst du dir die aktuelle curserposition CMenu menu; menu.LoadMenu(IDR_MENU1); menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, [b]point[/b].x, [b]point[/b].y, this); CRichEditView::OnRButtonDown(nFlags, point); }NEW EDIT:
du brauchst nicht nochmal eine CPoint strucktur erstellen, du kannst die von OnRButtonDown verwenden du belegst mit GetCursorPos die strucktur point nur mit den aktuellen werten des cursor
-
@LowFly: CPoint ist aber eine Klasse
.
-
CodeFinder schrieb:
@LowFly: CPoint ist aber eine Klasse
.@CodeFinder: <spitzfindigkeitsmodus>C++ macht keinen unterscheid zwischen struct und class. Somit ist eine Struktur (struct) implizit eine Klasse (class), bei der man sich einfach das public: sparen kann. Und eine Klasse (class) ist eine Struktur (struct) bei der man sich das private: sparen kann!</spitzfindigkeitsmodus>
