Dateipfad mit Drag&Drop in Ceditfeld anzeigen lassen



  • Stimmt, hatte irgendwie noch im Hinterkopf, dass das ging, aber doch nicht, muss ich was verwechselt haben.

    Ich hab mithilfe des Klassenassistenten ON_WM_DROPFILES() hinzufügt, dann bekomm ich folgenden Handler:

    void CAboutDlg::OnDropFiles(HDROP hDropInfo)
    {
    	// TODO: Add your message handler code here and/or call default
    
    	CDialogEx::OnDropFiles(hDropInfo);
    }
    

    Bin auf DragQueryFile gestoßen, allerdings klappt die Implementierung nicht:

    void CAboutDlg::OnDropFiles(HDROP hdrop)
    {
    	UINT  uNumFiles;
    	TCHAR szNextFile [MAX_PATH];
    
        uNumFiles = DragQueryFile ( hdrop, -1, NULL, 0 );
    
        for ( UINT uFile = 0; uFile < uNumFiles; uFile++ )
        {
    		if (DragQueryFile ( hdrop, uFile, szNextFile, MAX_PATH ) > 0 )
            {      
    			m_out.SetWindowTextW(szNextFile);
            }
    	}
    
        DragFinish ( hdrop );
    	CDialogEx::OnDropFiles(hdrop);
    }
    

    Die Variable m_out kennt er nicht, obwohl das die Kontrollvariable des CEdit-Feldes ist.

    Kann mir jemand helfen?


  • Mod

    Glaub ich Dir nicht.
    Zeig Deine CAboutDlg Klasse.



  • Ok, der Variable stand in meiner Header des Hauptdialogs.Er findet jetzt den Member, aber der Pfad wird mir immer noch nicht angeigt:

    void CAboutDlg::OnDropFiles(HDROP hdrop)
    {
    	UINT  uNumFiles;
    	TCHAR szNextFile [MAX_PATH];
    
        uNumFiles = DragQueryFile ( hdrop, -1, NULL, 0 );
    
        for ( UINT uFile = 0; uFile < uNumFiles; uFile++ )
        {
    		if (DragQueryFile ( hdrop, uFile, szNextFile, MAX_PATH ) > 0 )
            {      
    			m_out.SetWindowTextW(szNextFile);
            }
    	}
    
        DragFinish ( hdrop );
    	CDialogEx::OnDropFiles(hdrop);
    }
    


  • Setz mal nen Breakpoint rein und step im Debugger durch. Und guck was abgeht. Also ob er überhaupt in die Funktion reinkommt, was DragQueryFile zurückgibt etc.



  • ist er natürlich nicht, hab einen ganz dummen Fehler beim Anlegen des Handlers gemacht 🙂

    void CshowpathDlg::OnDropFiles(HDROP hDropInfo)
    {
    	TCHAR szPath[1024];
    	DragQueryFile ( hDropInfo, 0, szPath, sizeof(szPath));    
    	m_out.SetWindowTextW(szPath);
    	DragFinish ( hDropInfo );
    }
    

    der Code funktioniert, allerdings gibt es eine Sache die ich noch nicht verstehe:

    ich muss in den Eigenschaften des Dialogs Accept Files auf True stellen, damit in dem CEditfeld der Pfad steht. Das heißt also, wenn ich den Pfad in das Dialogfenster reinziehe steht der Text in dem Editfeld.
    Das möchte ich aber nicht, ich möchte, dass der Pfad nur dann erscheint, wenn ich ihn genau in das Editfeld reinziehe und nicht in den gesamten Dialog.

    Hab versucht bei den Dialogeinstellungen Accept files auf False und bei den Einstellungen des Editfelds Accept files auf true zu stellen, aber da zeigt er mir gar nichts an.

    gibt es da noch einen letzten Kniff den ich machen muss?

    Danke im Voraus!


  • Mod

    Dann musst Du auch eine eigene CEdit Control Klasse bauen.
    Es bekommt immer das Fenster (oder das Parent) die Nachricht für die Du DragAcceptFiles aufrufst.

    Ist doch logisch oder?



  • Wenn du es so sagst Martin, macht es natürlich Sinn :D. Hab auch hier ein Beispiel dafür gefunden, allerdings führt es an der Stelle

    "
    

    cEd.SubclassDlgItem( IDC_EDIT1, this );

    immer zu einer Debug Assertion failed
    
    [code="cpp"]class CEditDropNotif : public CEdit
    {
        virtual BOOL PreTranslateMessage(MSG* pMsg) {
            if ( pMsg->message == WM_DROPFILES ) {
                GetParent()->SendMessage(WM_DROPFILES, pMsg->wParam, pMsg->lParam);
                return TRUE; // eat it
            }
            return FALSE; // allow default processing
        }
    };
    BOOL CMyDlg::OnInitDialog()
    {
     ...
        static CEditDropNotif cEd;  // must persist (usually a dlg member)
        cEd.SubclassDlgItem( IDC_EDIT1, this );
        ::DragAcceptFiles( cEd.m_hWnd, true );  // the editbox, not the dialog
     ...
    

    Hat jemand ne Lösung dafür?


  • Mod

    Was soll der Quatsch mit dem Static.
    Benenne die Klasse für Dein m_ed von CEdit in Deine neue Klasse um.



  • meinst du in der dialog.h so

    CEditDropNotif m_out;
    

    und in der dialog.cpp so:

    m_out.SubclassDlgItem(IDC_EDIT1, this);
    	::DragAcceptFiles( m_out.m_hWnd, true );
    

    Dann bekomm ich immer noch den gleichen error


  • Mod

    Den Subclass musst Du nicht mahcen wenn Du einen DDX_Control Eintrag hast.

    Tipp: MFC Grundlagen lernen und verstehen was Subclassing ist.



  • Vielen Dank, jetzt gehts!

    Du erweckst den Eindruck als ob du ein professioneller Programmierer bist, an deinen ganzen Beiträgen finde ich es irgendwie erschreckend, dass du auf alles ne Antwort weißt. Das ist echt brutal, meinen Respekt. Was gibt es denn an guter Literatur bzgl MFC die du empfehlen kannst? Bislang war es bei mir immer learning by doing.


  • Mod

    1. Ich bin "professioneller Programmierer", im Sinne von Profession==Beruf 😉
    2. Ich weiß nicht auf alles eine Antwort. Wenn das so wäre würde ich einer anderen Liga "spielen"... 😉
    3. Alles was an MFC Büchern existiert ist alt. Oder zum Teil nicht mehr zu kaufen.
    Ich habe den "Kruglinski" nicht schlecht gefunden. Andere finden den "Prosise" besser...
    Oder lies den MFC Sourcecode, so habe ich am meisten an der MFC gelernt...


Anmelden zum Antworten