Wie kann ich in WinAPI eine Datei öffnen?
-
Hallo
Ich habe eine WinAPI Programm begonnen. Nun habe ich bereits eine Menüleiste. Ein Menüpunkt ist "Datei". Und im untergeornetem Menüpunkt habe ich "Öffnen". Nun, wenn man auf öffnen klickt, habe ich einen FileOpenDialog programmiert. Doch wie kann ich nun eine Datei auswählen und in mein Programm laden?
Codeausschnitt:
case ID_FILE_OPEN: { OPENFILENAME ofn; char szFileName[MAX_PATH] = ""; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwnd; ofn.lpstrFilter = "Text Datei (*.txt)\0*.txt\0" "C Datei (*.c)\0*.c\0" "Alle Dateien (*.*)\0*.*\0"; ofn.lpstrFile = szFileName; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; ofn.lpstrDefExt = "txt"; GetOpenFileName(&ofn); } break;Kann jemand meine Frage beantworten?
Gruss Patrick
-
クリートファイルですよ!!
-
Also GetOpenFileName gibt dir ja einen Wert zurück, bei TRUE wurde eine Datei ausgewählt und steht dann in ofn.lpstrFile, wird FALSE zurückgegenen, wurde keine Datei ausgewählt. Soweit ist dein Code auch ok, du brauchst nur sowas wie:
if(GetOpenFileName(&ofn)){ ...... }else{ ...... }
-
du kannst entweder die funktionen aus stdio.h nehmen (fopen, fread, fgets, ...) oder du nimmst die winapi funktionen CreateFile, ReadFile
-
Danke für eure Tipps.
Ich habe nun beides probiert. Doch ich komme noch nicht auf den Lösungsweg. Kann mir jemand ein Beispiel zeigen?
-
Sag doch, was schief läuft.
-
Ja, also ich habe es mit CreateFile ausprobiert. Ich habe es so geschrieben:
if (GetOpenFileName(&ofn)==TRUE) { hf = CreateFile(ofn.lpstrFile, GENERIC_READ, 0, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); }Doch nun weiss ich nicht, wie ich die Datei ausgeben kann. Kann mir da jemand ein Codebeispiel zeigen?
-
Scheitert es am suchen, am lesen, oder am verstehen?
char buffer[1024]; unsigned long bytesRead; ReadFile(hf, buffer, sizeof(buffer), bytesRead, 0); // ODER std::ifstream file(ofn.lpstrFile); std::string line; while(getline(file, line)) ; file.close();gOOgle ist dein Freund.
-
das funktioniert so nicht. in lpstrFile muss ein zeiger zu einer variable rein, die dann mit dem dateinamen befüllt wird.
char buffer[MAX_PATH]={0}; // Muss mit 0 intialisiert werden OPENFILENAME ofn; // ... ofn.lpstrFile=buffer; ofn.lpstrMaxFile=MAX_PATH; // ... if (GetOpenFileName(&ofn)) { h=CreateFile(buffer, ...); // ... }
-
Doch nun wird noch nichts im Fenster angezeigt, wenn ich zum Beispiel eine .txt Datei öffne, warum?
Ich habe CreateFile und ReadFile benutzt.
-
zeig mal deinen code
-
Hier ist mein Code:
case ID_FILE_OPEN: { OPENFILENAME ofn; HANDLE hf; char buffer[MAX_PATH]={0}; DWORD dwRead = 2; char szFileName[MAX_PATH] = ""; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwnd; ofn.lpstrFilter = "Text Datei (*.txt)\0*.txt\0" "C Datei (*.c)\0*.c\0" "Alle Dateien (*.*)\0*.*\0"; ofn.lpstrFile = szFileName; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; ofn.lpstrDefExt = "txt"; if(GetOpenFileName(&ofn) == TRUE) { hf = CreateFile(ofn.lpstrFile, GENERIC_READ, 0, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); } ReadFile(hf, buffer, sizeof(buffer), &dwRead, 0); } break;
-
ersetz das ofn.lpstrFile in createfile mal durch buffer
-
Eglifisch1 schrieb:
Doch nun wird noch nichts im Fenster angezeigt, wenn ich zum Beispiel eine .txt Datei öffne, warum?
Ich habe CreateFile und ReadFile benutzt.
Weil ReadFile nur die Daten einliest und mit der Anzeige nichts zu tun hat. Du musst also noch WM_PAINT verarbeiten und hier Code für die Darstellung schreiben.
-
So nun habe ich es geschafft, den Pfad über ein MessageBox auszugeben. Natürlich ist es auch kein Problem über WM_PAINT das auszugeben. Doch wie kann ich den Inhalt der Datei ausgeben? Kann mir da jemand ein Tipp geben. Mein Code sieht so aus:
case ID_FILE_OPEN: { ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwnd; ofn.lpstrFilter = "Text Datei (*.txt)\0*.txt\0" "C Datei (*.c)\0*.c\0" "Alle Dateien (*.*)\0*.*\0"; ofn.lpstrFile = szFileName; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; ofn.lpstrDefExt = "txt"; if(GetOpenFileName(&ofn) == TRUE) { MessageBox(NULL, ofn.lpstrFile, "Success", MB_OK | MB_ICONEXCLAMATION); hf = CreateFile(ofn.lpstrFile, GENERIC_READ, 0, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); } ReadFile(hf, buffer, sizeof(buffer), &dwRead, 0); } break;
-
wenn es kein problem ist das darzustellen dann tu es doch einfach...
ansonsten erstell ein Edit Control und schick den inhalt von buffer mit SendMessage() und WM_SETTEXT an das Edit Control
-
Du bist echt schwer von Begriff. Soll keine Beleidigung sein, ist einfach so.
Man hat dir jetzt mehrfach Lösungen gezeigt. Ein bisschen selbst denken bitte.

-
schau mal nach GDI und Text ... das knallst du in WM_PAINT rein