Standarddialog - CFileDialog/Button hinzufügen???



  • hi, kann mir jemand sagen wie man das macht??? ich hab versucht die OnInitDialog zu überschreiben funktioniert nur so leideer nicht!?

    virtual BOOL CTest::OnInitDialog()
    {
             CFileDialog::OnInitDialog();
             CButton but;
    	but.Create("na",WS_CHILD | WS_VISIBLE|BS_PUSHBUTTON,CRect(60,200,138,240),GetOwner(),1);
    	return true;
    }
    

    MfG Dohan



  • eine ausführliche erklärung gibts im buch "inside visual c++ 6.0" von microsoft press, isbn 3-86063-461-5

    ich zitiere ab seite 151:

    **
    verschachtelte dialogfelder:
    **

    unter win32 können dialogfelder so ineinander verschachtelt werden, dass mehrere dialogfelder wie eine einheit erscheinen.
    sie müssen zuerst eine dialogressourcenvorlage mit einer "öffnung" - normalerweise ein gruppenfeld - und der speziellen, für untergeordnete fenster reservierten fensterid: stc32 (=0x045f) erstellen.
    ihr programm gibt einige parameter an, die COMDLG32 mitteilen, wie ihre vorlage zu verwenden ist. zudem muss ihr programm eine verbindung zur COMDLG32-Nachrichtenschleife herstellen, damit es die gewünschten benachrichtigungen zuerst empfängt. sie werden nach der ausführung dieser schritte schliesslich feststellen, dass sie ein dialogfeld erstellt haben, das ein untergeordnetes fenster des COMDLG32-dialogfeldfensters ist, obwohl ihre vorlage die COMDLG32-Vorlage überschreibt.
    das hört sich kompliziert an, und das ist es auch, sofern sie nicht mit der mfc-bibliothek arbeiten. senn sie die mfc-bibliothek verwenden, erstellen sie die dialogressourcenvorlage so wie oben beschrieben, leiten eine klasse von der standarddialogfeldklasse ab, fügen klassenspezifische verbindungscode in OnInitDialog ein,und verwenden dann den klassenassistenten, um nachrichtenbehandlungsroutinen für die neuen steuerelemente ihrer dialogvorlage zu generieren.

    Ein Beispiel mit CFileDialog

    in diesem beispiel leiten sie eine klasse ab, die die schaltfläche "alle entsprechenden dateien löschen" in das standarddialogfeld für dateioperationen einfügt.
    sie ändert auch den dialogfeldtitel und die beschriftung der schaltfläche "öffnen" in "löschen".
    dieses beispiel illustriert, wie mit hilfe verschachtelter dialogfelder standarddialoge mit neuen steuerelementen ausgestattet werden können.
    das dialogfeld wird durch drücken der linken maustaste aktiviert, währen sich der zeiger im ansichtsfenster befinden.

    **1. Fürhen sie den mfc-anwendungsassistenten aus, und erstellen folgendes projekt:
    **SDI deaktiviern sie Drucken und Druckvorschau

    2. erstellen sie mit dem dialogeditor einen neue dialogresource
    das dialogfeld soll etwa 8 cm hoch und 12 cm breit sein und die ID IDD_FILESPECIAL haben, wählen sie im eingeschaftendialogfeld unter format die option untergeordnet, unter rand die option keine, und aktivieren sie die option "nebengeordnete ausschneiden" und "sichtbar".
    erstellen sie eine vorlage mit einer schaltfläche mit der ID IDC_DELETE und ein gruppenfeld mit der ID "stc=0x045f"

    3. erstellen sie mit dem klassenassistenten die klasse CSpecialFileDialog
    achtung: die klasse ist von CDialog abgeleitet also folgende änderung vornehmen:

    class CSpecialFileDialog : public CDialog
    

    nach

    class CSpecialFileDialog : public CFileDialog
    

    ändern

    public members hinzufügen:

    BOOL m_bDeleteAll;
    CString m_strFileName;

    Konstruktor

    CSpecialFileDialog::CSpecialFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefEx, LPCTSTR lpszFileName, DWORD dwFlags,LPCTSTR lpszFilter, CWnd* pParentWnd) 
    : CFileDialog(bOpenFileDialog,lpszDefExt,lpszFileName,dwFlags,lpszFilter,pParentWnd)
    {
    m_ofn.Flags |= OFN_ENABLETEMPLATE;
    m_ofn.lpTemplateName=MAKEINTRESOURCE(IDD_FILESPECIAL);
    m_ofn.lpstrTitle="Datei löschen";
    m_bDeleteAll=FALSEM
    }
    
    //OnInitDialog:
    
    BOOL CSpecialFileDialog::OnInitDialog()
    {
    
    BOOL bRet=CFileDialog::OnInitDialog();
    if(bRet)
    GetParent()->GetDlgItem(IDOK)->SetWindowText("Löschen");
    return bRet;
    }
    

    Nachrichtenbehandlungsroutine für schaltfläche IDC_DELETE einfügen

    void CSpecialFileDialog::OnDelete()
    {
    m_bDeleteAll=TRUE;
    GetParent()->GetDlgItem(0x480)->GetWindowText(m_strFilename);
    GetParent()->SendMessage(WM_COMMAND,IDCANCEL);
    }
    

    fügen sie code für die virtuelle funkton ondraw ein

    erstellen sie mit dem klassenassisten die nachrichtenroutine für WM_LBUTTONDOWN:

    void myview::OnLButtonDown(UINT nFlags,CPoint point)
    {
    CSpecialFileDialog dlgFile(TRUE,"*.obj");
    CString strMessage;
    int nModal=dlgFile.DoModal();
    if((nModal==IDCANCEL) && (dlgFile.m_bDeleteAll))
    {
    strMessage.Format("Wirklich alle %s files löschen ?",dlgFile.m_strFilename);
    if(AfxMessageBox(strMessage,MB_YESNO)=IDYES)
    {
    
    // alle löschen
    }
    
    }
    else if (nModal==IDOK)
    {
     CString strFileName=dlgFile.GetPathName();
    strMessage.Format("File %s löschen ?",strFileName);
    AfxMessageBox(strMessage)
    }
    }
    }
    }
    

    denken sie daran , dasss standarddialogfelder nur daten erfassen, da die ansicht des client des dialogfelds ist, muss die ansicht für dieses dialogobject "domodal" aufrufen und dann eintscheiden, was mit den zurückgegebenen daten passieren soll, hier stehen der ansicht der rückgabewert von domodal und der wert des öffentlichen datenelements m_bDeleteAll sowie verschiedene memberfunktionen zur verfügung. wenn domodal den wert idcancel zurückgibt, un d das flag true ist, führt die funktion onlbuttondown die notwendingen win32-dateisystemaufrufe durch, um die entsprechenden daten zu löschen. gibt domodal IDOK zurück, kann die funkton einzelne daten löschen.

    also
    happy coding

    ernsti

    ps: wenns passt - vielleicht in die faq 😋



  • Ohne Kontrolle (da zu faul 😉 ): -> FAQ


Anmelden zum Antworten