Textausgabe nach Datei öffnen-Dialog
-
Hallo zusammen,
ich arbeite mit Visual Studio 2015 experimentiere etwas herum. Mein letztes C++ ist etwa 12 Jahre her
Bisher habe ich WM_PAINT mit Textausgabe eingebaut und einen Datei öffnen-Dialog mit CSV-auslesen.
Wenn ich die Datei sofort bei Programmbeginn öffnen lassen, bekomme ich die Daten aus der CSV auch ausgegeben. Aber ich bekomme nichts, wenn sie über den Dialog kommen. Wie kann ich die Wert nach dem Dialog anzeigen lassen? Die Notation überarbeite ich noch.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_\1: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; case IDM_OPEN: // open a file name ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = NULL; ofn.lpstrFile = szFile; ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; GetOpenFileName(&ofn); ifstream csvread("werte.csv"); if (!csvread.is_open()) { cerr << "Fehler beim Oeffnen der Datei!" << endl; } else { // MessageBox(NULL, ofn.lpstrFile, "File Name", MB_OK); for (Werte werte; lese_ein(csvread, werte); ) { MessageBox(NULL, werte.x.c_str(), "Wert 1", MB_OK); } } return 0; break; } } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); // TextOut(hdc, 0, 0, "TEST", 12); // MoveToEx(hdc, 0, 0, NULL); // Rectangle(hdc, 16, 36, 72, 70); // Rectangle(hdc, 34, 50, 54, 70); for (Werte werte; lese_ein(csvread, werte); ) { TextOut(hdc, 0, 0, werte.x.c_str(), 12); TextOut(hdc, 0, 20, werte.y.c_str(), 12); TextOut(hdc, 0, 40, werte.z.c_str(), 12); } ReleaseDC(hWnd, hdc); // TODO: Add any drawing code that uses hdc here... EndPaint(hWnd, &ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); }
Gruß und Danke
Martin
-
Wenn Du möchtest, dass das Fenster neu angezeigt wird, dann musst Du auch InvalidateRect ausführen.
Ob es sinnreich ist die Datei jedes mal zu lesen, wenn DU sie anzeigen musst ist eine andere Frage.Mal eine andere Frage: Wo setzt Du denn den Stream auf den Anfang zurück. Ich sehe nur ein temporäres Objekt in einem case Block, dass Du mitverwendest in einem anderen case Block. Böööööse!
-
das mit dem Datei lesen wird noch verbessert und das temporäre Objekt, ich gehe davon aus, du meinst "werte" wird auch verbessert, wie gesagt, ich experimentiere grad, um überhaupt etwas angezeigt zu bekommen.
An welche Stelle muss das InvalidateRect? Ich hab es in den else-Zweig von IDM_OPEN gesetzt (Zeile 45) aber es passiert nix. Wenn ich mir das beispiel hier anschaue, sollte es das aber, oder sehe ich das falsch?
-
ok, das Beispiel funktioniert...ich kriege in meinem Quelltext aus dem Pentagon ein Hexagon, dann muss das andere ja auch funktionieren, wenn ich es richtig mache...
-
habs, danke
Jetzt räum ich erstmal den Code auf