C++ DialogBased Anwendungen



  • Hallo liebe Forumgemeinde.

    Habe eine dialogbasierte MFC-Anwendung in .Net 2003. Das Hauptdialogfenster ist modal. Durch einen Button in diesem Dialogfenster öffnet sich ein zweites Dialogfenster. Der ist jedoch nichtmodal, wird also über Create() aufgerufen. Nun möchte ich, dass das zweite Dialogfeld dem ersten untergeordnet ist, wie bei einer View-Anwendung alle Dialogfelder der View untergeordnet sind. Z.B. wenn man die größe der View ändert, werden die Dialogfelder abgeschnitten und nur der Teil angezeigt, den man durch die View noch sieht. Bei meiner dialogbasierten Anwendung funktioniert das nicht. Wie realisiere ich das dort.

    Danke für die Antworten,

    Gruß,

    Adam.



  • Das wäre sehr viel Handarbeit. Was fertiges ist mir nicht bekannt.
    Ich würde lieber auf eine MDI mit Formviews umsteigen. 🙂



  • Geht schon...
    du mußt den untergeordneten Dialog mit WS_CHILD erzeugen, und die Titelzeile komplett entfernen.

    Wenn du dem untergeordneten Dialog den Stil WS_CONTROL und dem übergeordneten WS_CONTROLPARENT gibst, kannst du durch"Tabben", anls wäre das ein einziger Dialog



  • Entschuldigung für die blöde Frage, aber bin MFC-Neuling. Wie vergebe ich die Stile?
    Der erste Dialog ist modal. Wird also über DoModal aufgerufen.
    WS_CONTROLPARENT kennt der irgendwie nicht, muss man das erst deklarieren.

    CKMRDlg dlg;
    	m_pMainWnd = &dlg;
    	INT_PTR nResponse = dlg.DoModal();
    

    Der zweite Dialog wird über Create aufgerufen.
    Im Header steht:

    private:
    	CKMSDlg* m_pDlg;
    // Implementierung
    

    Und in der Implemenitierungsdatei:

    CKMRDlg::CKMRDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CKMRDlg::IDD, pParent)
    {
    	EnableActiveAccessibility();
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    	m_pDlg = new CKMSDlg(this);
    }
    
    void CKMRDlg::OnNeuKms()
    {
    	m_pDlg->Create();
    	m_Menu = GetMenu();
    	m_Menu->EnableMenuItem(ID_NEU_KMS, MF_GRAYED);
    }
    

    Schreibe ich WS_CHILD in die Funktion Create, sagt er das sie keine Argumente annimmt.



  • Ok hab es gefunden in der Resource-Datei.

    WS_CONTROL kennt er nicht, auch WS_EX_CONTROL nicht.

    So sieht das bei mir jetzt aus,

    [cpp]IDD_KMR_DIALOG DIALOGEX 0, 0, 323, 199
    STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | DS_CENTER |
    WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE |
    WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
    EXSTYLE WS_EX_OVERLAPPEDWINDOW | WS_EX_CONTROLPARENT | WS_EX_STATICEDGE |
    WS_EX_APPWINDOW
    CAPTION "KMR"
    MENU IDR_MENU1
    FONT 8, "MS Shell Dlg", 0, 0, 0x1
    BEGIN
    PUSHBUTTON "Beenden",IDC_BEENDEN,67,181,50,14
    END

    IDD_KMS_DIALOG DIALOGEX 0, 24, 312, 242
    STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | WS_MINIMIZEBOX | WS_CHILD |
    WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
    CAPTION "KMS"
    FONT 8, "MS Sans Serif", 0, 0, 0x0
    BEGIN
    LISTBOX IDC_LIST2,9,21,292,176,LBS_SORT | LBS_NOINTEGRALHEIGHT |
    WS_VSCROLL | WS_TABSTOP
    PUSHBUTTON "Einstellungen",IDC_BUTTON2,129,211,50,14
    PUSHBUTTON "Schließen",IDC_BUTTON3,251,211,50,14
    CONTROL "Start",IDC_CHECK1,"Button",BS_AUTOCHECKBOX |
    BS_PUSHLIKE | WS_TABSTOP,9,211,50,14
    END[/cpp]

    aber ist immer noch nicht so wie ich es will, wenn ich es minimiere ragt die zweite Dialogbox über die zweite hinaus.
    😕



  • Ups, sorry, ist ein Dialog Style, also DS_CONTROL 🙂

    Du kannst das auch alles im Resourcen-Editor machen (mußt nicht direkt im .rc - File rumhacken)



  • Habs jetzt hingekriegt, WS_POPUP hat gestört, verträgt sich nicht mit WS_CHILD.
    Habs rausgenommen und jetzt funktionierts.
    Vielen dank für die Hilfe.
    Eine andere Frage neben bei. Wenn man das Fenster beim Aufruf als maximiert darstellt also

    ShowWindow(SW_MAXIMIZE);
    

    und die MaximierungsBox disabled, damit keiner das Fenster kleiner macht, dann maximiert er das Fenster so, das die Taskleiste verdeckt wird, aktiviert man die Maximize-Box wieder, maximiert er nur bis zur Taskleiste.

    Ist das ein Bug oder kann man das auch irgendwo einstellen.

    Danke nochmals.

    Gruß,

    Adam.


Anmelden zum Antworten