Popup-Menü Erstellen.



  • Hallo. Ich möchte gerne Ein pop-up Menü erstellen falls jemand die Rechte Maustaste in meiner Listbox control drückt. Nun, das habe ich so versucht..

    case WM_INITDIALOG:
            {
    
    		} break;
    
    	    case WM_RBUTTONDOWN:
    	    case WM_CONTEXTMENU:
    		    {
    			   printf("test\n");
    			   break;
    		    }
    
    			}
    

    So kann ich den Click abfangen, aber wie könnt ich überprüfen ob man Die Rechte Maustaste in der Listbox gedrückt hat? Ich möchte ja nicht immer ein Menü erstellen, lediglich falls man Die Rechte Maustaste in der Listbox gedrückt hat. Danke.



  • du must dir eine eigene Callback Procedur für deine Listbox erstellen.

    subclassing nennt man das glaube ich.



  • Hm, danke für deine Antwort, Ich dachte mir schon das ich sowas machen müsste. Wo kann ich eigentlich die Callback Nachricht für die Listbox Einstellen? z.B für mein tray menu ->

    ...uCallbackMessage = SWM_TRAYDATA;
    

    oder hab ich was Missverstanden? Alles erstelle ich über den resource editor btw.



  • eigendlich ist es egal wo du sie erstellst.
    in deiner classe für die listbox (fals du dir eine erstellt hast) oder in der main.cpp oder mach dir ne eigene datei dafür. wichtig ist nur, das du dort wo du callback procedur startest die datei auch eingebunden ist.



  • @rT!f@Ct schrieb:

    eigendlich ist es egal wo du sie erstellst.
    in deiner classe für die listbox (fals du dir eine erstellt hast) oder in der main.cpp oder mach dir ne eigene datei dafür. wichtig ist nur, das du dort wo du callback procedur startest die datei auch eingebunden ist.

    Nein, Ich habe lediglich ein dialog und eine Listbox per resource editor erstellt. Mit "wo" meinte ich eigentlich "wie". Ich weiß nicht wie ich der Listebox eine CallBack Nachricht Zuweisen kann.

    Grüße



  • Guten Morgen.

    Nun, bisschen zeit @ MSDN verbracht, und glaub das ich es gefunden habe, jedoch hab ich ein problem damit.

    http://msdn.microsoft.com/en-us/library/ms633570(VS.85).aspx

    INT_PTR CALLBACK dlgOp(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    
    	switch(uMsg) 
        {
    
    		case WM_INITDIALOG:
            {
    
    			hListBox = GetDlgItem(hWnd, ItemList);
    			wpOrigEditProc = (WNDPROC) SetWindowLong(hListBox, GWL_WNDPROC, (LONG)ListBoxPROC);
    			if(wpOrigEditProc == NULL)
    				MessageBox(hWnd, "Fail", "", 0);
    
    		} break;
    
    		case WM_COMMAND:
            {
    			int button = LOWORD(wParam);
                switch (button)
                {
    
    			}
    		} break;
    
    		default:
    		{
    
    			return FALSE;
    		}
    	}
    
    	return TRUE;
    }
    
    INT_PTR CALLBACK ListBoxPROC(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    
    	switch(uMsg) 
        {
    
    		case WM_INITDIALOG:
            {
    
    		} break;
    
    		    case WM_RBUTTONDOWN:
    		    case WM_CONTEXTMENU:
    		    {
    			   printf("test\n"); 
    			   break;
    		    }
    
    		case WM_COMMAND:
            {
    			int button = LOWORD(wParam);
                switch (button)
                {
    
    			}
    		} break;
    
    		default:
    		{
    
    			return FALSE;
    		}
    	}
    
    	return TRUE;
    
    }
    

    Das problem ist, sobald ich SetWindowLong wie oben benutze verschwindet die Listbox, bedanke mich für jede Hilfe.



  • Hi,
    ich glaub du hast das mit dem Subclasse bzw Fensterklassen noch nicht richtig verstanden.
    Jedes Fenster wird ja aus einer vorher registrierte Klasse erstellen, die eine Callback Funktion hat die immer dann aufgerufen wird wenn Windows eine Message für das Window hat.
    Du willste jetzt die schon vorhandene Funktion(von dem Editcontroll) durch deine eigene ersetzten, die bestimmte Messages (WM_RBUTTONDOWN, WM_CONTEXTMENU und WM_COMMAND) abfängt.
    Jetzt musst du aber die Message die du nicht bearbeitest wieder weiter an die orginal Funktion weiter geben sonst geht nichts mehr, wie das bei dir der Fall ist ;).
    Deswegen speicherste ja auch bei SetWindowLong() den return Wert (is die Adresse von der orginal Funktion :)).

    Das schreibste einfach am Ende deiner Funktion:

    return CallWindowProc(wpOrigEditProc, hwnd, uMsg, wParam, lParam);
    

    (ist dann für alle Messages die du nicht bearbeitest).

    Und für die die du bearbeitest schauste in die MSDN was du returnen solltest

    MSDN schrieb:

    WM_RBUTTONDOWN Notification

    Return Value
    If an application processes this message, it should return zero.

    So ich hoff mal das, dass einigermaßen verständlich ist(das mit dem erklären liegt mir ned so wirklich, leider 😞 ) und vorallem richtig :), fallst ned gebt bescheid ;).

    Dann mal schönen Tag noch
    Pingu


Anmelden zum Antworten