MDI - Warum geht es nicht?



  • Hi!
    Ja, ich habe schon die Suchfunktion benutzt - aber da kam ich auch nicht viel weiter.

    Hier werden die Klassen registriert:

    WNDCLASSEX wcex;
    
    	wcex.cbSize         = sizeof(WNDCLASSEX); 
    
    	wcex.style			= CS_HREDRAW | CS_VREDRAW;
    	wcex.lpfnWndProc	= (WNDPROC)WndProc;
    	wcex.cbClsExtra		= 0;
    	wcex.cbWndExtra		= 0;
    	wcex.hInstance		= hInst;
    	wcex.hIcon			= LoadIcon  (hInst, (LPCTSTR)IDI_MAINLARGE);
    	wcex.hCursor		= LoadCursor(NULL,  IDC_ARROW);
    	wcex.hbrBackground	= CreateSolidBrush( RGB(128, 128, 128) );
    	wcex.lpszMenuName	= (LPCSTR)IDR_MAINMENU;
    	wcex.lpszClassName	= MainClassName;
    	wcex.hIconSm		= LoadIcon  (hInst, (LPCTSTR)IDI_MAINSMALL);
    
    	if (!RegisterClassEx(&wcex))
    		return FALSE;
    
    	//--------
    
    	wcex.lpfnWndProc    = (WNDPROC)MapWindowProc;
    	wcex.lpszClassName  = MapClassName;
    	wcex.lpszMenuName	= NULL;
    
    	if (!RegisterClassEx(&wcex))
    		return FALSE;
    
    	//--------
    
    	return TRUE;
    

    Hier wird das MDIClient-Control erstellt:

    CLIENTCREATESTRUCT ccs;
    	ccs.hWindowMenu  = GetSubMenu(GetMenu(hWnd), 0);
    	ccs.idFirstChild = 1000;
    
    	hMDIClient = CreateWindow("MDICLIENT",
    		                      "",
    							  WS_CHILD | WS_CLIPCHILDREN | WS_HSCROLL | WS_VSCROLL | WS_VISIBLE,
    							  150,
    							  0,
    							  440,
    							  480,
    							  hWnd,
    							  NULL,
    							  hInst,
    							  &ccs);
    

    Hier wird das Fenster erstellt (Name der Klasse stimmt)

    MDICREATESTRUCT mcs;
    	mcs.x      = 10;
    	mcs.y      = 10;
    	mcs.cx     = width;
    	mcs.cy     = height;
    	mcs.hOwner = App->hInst;
    	mcs.style  = WS_CHILD | WS_VISIBLE |  WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;
    	mcs.szClass= MapClassName;
    	mcs.szTitle= Caption;
    	mcs.lParam = NULL;
    
    	MessageBox(NULL, MyClassName, Caption, 64);
    
    	Handle = (HWND) SendMessage (ParentHandle, WM_MDICREATE, 0, 
                 (LONG) (LPMDICREATESTRUCT) &mcs);
    
    	if (!Handle) MessageBox(NULL, "Fenster kann nicht erstellt werden","Fehler",16);
    	if (!Handle) return;
    

    Dennoch bekomme ich den Fehler, dass das Fenster nicht erstellt werden konnte..

    Oder muss hier noch was rein?

    LRESULT CALLBACK MapWindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
    	return false;
    }
    


  • Ich glaub ich sollte mir mal ne Brille kaufen. Zu bekloppt x.x

    default:
       return DefMDIChildProc(hWnd, message, wParam, lParam);
    

    Mit dem sollte es dann doch gehen...

    Thread kann geschlossen / gelöscht (whatever) werdeen.



  • Wenn du in der WindowProc-Funktion ständig 'false' zurück gibst brauchst du dich nicht wundern wenn es nicht funktioniert 😉

    So sollte es funktionieren; wenn nicht, dann muss es noch wo anders Fehler geben.

    LRESULT CALLBACK MapWindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
      switch (message)
      {
      /*case:
      .
      .
      .*/
      case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
      }
      return DefFrameProc(hWnd, hWndClient, message, wParam, lParam);
    }
    

Anmelden zum Antworten