jak otworzyc okno Save File Dialog, chodzi o cos podobnego jak Open File Dialog w konsoli czy uzywa sie tego samego tzn Open File Dialog
juz mam odzcyt jest GetOpenFileName a zapis GetSaveFileName
No patrzę, że jest taka funkcja i pewnie tak samo się korzysta, musisz przekazać strukturę, którą musisz zaalokować nawet pamięć na stringa, którego będzie wypełniać, to samo, ale kiedyś nie było chatGPT i AI ogólnie te 2 lata temu, równo 2 lata temu w grudniu wyszła beta i byłem pierwszy.
Patrz to wchodzisz sobie openai chatgpt wpisujesz numer telefonu, lub jak nie chcesz to wchodzisz bing.com tam klikasz copilot na serach i wpisujesz jak użyć getSaveFileName żeby odczytać path, który użytkownik wybrał, jest to identyczne co w poprzednim wątku, ale musisz nauczyć się samodzielnie z AI korzystać od dwóch lat równych w 2022 roku chatGPT powstał, programiści pytają się o pierdoły takiego bota jakiś example czy coś i potem analizujesz każdą funkcję wklejasz w chatGPT czy wyszukiwarke i patrzysz co robi to się nazywa uczenie, po prostu prze analizuj po swojemu użyj botów i jakoś to zrobisz.
Jak się obudziłem myślałem, że ktoś posty skasował z administracji bo temat jest identyczny co poprzedni i jest takie samo rozwiązanie.
mozna tez tak
#include <windows.h>
#include <commdlg.h>
#include <tchar.h>
char *SaveFileDialog(HWND owner, DWORD maxFilePath) {
OPENFILENAME ofn; // common dialog box structure
TCHAR szFile[MAX_PATH]; // buffer for file name
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = owner;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = _T("All Files\0*.*\0Text Files\0*.TXT\0");
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// Display the Open dialog box
if (GetSaveFileName(&ofn) == TRUE) //tutaj pobiera zapiske
{
return ofn.lpstrFile;
} else
{
return NULL;
}
}
Powyższy kod ma Undefined Behavior: zwracanie wskaźnika do zmiennej lokalnej!
To ma być C czy C++? W jakiej wersji standardu?
c++ ale to działa
wilkwielki napisał(a):
c++ ale to działa
Działać, to może i działa, ale należy zwrócić uwagę, ze "oficjalnie", struktura ofn
i tym samym obszar wskazywany przez lpstrFile
są likwidowane po zakończeniu funkcji. Prawidłowo, to należałoby utworzyć nową tablicę char *
wewnątrz tej funkcji, przepisać do niej ofn.lpstrFile
i zwrócić nową tablicę, którą trzeba zlikwidować później.
Nieoficjalnie, to jak najbardziej jest możliwe, że pamięć zajmowana przez obiekt po jego likwidacji zawiera to, co zawierał obiekt.
Inny sposób, to podawanie wskaźnika char *
poprzez parametr funkcji, a sama funkcja powinna do tego wskaźnika wpisać nazwę pliku.
jak to ma byc c++, to trzeba troche pozmieniać
[1] ja bym zmienił wynik funkcji na std::string
wiec trzeba dodać
#include <string>
[2] poprawiamy deklarację funkcji:
std::string SaveFileDialog(
[3]
// Display the Open dialog box
if (GetSaveFileName(&ofn) == TRUE) //tutaj pobiera zapiske
{
return std::string(ofn.lpstrFile);
} else
{
return std::string();
}
To jest najfajniejsze w c++ bo zapewnia ciekawe życie
,Bo blad sie kompiluej, potem uruchamiasz i działa , ale przyczodzi słoneczny dzień gdy jestes na urlopie w daleki kraju to przestaje działac i nawet aplikacja sie nie uruchomi choc wczoraj działała OK :D
Użyć tinyfiledialogs i iść dalej ze swoim życiem. A jeśli chcesz robić samemu to MS od visty rekomenduje używanie Common File Dialogs to dostaniesz okienko zgodne z obecnie używanym shellem. GetSaveFileName
zostanie w API raczej na zawsze, aczkolwiek wygląd okienka może odbiegać od obecnie używanego.