Modelss Dialogs in MDI Applikation



  • Erste Frage - wie erstelle ich das Child Window NON-sizable?

    void CreateMULDIVWindow()
    {
    	WNDCLASS wndclass;
    	wndclass.style         = CS_HREDRAW | CS_VREDRAW;
    	wndclass.lpfnWndProc   = MULDIVProc ;
    	wndclass.cbClsExtra    = 0;
    	wndclass.cbWndExtra    = 0;
    	wndclass.hInstance     = H;
    	wndclass.hIcon         = LoadIcon(0, IDI_APPLICATION);
    	wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW);
    	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    	wndclass.lpszMenuName  = 0;
    	wndclass.lpszClassName = L"MULDIV";
    	RegisterClass(&wndclass);
    	MDICREATESTRUCT mdicreate;
    	mdicreate.szClass = L"MULDIV";
    	mdicreate.szTitle = L"Find MUL and DIV coefficients";
    	mdicreate.hOwner  = H;
    	mdicreate.x       = CW_USEDEFAULT;
    	mdicreate.y       = CW_USEDEFAULT;
    	mdicreate.cx      = 300;
    	mdicreate.cy      = 300;
    	mdicreate.style   = WS_BORDER; // hab das probiert, es funzt leider nicht!
    	mdicreate.lParam  = 0;
    	hMULDIV = (HWND)SendMessage(hClient, WM_MDICREATE, 0, (LPARAM) (LPMDICREATESTRUCT)&mdicreate);
    }
    


  • Zweite Frage - wie wird das Dialog genau das Childwindow füllen?


  • Mod

    MDI Child sind IMHO immer sizable.

    Du kannst das ganze aber kontrllieren indem Du WM_NCCALCSIZE bzw. WM_GETMINMAXINFO behandelst.



  • Darf ich mich die Aufgabe vereinfachen, indem ich nur WM_SIZE behandle?



  • Und noch was - warum funzt die TAB Taste im Dialog nicht? Normalerweise muss die nächste Kontrolle Focus haben... 😞


  • Mod

    Weil Du in der WinAPI ales selbst machen musst? 😉

    Du musst in die MessageLoop für diesen Fall IsDialogMessage einbauen. Nur dadurch werden die dialogspezifischen Funktionen der Tastatur eingebaut.



  • Du meinst, dass ich

    if (hDlgModeless == 0 ¦¦ !IsDialogMessage (hDlgModeless, &msg))
    

    im Main Loop schreiben muss? Und was mach ich, wenn ich mehrere Dialogs habe?



  • Entschuldigung, aber diese IsDialogMessage funzt nur wenn ich genau 1 Dialog vom diesen Typ erzeugt habe. Nehmen wir nun an, dass sei jetzt kein Problem.
    Aber was mache ich, wenn ich mehrere andere Dialogs erstelle? Ich verstehe nicht wie man überhaupt Win32 API in der Praxis benutzen kann, wenn es keine einfache Situationen wie diese nicht lösen können! 👎 😡


  • Mod

    Du musst eine eigene Verwaltung aufbauen.
    Warum nimmst Du nicht die MFC. Die nimmt Dir alles das ab...

    Du hast mehrere MDI Child Windows, aber nur eines ist aktiv. Nur an den Dialog das in dem aktiven MDI Child Dialog liegt musst Du die Nachrichten an IsDialogMessage weiterleiten.

    Das geht mit beliebig vielen Fenstern, nur musst Du selbst eine entsprechende Verwaltung dafür aufbauen...



  • Das

    case WM_CREATE:
    	case WM_MDIACTIVATE:
    		hMDIChild = hwnd;
    		return 0;
    

    funzt nicht. Wenn das Child Window erstellt wird, funzt die TAB Taste nicht mehr...


  • Mod

    Und was soll mit dieser Code sagen?
    1. Würde ich sagen, da fehlt ein break; im WM_CREATE!
    2. Du benötigst das andle des Dialoges, nicht des MDI Child windows.

    Wie ich schon schrieb: Du benötigst eine Verwaltung für die Handles, die Du verwendest. Oder Du besorgst Die das Handle des eingebetteten Dialog mit der Funktion GetWindow... Es gibt viele Wege zum Ziel.


Anmelden zum Antworten