in WM_CREATE Childfenster erzeugen lassen geht nicht (MASM32)



  • Hallo,

    ich möchte in meiner Win Anwendung bei Abarbeitung der WM_CREATE Nachricht
    ein Childfenster erzeugen.

    hier mal die WndProc:

    WndProc proc hWin :DWORD,
    uMsg :DWORD,
    wParam :DWORD,
    lParam :DWORD

    .if uMsg == WM_DESTROY

    invoke PostQuitMessage,NULL
    mov eax, 0
    ret

    .elseif uMsg == WM_LBUTTONDOWN

    invoke CreateWindowEx,WS_EX_LEFT,
    addr szedit,
    NULL,
    WS_CHILD or WS_VISIBLE or WS_BORDER or ES_MULTILINE,
    20, 20, 240, 190,
    hWnd,NULL,
    hInstance,NULL
    mov edithwnd, eax

    .elseif uMsg== WM_COMMAND

    .elseif uMsg == WM_CREATE

    invoke CreateWindowEx,WS_EX_LEFT,
    addr szedit,
    NULL,
    WS_CHILD or WS_VISIBLE or WS_BORDER or ES_MULTILINE,
    20, 20, 240, 190,
    hWnd,NULL,
    hInstance,NULL
    mov edithwnd, eax

    .endif

    invoke DefWindowProc,hWin,uMsg,wParam,lParam
    ret

    WndProc endp

    WM_LBUTTONDOWN und WM_CREATE enthalten die selbe Funktion.
    Jedoch wird das Fenster (Edit) nur bei einem Mausklick erstellt und angezeigt.
    Wenn ich in WM_CREATE eine MessageBox aufrufe macht er das anstandslos, also wird WM_CREATE durch das Fenster verarbeitet.

    Hab ich wieder was vergessen?

    Nicky



  • Bei einer so speziellen Kombination, WinAPI+masm+MASM32+Anfänger, solltest du dich besser an folgende Adresse wenden:
    www.masmforum.com



  • Ohne mich jetzt ausgiebig mit MASM (vor allen Dingen nicht in Verbindung mit der WinAPI) beschäftigt zu haben: Was ist hWnd ? Vermutlich eine globale Variable, die mit dem Returnwert von CreateWindow initialisiert wird.
    Das Problem hierbei ist, dass WM_CREATE noch innerhalb von CreateWindow gesendet und nicht der Messageque hinzugefügt wird.

    Stattdessen sollest du das Handle nehmen, das dir durch den ersten WndProc-Parameter (hWin soweit ich das sehe) übergeben wird.



  • Hallo,

    Ja, in hWnd ist das Handle des Hauptfensters enthalten.
    Was mir spontan einfällt, ich könnte WM_CREATE nach der Erstellung des Hauptfensters nocheinmal senden (was aber nicht unbedingt Sinn der Sache ist).
    Bei allen Fensteranwendungen in C werden die Childfenster in der WM_CREATE Nachricht erstellt und es scheint zu laufen.

    Ich arbeite z.Z. mit dem Petzold, also große Unterschiede zu C sind nicht vorhanden.

    @masm
    Die Buchstaben in einer anderen Reihenfolge, währen bestimmt ein gute Antwort geworden. Alle Programme die ich erstellt habe, laufen auch. Ich möchte nur etwas mehr Ordnung in den Code bringen.

    Gruß,

    Nicky



  • Dein Code in C:

    HWND ghwnd;
    int WINAPI WinMain(...)
    {
      ...
      ghwnd = CreateWindow(....);
      ...
    }
    
    LRESULT CALLBACK MsgProc(HWND hwnd, UINT msg, ...)
    {
      switch(msg)
      {
        case WM_CREATE:
          // hier ghwnd zu nutzen ist falsch, richtig wäre es, hwnd zu nutzen
      }
    ...
    }
    


  • Ich brauch doch aber das Handle des Elternfensters als Parameter.

    hier mal ein Auszug aus einem C-Programm von Herrn C. P.

    in der WinMain:

    hwnd = CreateWindow (szAppName, TEXT ("Varianten von Kontrollelementen"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, NULL, hInstance, NULL) ;

    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ;

    Und hier der erste Teil der WndProc Funktion mit der Nachricht WM_CREATE_

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    static HWND hwndButton[NUM] ;
    static RECT rect ;
    static TCHAR szTop[] = TEXT ("Nachricht wParam lParam"),
    szUnd[] = TEXT ("_________ ______ ______"),
    szFormat[] = TEXT ("%-16s%04X-%04X %04X-%04X"),
    szBuffer[50] ;
    static int cxChar, cyChar ;
    HDC hdc ;
    PAINTSTRUCT ps ;
    int i ;

    switch (message)
    {
    case WM_CREATE :
    cxChar = LOWORD (GetDialogBaseUnits ()) ;
    cyChar = HIWORD (GetDialogBaseUnits ()) ;

    for (i = 0 ; i < NUM ; i++)
    hwndButton[i] = CreateWindow ( TEXT("button"),
    button[i].szText,
    WS_CHILD | WS_VISIBLE | button[i].iStyle,
    cxChar, cyChar * (1 + 2 * i),
    20 * cxChar, 7 * cyChar / 4,
    hwnd, (HMENU) i,
    ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
    return 0 ;

    Herr P. macht es doch genauso 🙂 und die Programme von der CD laufen auch.
    Vielleicht ist das ja aber mal ein Unterschied zu Assembler.

    Wie gesagt, mein Programm läuft ja. Manche Sachen wundern mich halt schon...

    Nicky



  • Es wird ja auch der Parameter genommen, der der MsgProc übergeben wird:

    LRESULT CALLBACK WndProc HWND hwnd /*der da*/, UINT message, WPARAM wParam, LPARAM lParam)
    {
    }
    

    Wie geschrieben, in deinem Beispiel solltest du also hWin nehmen...

    Das globale Handle ist im WM_CREATE-Zweig nicht gültig.



  • Nu hats gerappelt...

    ich schreibe mal um und melde mich später....

    Danke

    Nicky



  • Hallo Hmmh,

    Fenster werden nun erzeugt... Hab mich wohl zu sehr auf hWnd versteift.

    Danke

    Nicky


Anmelden zum Antworten