eine frage zu WM_COMMAND und eine frage zu create window



  • also, ich hab mich heute fleissig durch die msdn und die faqs durchgelesen, und hab mir so den einstieg in die winapi erarbeitet.

    erstmal die frage zu WM_COMMAND

    The high-order word specifies the notification code if the message is from a control. If the message is from an accelerator, this value is 1. If the message is from a menu, this value is zero.
    The low-order word specifies the identifier of the menu item, control, or accelerator.

    was das high order word ist, ist mir soweit klar,wenn ich mich nicht irre, ist da die nachricht ansich gespeichert, zb BN_CLICKED bei buttons,aber was ist das low order word? was für ein identifier ist das? und wie kann ich mit diesem identifier rauskriegen, von welchem element die nachricht nun kommt?

    nun zur zweiten frage:
    ich hab mir eine testklasse zum wrappen von registerclass und create windows gebastelt,sie sieht so aus:

    namespace Windows{
        class Window{
            private:
                HWND windowHandle;
            public:
                Window(WNDCLASSEX& window,std::string name,int topleftX,int topleftY,int width,int height,
                HWND parent=NULL,DWORD style=WS_CLIPCHILDREN|WS_VISIBLE,HMENU menu=NULL,HINSTANCE hInstance=GetModuleHandle(NULL),LPVOID lpParam=NULL){
                    if(!RegisterClassEx(&window)){
                        throw(Exception::Critical("couldn't register class",__LINE__,__FILE__));
                    }
                    windowHandle=CreateWindow(window.lpszClassName,name.c_str(),style,topleftX,topleftY,width,height,parent,menu,hInstance,lpParam);
                    if(!windowHandle){
                        throw(Exception::Critical("couldn't create window",__LINE__,__FILE__));
                    }
                }
                ~Window(){
                    DestroyWindow(windowHandle);
                }
                createChildWindow(std::string Type);
                HWND getHandle(){
                    return windowHandle;
                }
        };
    }
    

    das funktioniert auch soweit, wenn ich ein fenster auf diese art erstelle:

    WNDCLASSEX parentClass;
        parentClass.cbSize=sizeof(WNDCLASSEX);
        parentClass.style=CS_HREDRAW|CS_VREDRAW;
        parentClass.lpfnWndProc=WindowProc;
        parentClass.cbClsExtra=0;
        parentClass.cbWndExtra=0;
        parentClass.hInstance=GetModuleHandle(NULL);
        parentClass.hIcon=NULL;
        parentClass.hCursor=LoadCursor(NULL, IDC_ARROW);
        parentClass.hbrBackground=GetStockObject(LTGRAY_BRUSH);
        parentClass.lpszMenuName=NULL;
        parentClass.lpszClassName="ParentWindow";
        parentClass.hIconSm=LoadIcon(NULL, IDI_APPLICATION);
    
        Windows::Window parent(parentClass,"hallo",100,100,800,600);
    

    danach hab ich versucht ein childwindow-genauer gesagt einen button zu erstellen, und zwar so:

    WNDCLASSEX buttonClass;
        buttonClass.cbSize=sizeof(WNDCLASSEX);
        buttonClass.style=CS_HREDRAW|CS_VREDRAW;
        buttonClass.lpfnWndProc=DefWindowProc;
        buttonClass.cbClsExtra=0;
        buttonClass.cbWndExtra=0;
        buttonClass.hInstance=GetModuleHandle(NULL);
        buttonClass.hIcon=NULL;
        buttonClass.hCursor=LoadCursor(NULL, IDC_ARROW);
        buttonClass.hbrBackground=NULL;
        buttonClass.lpszMenuName=NULL;
        buttonClass.lpszClassName="BUTTON";
        buttonClass.hIcon=NULL;
        Windows::Window button(buttonClass,"click mich",0,0,100,100,parent.getHandle(),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON);
    

    leider klappte das nicht,es wurde zwar keine exception ausgelöst,aber ich konnte den Button nicht sehen,schlussendlich klappte es nur so sondern nur so:

    RegisterClassEx(&buttonClass);
        CreateWindowEx(0,"BUTTON","click mich",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,0,0,100,100,parent.getHandle(),NULL,GetModuleHandle(NULL),NULL);
    

    hab nu alles überprüft, jeden parameter,teilweise sogar 3mal, ich hab bestimmt irgendeinen dummen fehler gemacht, den ihr WinAPI pros auf den ersten blick seht(hoffe ich zumindest^^).
    ps: die WinAPI ist komisch 😃

    //edit design gerettet^^



  • otze schrieb:

    was ist das low order word? was für ein identifier ist das? und wie kann ich mit diesem identifier rauskriegen, von welchem element die nachricht nun kommt?

    Du kannst beim Erstellen deiner Child-Windows bei HMENU eine ID angeben, die du dort wiederfindest 😉

    otze schrieb:

    RegisterClassEx(&buttonClass);

    Die Button-Klasse ist bereits vom System registriert - du brauchst sie einfach nur zu benutzen!



  • ok,das erste is klar,hmenu hab ich bei der msdn wohl überlesen, weil ichs wohl mit einem menü wie es im programmen vorkommt assoziiert hab 🙄

    ich sags nochmal: die WinAPI ist komisch 😃

    nun zum 2. hmm ok, ich akzeptiere mal,dass das objekt schon registriert ist^^
    natürlich finde ich das nich ganz so dolle, da ich eigentlich die einzelnen elemente nur so zur übung(und zur bessren benutzbarkeit) wrappen wollte, sodass der button selber weis, ob er geklickt wurde oder nicht,wenn ich das über die callbackschleife nicht machen kann(ich hab mir dazu mal die sache mit den callbackfunktionen in einzelnen klassen in der faq angeschaut),muss ich wohl immer den parent fragen, ob der button geklickt ist oder nicht,und das ist doof 😞



  • Das im Parent zu machen wäre eben der einfacherer Weg, ansonsten müsstest du eben das Control subclassen bzw. dir mir Super-Classing eine eigene auf der Standard-Klasse beruhende Fensterklasse registrieren 😉



  • wovon redest du da grad?^^





  • danke, das gefällt mir viel besser :),monitoring war genau das, was ich gesucht hab :),flenders, you are my hero 🙂

    //edit subclassing is aber wirklich nicht so schwierig,die sache mit dem parent fragen war definitiv mehr code 🙄


Anmelden zum Antworten