Popups zu weit liks



  • Hi Leutz,

    ich hab ne Frage bzgl. Popups, ich hab eine Form mit nem Menü bei rechtsklick wird ein Popup angezeigt wenn ich so mach direct über dem MausCursor wie mans gewöhnt ist :

    void CKontextmenueDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
    {
    	 CMenu *m_lMenu = NULL;				// Zeiger vom Typ Menü erstellen
    	 m_lMenu = GetMenu();				// Zeiger auf Fenstermenü holen
     	 m_lMenu = m_lMenu->GetSubMenu(0);	// Zeiger auf erstes Untermenü holen
    	 m_lMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_LEFTBUTTON,point.x, point.y, this, NULL); // Popup-Menü anzeigen
    
    }
    

    Wenn ich aber erreichen möchte dass je nach dem wo ich hinklicke ein anderes Menü erscheint, werden die 2 versch. Popups viel zu weit links angezeigt, ich habs in OnButtonDown gemacht :

    void CDLG_MenueDlg::OnRButtonDown(UINT nFlags, CPoint point) 
    {
    
    	CMenu *pMenu = NULL;
    	pMenu = GetMenu ();
    
    	if (point.x < 218)
    	{	
    		pMenu = pMenu->GetSubMenu(0);	// Zeiger auf erstes Untermenü holen
    		pMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_LEFTBUTTON, point.x, point.y, this, NULL); // Popup-Menü anzeigen
    	}
    	else if (point.x > 218)
    	{	
    		pMenu = pMenu->GetSubMenu(1);	// Zeiger auf zweites Untermenü holen
    		pMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_LEFTBUTTON, point.x, point.y, this, NULL); // Popup-Menü anzeigen
    	}	
    }
    

    Wisst ihr was ich falsch mache und wies richtig geht ?

    regards
    ShadowEater

    [/cpp]



  • Kennst du schon ScreenToClient? 🙂


  • Mod

    Nun TrackPopupMenu erwartet keine Fenster-Koordinaten sondern absolute Koordinaten relativ zum Bildschirm.
    OnCOntextMenu liefert Bildschirm Koordinante, OnRButtonDown liefert Fenster Koordinaten. Da fehlt also ein ClientToScreen!

    BTW: Mach es nicht so, verwende imm WM_CONTEXTMENU. Wie sonst kann man das Menü mit der Maus öffnen. Die meisten Programmierer vergessen, dass es eine Kontextmenü-Taste gibt!



  • Hi Martin,
    danke für deine schnelle antwort.
    Am Anfang hatte ich es ja in OnContextMenu bzw. die WM_CONTEXTMENU Nachricht genutzt, aber wie mach ich es dann, dass ich bei verschiedenen Positionen auch versch. Popups angezeigt bekomme ?

    Kommt rüber was ich mein ?

    😉
    ShadowEater



  • Martin Richter schrieb:

    Da fehlt also ein ClientToScreen!

    Ups, falschrum. 🙄

    ShadowEater schrieb:

    [...]aber wie mach ich es dann, dass ich bei verschiedenen Positionen auch versch. Popups angezeigt bekomme ?

    Nen Point hast du doch bei beiden Funktionen. 😕



  • void CDLG_MenueDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
    {
    		CMenu *pMenu = NULL;
    	pMenu = GetMenu ();
    
    	if (point.x < 218)
    	{	
    		pMenu = pMenu->GetSubMenu(0);	// Zeiger auf erstes Untermenü holen
    		pMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_LEFTBUTTON, point.x, point.y, this, NULL); // Popup-Menü anzeigen
    	}
    	else if (point.x > 218)
    	{	
    		pMenu = pMenu->GetSubMenu(1);	// Zeiger auf erstes Untermenü holen
    		pMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_LEFTBUTTON, point.x, point.y, this, NULL); // Popup-Menü anzeigen
    	}	
    
    }
    

    so sieht die Funktion aus.
    Angezeigt wird ein Popup schön über dem mauszeigen aber immer das selbe ?

    regards ShadowEater



  • Hmmmmmm.

    ich mach schon seit Stunden damit rum, habt ihr echt keine Ahnung ?

    Oder isses so einfach dass sich keine Antwort lohnt.

    😉
    ShadowEater



  • ...Man könnte sich auch randlose Fenster für die einzelnen Bereiche in die man klickt definieren, da könnte man auch Images reinhängen...

    😉
    regards
    ShadowEater


  • Mod

    Wo ist Dein Problem? Du bekommst Koordinaten auch bei WM_CONTEXTMENU.
    Diese kannst Du umrechnen in Client-Koordinaten mit ScreenToCLient.

    Was ist nun Dein Problem aus diesen Koordinaten unterschiedliche Menüs zu ermitteln? Ich verstehe ehrlich gesagt Dein Problem nicht.



  • Oh Mann, ich weiss auch net wo ich die ganze Zeit hingeguckt hab, so klappts :

    void CDLG_MenueDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
    {
    	CMenu *pMenu = NULL;
    	pMenu = GetMenu ();
    
     	ScreenToClient (&point);
    	if (point.x < 218)
    	{	
    		ClientToScreen (&point);
    		pMenu = pMenu->GetSubMenu(0);	// Zeiger auf erstes Untermenü holen
    		pMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_LEFTBUTTON, point.x, point.y, this, NULL); // Popup-Menü anzeigen
    	}
    	else if (point.x > 218)
    	{	
    		ClientToScreen (&point);
    		pMenu = pMenu->GetSubMenu(1);	// Zeiger auf zweites Untermenü holen
    		pMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_LEFTBUTTON, point.x, point.y, this, NULL); // Popup-Menü anzeigen
    	}
    

    Danke nochmal für Deine bzw. Eure Mühe Martin + estartu 👍 😉
    sincerely 😉
    ShadowEater


  • Mod

    BTW:

    if (point.x < 218)
        {
    

    So was mag ich gar nicht. Ich versuche solche Sachen:
    1. allgemeiner zu fassen.
    2. eine zentrale Funktion HitTest zu bauen, die ich eben auch andersweitig verwende. Ich vermute diese Koordinaten werden nicht nur hierfür verwendet.


Anmelden zum Antworten