Fenster im Fenster?



  • hallo

    habe hier ein kleines problem.

    ich möchte in meinem hauptfenster zwei weitere kleine fenster haben. diese fenster sollen sich nur im hauptfenster bewegen lassen (so wie z.b. bei Excel).

    habe dies auch mit dem unten stehenden programm erreicht, nur wenn ich das eine fenster über das andere bewegen und dann das untere beiseite ziehe, bekomme ich einen grafikfehler im fenster (das äußert sich so, dass ich reste vom ersten fenster im zweiten sehe).

    weiterhin verstehe ich nicht warum, wenn ich eines der kleinen fenster anklicke, die obere leiste nicht blau wird (blau für aktives fenster), sondern grau bleibt?

    thx slower

    #include <windows.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK Child1Proc(HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK Child2Proc(HWND, UINT, WPARAM, LPARAM);
    
    const char szChild1Name[] = "Optionsmenü";
    const char szChild2Name[] = "Simulation";
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
       static TCHAR szAppName[] = TEXT ("Klassenname");
       HWND            hwnd;
       MSG             msg;
       WNDCLASSEX      wc;
    
       wc.cbSize        = sizeof(WNDCLASSEX);
       wc.style         = CS_HREDRAW | CS_VREDRAW;
       wc.lpfnWndProc   = WndProc;
       wc.cbClsExtra    = 0;
       wc.cbWndExtra    = 0;
       wc.hInstance     = hInstance;
       wc.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
       wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
       wc.hbrBackground = (HBRUSH) GetStockObject (GRAY_BRUSH);
       wc.lpszMenuName  = NULL;
       wc.lpszClassName = szAppName;
       wc.hIconSm       = wc.hIcon;
    
       RegisterClassEx (&wc);
       wc.hbrBackground       = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
       wc.hIcon               = NULL;
       wc.lpfnWndProc         = Child1Proc;
       wc.lpszClassName       = szChild1Name;  
       RegisterClassEx(&wc);  
       wc.hbrBackground       = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
       wc.hIcon               = NULL;
       wc.lpfnWndProc         = Child2Proc;
       wc.lpszClassName       = szChild2Name;
       RegisterClassEx(&wc);
    
       hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW, // erweiterter Fensterstil
                      szAppName, // Name der Fensterklasse
                      TEXT ("JigSim"), // Fenstertitel
                      WS_OVERLAPPEDWINDOW, // Fensterstil
                      100, // X-Position des Fensters                      
                      60, // Y-Position des Fensters       
                      850, // Fensterbreite                 
                      600, // Fensterhöhe                
                      NULL, // übergeordnetes Fenster
                      NULL, // Menü           
                      hInstance, // Programm-Kopiezähler (Programm-ID)            
                      NULL); // zusätzliche Parameter
    
       ShowWindow (hwnd, iCmdShow);
       UpdateWindow (hwnd);
    
       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 hButton;
       HWND hChild1;
       HWND hChild2;
       POINT  point;
    
       switch (message)
       {
       case WM_CREATE:
          hChild1 = CreateWindow(  szChild1Name,
                                      NULL,
                                      WS_CHILD | WS_VISIBLE |  WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
                                      600,
                                      26,
                                      200,
                                      500,
                                      hwnd,
                                      NULL,
                                      ((LPCREATESTRUCT) lParam)->hInstance,
                                      NULL);
    
          hChild2 = CreateWindow(  szChild2Name,
                                      NULL,
                                      WS_CHILD | WS_VISIBLE |  WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
                                      100,
                                      100,
                                      400,
                                      300,
                                      hwnd,
                                      NULL,
                                      ((LPCREATESTRUCT) lParam)->hInstance,
                                      NULL);
    
          hButton = CreateWindow(  "button",
                                      "Beenden",
                                      WS_CHILD | WS_VISIBLE |BS_PUSHBUTTON,
                                      30, 30, 100, 30,
                                      hChild1,
                                      (HMENU)102,
                                      ((LPCREATESTRUCT) lParam) -> hInstance,
                                      NULL);
    
          return (0);
    
       case WM_COMMAND:
          switch (LOWORD(wParam))
          {     
             case 102:
                PostQuitMessage (0);
                return (TRUE);
    
          default:
             break;
          }
    
       case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps);
          //TextOut (hdc, 0, 0, "test", 27);
          EndPaint (hwnd, &ps);
          return (0);
    
       case WM_CONTEXTMENU: 
    
          return 0;
    
       case WM_KEYDOWN:                
          switch (wParam)
          {    
             case VK_ESCAPE:
                PostQuitMessage (0);
                break ;
             }
             return 0 ;
    
       case WM_DESTROY:
          PostQuitMessage (0);
          return (0);
       }
    
       return DefWindowProc (hwnd, message, wParam, lParam);
    }
    
    LRESULT CALLBACK Child1Proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
       switch (message)
       {
       case WM_COMMAND:
          switch (LOWORD(wParam))
          {     
             case 102:
                PostQuitMessage (0);
                return (TRUE);
    
          default:
             break;
          }
       case WM_SIZE:
          {
    
             return 0;
          }
    
       case WM_LBUTTONDOWN:
          {
    
             return 0;
          }
    
       case WM_PAINT:
          {
             HDC          hDC;
             PAINTSTRUCT  ps;
    
             hDC = BeginPaint(hwnd, &ps);
    
             EndPaint(hwnd, &ps);
             return 0;
          }
       }
       return DefWindowProc(hwnd, message, wParam, lParam);
    }
    
    LRESULT CALLBACK Child2Proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
       switch (message)
       {
       case WM_COMMAND:
          switch (LOWORD(wParam))
          {     
             case 102:
                PostQuitMessage (0);
                return (TRUE);
    
          default:
             break;
          }
       case WM_SIZE:
          {
    
             return 0;
          }
    
       case WM_LBUTTONDOWN:
          {
    
             return 0;
          }
    
       case WM_PAINT:
          {
             HDC          hDC;
             PAINTSTRUCT  ps;
    
             hDC = BeginPaint(hwnd, &ps);
    
             EndPaint(hwnd, &ps);
             return 0;
          }
       }
       return DefWindowProc(hwnd, message, wParam, lParam);
    }
    


  • eigentlich sollte doch so die standart vorgehensweise bei einem Programm sein, wo fenster im fenster benötigt werden, oder?

    viellecht ist diese anfängerfrage ja auch zu einfach, habe aber immernoch keine lösung 😞 ...



  • Ich weiß nicht genau, was du vorhast, aber schau dich mal hier um: Multiple Document Interface (MDI)



  • ja danke, das meine ich

    habe jetzt folgendes versucht:

    hChild1 = CreateWindowEx(  WS_EX_MDICHILD,
                                      szChild1Name,
                                      NULL,
                                      WS_CHILD | WS_VISIBLE |  WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_SIZEBOX,
                                      600,
                                      26,
                                      200,
                                      500,
                                      hwnd,
                                      NULL,
                                      hInstance,
                                      NULL);
    

    und

    hChild1 = CreateMDIWindow(  szChild1Name,
                                      NULL,
                                      WS_CHILD | WS_VISIBLE |  WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_SIZEBOX,
                                      600,
                                      26,
                                      200,
                                      500,
                                      hwnd,
                                      hInstance,
                                      NULL);
    

    aber in beiden fällen wird das fenster nicht angezeigt, fehlt da noch was?



  • Using the Multiple Document Interface
    Da findest du Beispiel-Code 😉



  • slower schrieb:

    aber in beiden fällen wird das fenster nicht angezeigt, fehlt da noch was?

    bei den fenstern noch als style WS_VISIBLE angeben dann sieht man die auch 😉



  • Du gucken hier: http://www.c-plusplus.net/forum/viewtopic.php?t=16727&highlight=mdi

    ... MDI ist sehr gut. Mach's einfach. 🙂



  • ok danke, jetzt gehts 👍


Anmelden zum Antworten