control identifier bei WS_POPUP



  • Hi,

    habe folgendes Problem:
    Ich rufe in meinem Programm n Dialog auf. Das klappt auch alles usw. Jetzt soll aber bei einer bestimmten Aktion ein Popup Fenster erscheinen.

    hPopup = CreateWindowEx(0, WC_LISTBOX, "", WS_POPUP | WS_BORDER | LBS_STANDARD, rc.left, rc.top, rc.right, rc.bottom, hWnd, NULL, hInstance, NULL);
    

    Das funktioniert auch... Wie man sieht is das Popup also ne Listbox. Jetzt will ich halt dass wenn man die Listbox anklickt dass dann was gemacht wird. Problem is wie kann ich die Nachrichten ohne Control Identifier abfangen?
    Normalerweise in der DlgProc ja so:

    case WM_COMMAND:
     switch(LOWORD(wParam))
     {
       case : //Hier würde jetzt der Control identifier stehen
        switch(HIWORD(wParam))
        {
         case LBN_SETFOCUS:
         //irgendwelcher code...
         break;
         case LBN_KILLFOCUS:
         //irgendwelcher code...
         break;
        }
       break;
     }
    break;
    

    Problem is dass ich den nich setzen kann, weil:
    http://msdn.microsoft.com/en-us/library/ms632680%28VS.85%29.aspx
    Ich zitiere:
    "hMenu [in, optional]

    Type: HMENU

    A handle to a menu, or specifies a child-window identifier, depending on the window style. For an overlapped or pop-up window, hMenu identifies the menu to be used with the window; it can be NULL if the class menu is to be used. For a child window, hMenu specifies the child-window identifier, an integer value used by a dialog box control to notify its parent about events. The application determines the child-window identifier; it must be unique for all child windows with the same parent window."

    heißt also wenn WS_POPUP gesetzt ist, dann muss hMenu ein gültiges menu handle sein, bei WS_CHILD kann es n control identifier sein... (setzte ich bei meinem CreateWindowEx call WS_CHILD statt WS_POPUP klappt das auch).
    Ich will aber gar kein Menü haben und halt einfach ne zahl reinschreiben klappt auch nich, denn das Popup wird nur erstellt wenn das auch n vorhandenes Menu Handle is (oder eben NULL).
    Was kann ich jetzt machen?
    Hatte gedacht man kann irgendwie mit CreateMenu() einfach n leeres Menu übergeben aber das klappt nicht. Dann hab ich noch an subclassing gedacht aber das muss doch irgendwie gehen?!

    Thx für jede Hilfe...



  • An deiner Stelle würde ich mir nen Dialog bauen, der vorgeblendet wird (modal oder nicht-modal - musste abwägen, was günstiger ist). Dann hätte deine Listview einen vernünftigen Parent und könnte nen Identifier besitzen, über den du Events abfangen kannst.



  • ... und mit Dialog meine ich einen ohne TitleBar und Border...


  • Mod

    Oder benutze ein eigenes Parent. Es ist nun mal, so dass ein Child COntrol immer nur WM_COMMMAND Nachrichten an das Parent sendet.



  • kannst du mir das mit dem eigenen parent erklären? also ich weiß es gibt die funktion SetParent... aber dann müsste die ja auch ne extra message procedure haben oder?

    n code example wäre hilfreich...


  • Mod

    Ich meine nicht SetParent. Bei CreateWindow wird ein Parent für WS_CHILD mit angegeben.

    Schau Dir einfach mal Windows Tutorials an... oder lies den Petzold.



  • ja is mir klar... den hab ich ja auch bei meinem Aufruf angegeben (siehe post 1). hWnd ist das window handle von meinem dialog. Das ist ja auch nicht das Problem. WM_COMMAND messages kriege ich ja auch... aber der control identifier (also LOWORD(wParam)) is eben 0 und da ich mehrere dieser popups in einem dialog benutze muss ich die irgendwie unterscheiden können



  • Warum nimmst du denn nicht den Vorschlag von "a" an, also erstellst einen Dialog mit einem Resourceneditor, fügst eine Listbox hinzu und erstellst statt des Controls den Dialog.
    In dessen Callbackfunktion kannst du alles machen, Nachrichten an das Hauptfenster senden, Funktonen direkt aufrufen etc.
    Alo entweder modal mit DialogBox (eine Unterscheidung mit DialogBoxParam möglich) oder nicht-modal mit CreateDialog (zusätzliche [selbstdefinierte] Nachrichten können im Anschluss gesendet werden).


  • Mod

    1700 schrieb:

    WM_COMMAND messages kriege ich ja auch... aber der control identifier (also LOWORD(wParam)) is eben 0 und da ich mehrere dieser popups in einem dialog benutze muss ich die irgendwie unterscheiden können

    Ein Fenster ist entweder ein Popup und hat ein Menu oder es ist ein Child und es hat ein ControlID. Das kannst Du unschwer der Doku entnehmen. CreateWindow
    http://msdn.microsoft.com/en-us/library/ms632679(VS.85).aspx
    (siehe hMenu Parameter)

    Auch das nächträgliche setzen würde nicht gehen siehe SetWindowLong
    http://msdn.microsoft.com/en-us/library/ms633591(VS.85).aspx

    Die Lösung ist Dir bereits mehrfach anempfohlen worden.


Anmelden zum Antworten