Fenster Handhabung



  • Hallo zusammen !!!

    Hier fragt mal wieder ein Anfänger !

    Nachdem ich jetzt einige Tutorials durch habe (tue mich zwar noch immer schwer
    aber es geht schon) hänge ich jetzt ein wenig in der Luft und zwar mit der
    Handhabung mit Eltern und Child Fenstern.
    Ich habe es aus den Tutorials auch nich richtig erlesen können wie die
    Richtige Habhabung damit ist.
    Ich wolle für mich zur Übung vollgenden Ablauf darstellen.
    Fenster ausgestattet mit TextOut "Kein Wert", und einem Button.
    Beim Click auf den Button soll sich das child fenster öffnen,
    ausgestattet mit Edit Feld und einem Button ->ins edit Feld ein Wert und
    auf Botton Click um den wert zu übernehmen.
    Dieser Wert soll dann ins Elternfenster dahin wo vorher "Kein Wert" steht.

    Da z.B. in einem Tutorial beide Fenster in der WINAPI geöffnet werden und in
    einem andern beschrieben wird, das die einzelnen Create Elemente auch nur
    Fenster sind können diese ja auch in der switch case funktion für das
    CreateWindow benutzt werden.
    Da ist mir der Ablauf nicht klar wie das zu handhaben ist.
    Ich hoffe ihr könnt mir da weiterhelfen.

    Gruß Wolfgang

    😮 😮 😮



  • hab leider nur die hälfte verstanden.

    also in der WINAPI WinMain, beschreibst du beide Fenster.

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       PSTR szCmdLine, int iCmdShow)
    {
       MSG        msg;
       HWND       hWnd;
       WNDCLASS   wc;
    
    //fenster 1
    
    wc.xxx
    .....
    RegisterClass(&wc)
    
    //fenster 2
    
    wc.xxx
    ......
    
    RegisterClass(&wc)
    
    //fenster 1 erstellen
    
    hwnd = CreateWindow(.......
                        .......)
    
    ShowWindow(hWnd, iCmdShow);
       UpdateWindow(hWnd);
    
       while (GetMessage(&msg, NULL, 0, 0))
       {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
       }
       return msg.wParam;
    }
    

    wenn du 2 fenster hast, brauchst du auch 2 callback funktionen

    callback fenter 1

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       static HWND    hChild;
    
    switch (message)
       {
       case WM_CREATE:
          {
    //fenster 2 erstellen
    
             hChild = CreateWindow(.....
                                     .....)
     case WM_DESTROY:
          {
             PostQuitMessage(0);
             return 0;
          }
       }
    
       return DefWindowProc(hWnd, message, wParam, lParam);
    }
    

    fenster 2 alles was im 2 fenster passiert hier rein

    LRESULT CALLBACK ChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
          switch (message)
       {
     case WM_DESTROY:
          {
             PostQuitMessage(0);
             return 0;
          }
       }
    
       return DefWindowProc(hWnd, message, wParam, lParam);
    }
    

    edit: vielleicht hilf dir die seite weiter, die is ganz nett
    http://www.win-api.de/



  • Hallo Adonis

    So habe jetzt mal de Code so zusammen geschoben wie in deinem Vorschlag.
    nur wie bekomme ich das Ferster auf ? mit ShowWindow (hwnd2, SW_SHOWNORMAL);
    komme ich nicht weiter ja ich weis immer die blöden Anfänger!!!

    #include <windows.h> 
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK ChildProc (HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow) 
    { 
    char szName[] = "Fensterklasse"; 
    char szName1[] = "Fensterklasse1";
    WNDCLASS wc; 
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = WndProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance = hI; 
    wc.hIcon = LoadIcon (NULL, IDI_WINLOGO); 
    wc.hCursor = LoadCursor (NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH) GetStockObject (LTGRAY_BRUSH); 
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = szName; 
    RegisterClass (&wc); 
    
    HWND hwnd = CreateWindow          // Fenster 1 
    ( 
        szName, 
        "Hauptfenster", 
        WS_OVERLAPPEDWINDOW, 
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
        NULL, 
        NULL, 
        hI, 
        NULL 
    ); 
    
    HWND hwnd2 = CreateWindow        // Fenster 2 
    ( 
        szName1, 
        "Eingabefenster", 
        WS_OVERLAPPEDWINDOW, 
        300, 500, 200, 200, 
        NULL, 
        NULL, 
        hI, 
        NULL 
    ); 
    
    ShowWindow   (hwnd, SW_SHOWNORMAL); 
    UpdateWindow (hwnd); 
    
    //----------------------------------------------------------------------------------- 
    
      MSG msg; 
      while (GetMessage (&msg, NULL, 0, 0)) 
      { 
        TranslateMessage (&msg); 
        DispatchMessage (&msg); 
      } 
    return msg.wParam; 
    } 
    
    //----------------------------------------------------------------------------------- 
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
    { 
        HDC hdc; 
        PAINTSTRUCT ps; 
        HWND hwndButton1;
    
        switch (message) 
        { 
        case WM_PAINT: 
            hdc = BeginPaint (hwnd, &ps); 
                TextOut (hdc, 30, 30, "Kein Wert", 9); 
            EndPaint (hwnd, &ps); 
        return 0; 
    
      case WM_CREATE : 
          hwndButton1 = CreateWindow ( "button", "Knopf 1", 
                                       WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
                                       150, 20, 100, 40, hwnd, NULL, 
                                       (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL); 
    
      return 0; 
    //--------------------------------------------------------------------------------------------
      case WM_COMMAND: 
    
      return 0;
    
    //--------------------------------------------------------------------------------------------
        case WM_DESTROY: 
            PostQuitMessage (0); 
        return 0; 
        } 
    
    return DefWindowProc (hwnd, message, wParam, lParam); 
    }
    //-------------------------------------------------------------------------------------------------------------------
    LRESULT CALLBACK ChildProc (HWND hwnd2, UINT message, WPARAM wParam, LPARAM lParam) 
    { 
        HDC hdc; 
        PAINTSTRUCT ps; 
        HWND hwndButton2;
    
        switch (message) 
        { 
        case WM_PAINT: 
            hdc = BeginPaint (hwnd2, &ps); 
                TextOut (hdc, 20, 20, "Bitte Wert eingeben !", 21); 
            EndPaint (hwnd2, &ps); 
        return 0; 
    
      case WM_CREATE : 
          hwndButton2 = CreateWindow ( "button", "Wert", 
                                       WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
                                       150, 20, 100, 40, hwnd2, NULL, 
                                       (HINSTANCE) GetWindowLong (hwnd2, GWL_HINSTANCE), NULL); 
    
      return 0; 
    
      case WM_COMMAND: 
          MessageBox(hwnd2,"AA", "So wär es richtig !!!", MB_OK); 
      return 0;
        case WM_DESTROY: 
            PostQuitMessage (0); 
        return 0; 
        } 
    
    return DefWindowProc (hwnd2, message, wParam, lParam); 
    }
    


  • mhh, also das bräuchtest ja nochmal fürs child

    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = WndProc; //hier dann childproc
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance = hI; 
    wc.hIcon = LoadIcon (NULL, IDI_WINLOGO); 
    wc.hCursor = LoadCursor (NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH) GetStockObject (LTGRAY_BRUSH); 
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = szName; //childklassenname
    RegisterClass (&wc);
    

    muss allerding nich soviel sein, sowas in der art würde auch reichen,
    einfach alles das nehmen was du brauchst

    wc.style	           = CS_HREDRAW|CS_VREDRAW;
        wc.hbrBackground       = (HBRUSH) GetStockObject(BLACK_BRUSH);
        wc.lpfnWndProc         = Childproc;
    	wc.lpszMenuName	    = NULL;
        wc.lpszClassName       = //szChildName;
    RegisterClass (&wc);
    

    createwindow fürs child würd ich in der winproc machen im WM_CREATE zweig

    und das, würd ich global machen

    char szName1[] = "Fensterklasse1";
    

    wenn es nich hinbekommst, kann ich es auch schnell umschreiben und
    markieren was ich geändert hab



  • Das Wäre super wenn du da machen würdest !!!
    Gruß



  • sollte laufen wenn du es copy pastest

    #include <windows.h> 
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); 
    LRESULT CALLBACK ChildProc (HWND, UINT, WPARAM, LPARAM); 
    
    char szName1[] = "Fensterklasse1"; //hier
    
    int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow) 
    { 
    char szName[] = "Fensterklasse"; 
    
    WNDCLASS wc; 
    
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = WndProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance = hI; 
    wc.hIcon = LoadIcon (NULL, IDI_WINLOGO); 
    wc.hCursor = LoadCursor (NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH) GetStockObject (LTGRAY_BRUSH); 
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = szName; 
    
    RegisterClass (&wc); 
    
    ////////hier geandert/////////////////////////////////
    wc.style               = CS_HREDRAW|CS_VREDRAW; 
    wc.hbrBackground       = (HBRUSH) GetStockObject(BLACK_BRUSH); 
    wc.lpfnWndProc         = ChildProc; 
    wc.lpszMenuName        = NULL; 
    wc.lpszClassName       = szName1; 
    
    RegisterClass (&wc); 
    /////////////////////////////////////////////////////
    HWND hwnd = CreateWindow          // Fenster 1 
    ( 
        szName, 
        "Hauptfenster", 
        WS_OVERLAPPEDWINDOW, 
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
        NULL, 
        NULL, 
        hI, 
        NULL 
    ); 
    
    ShowWindow   (hwnd, SW_SHOWNORMAL); 
    UpdateWindow (hwnd); 
    
    //----------------------------------------------------------------------------------- 
    
      MSG msg; 
      while (GetMessage (&msg, NULL, 0, 0)) 
      { 
        TranslateMessage (&msg); 
        DispatchMessage (&msg); 
      } 
    return msg.wParam; 
    } 
    
    //----------------------------------------------------------------------------------- 
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
    { 
        HDC hdc; 
        PAINTSTRUCT ps; 
        HWND hwndButton1, hwnd2; //hier
    
        switch (message) 
        { 
        case WM_PAINT: 
            hdc = BeginPaint (hwnd, &ps); 
                TextOut (hdc, 30, 30, "Kein Wert", 9); 
            EndPaint (hwnd, &ps); 
        return 0; 
    
      case WM_CREATE : 
          hwndButton1 = CreateWindow ( "button", "Knopf 1", 
                                       WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
                                       150, 20, 100, 40, hwnd, NULL, 
                                       (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL); 
    
    	  hwnd2 = CreateWindow        // hier
    								( 
    								szName1, 
    								"Eingabefenster", 
    								WS_OVERLAPPEDWINDOW|WS_VISIBLE//auf visible sonst sieht man es nich, 
    								300, 500, 200, 200, 
    								hwnd, 
    								NULL, 
    								NULL, 
    								NULL 
    );
    
      return 0; 
    //-------------------------------------------------------------------------------------------- 
      case WM_COMMAND: 
    
      return 0; 
    
    //-------------------------------------------------------------------------------------------- 
        case WM_DESTROY: 
            PostQuitMessage (0); 
        return 0; 
        } 
    
    return DefWindowProc (hwnd, message, wParam, lParam); 
    } 
    //------------------------------------------------------------------------------------------------------------------- 
    LRESULT CALLBACK ChildProc (HWND hwnd2, UINT message, WPARAM wParam, LPARAM lParam) 
    { 
        HDC hdc; 
        PAINTSTRUCT ps; 
        HWND hwndButton2; 
    
        switch (message) 
        { 
        case WM_PAINT: 
            hdc = BeginPaint (hwnd2, &ps); 
                TextOut (hdc, 20, 20, "Bitte Wert eingeben !", 21); 
            EndPaint (hwnd2, &ps); 
        return 0; 
    
      case WM_CREATE : 
          hwndButton2 = CreateWindow ( "button", "Wert", 
                                       WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
                                       150, 20, 100, 40, hwnd2, NULL, 
                                       (HINSTANCE) GetWindowLong (hwnd2, GWL_HINSTANCE), NULL); 
    
      return 0; 
    
      case WM_COMMAND: 
          MessageBox(hwnd2,"AA", "So wär es richtig !!!", MB_OK); 
      return 0; 
        case WM_DESTROY: 
            PostQuitMessage (0); 
        return 0; 
        } 
    
    return DefWindowProc (hwnd2, message, wParam, lParam); 
    }
    


  • Der schmeiß bei mir aber nen fehler aus und zwar hier :
    hwnd2 = CreateWindow // hier

    mit
    C:\Dev-Cpp\main.cpp In function `LRESULT WndProc(HWND__*, UINT, WPARAM, LPARAM)':



  • jo, sehe grad hinter WS_VISIBLE fehlt nen komma



  • Ja genau das war ja nicht der Sinn das Child fester soll ja erst beim
    klicken auf den button im ElternFenster aufgehen.
    So hatte ich es ja schon mit den Toturials hinbekommen !??!



  • Stop Hab schon natürlich muß das erst in die WM_COMMAND
    super vielen dank !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


Anmelden zum Antworten