Dateipfad mit Drag&Drop in Ceditfeld anzeigen lassen
-
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!
-
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?
-
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
-
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.
-
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...