Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Open File Dialog WinApi


Автор: xXvladXx 22.5.2009, 18:34
Привет,
Возникла следущая проблемма, требуеться сделать кнопку которая отображает OpenFileDialog, и что бы юзер там мог выбрать файл, а мы получиться имя этого файла.
Как создать кнопку - я знаю, а вот с диалогом возникла проблемма.
На не русском форуме увидел пример, засунул его в оброботчик кнопки.
Код

OPENFILENAME ofn;
char szPath[256];
char szFileTitle[40];
char szMyFilter[] = "Text Files (*.txt)\0*.txt\0\0";
/*ofn.lStructSize = sizeof(OPENFILENAME);*/
ofn.hwndOwner = hwnd;    
/*ofn.hInstance = ::GetModuleHandle(0);*/
ofn.lpstrCustomFilter = 0;
ofn.lpstrFilter = szMyFilter;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = szPath;
ofn.nMaxFile = 256;
ofn.lpstrFileTitle = szFileTitle;
ofn.nMaxFileTitle = 40;
ofn.lpstrInitialDir = 0;
ofn.Flags = OFN_FILEMUSTEXIST;
ofn.nFileOffset = 0;
ofn.lpstrDefExt = "txt";
ofn.nFileExtension = 0;
ofn.lCustData = 0;
ofn.lpfnHook = 0;
ofn.lpTemplateName = 0;
if (::GetOpenFileName(&ofn) != 0){
....
}



В коде я закоментировал пару строк, если любую из них раскоментировать программа вылетает при нажатии кнопки, а когда они закоментированы, просто ничего не происходит.
Подскажите как реализовать вот такую задачу.
Заранее спасибо=)

Автор: bugmenot 22.5.2009, 19:08
Вроде все верно, кроме одного:
Цитата(msdn)

lpstrFile

Pointer to a buffer that contains a file name used to initialize the File Name edit control. The first character of this buffer must be NULL if initialization is not necessary. When the GetOpenFileName or GetSaveFileName function returns successfully, this buffer contains the drive designator, path, file name, and extension of the selected file. 


Если все равно вылетит, залей свой ехе файл, подебагим smile.

Автор: andrew_121 22.5.2009, 19:13
Цитата(xXvladXx @  22.5.2009,  18:34 Найти цитируемый пост)
/*ofn.lStructSize = sizeof(OPENFILENAME);*/

Это самая важная строка в коде!
Код

BOOL MyShowDialogSaveFile(HWND hWnd, const LString& title, char* fn) {
    static OPENFILENAME ofn;
    // Инициализация структуры ofn
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hWnd;
    ofn.lpstrFile = fn;
    ofn.nMaxFile = 1024;
    ofn.lpstrTitle = title.c_str();
    // Открыть диалог при запуске
    BOOL success = GetSaveFileName(&ofn);
    if (success){
        strcpy(fn, ofn.lpstrFile);
    }
    return success;
}


Автор: bugmenot 22.5.2009, 19:21
Цитата(andrew_121 @  22.5.2009,  19:13 Найти цитируемый пост)
Это самая важная строка в коде!

Автор написал, что с этой строкой у него вылетает программа, а без - ничего не делает (очевидно потому что не может определить тип структуры)

Цитата(andrew_121 @  22.5.2009,  19:13 Найти цитируемый пост)
    // Инициализация структуры ofn

Желательно сначала сделать ZeroMemory, там многие переменные должны быть нолем при неиспользование.

Цитата(andrew_121 @  22.5.2009,  19:13 Найти цитируемый пост)
        strcpy(fn, ofn.lpstrFile);

А тебя не кажется, что fn и ofn.lpstrFile - одно и то же? smile

Вот код с какого-то моего проекта, вроде работает:
Код

    char szFileName[MAX_PATH] = "";
    OPENFILENAME ofn;

    ZeroMemory(&ofn, sizeof(OPENFILENAME));

    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hWnd;
    ofn.lpstrFilter = 
        "Text files (*.txt)\0*.txt\0"
        "All files (*.*)\0*.*\0";
    ofn.lpstrFile = szFileName;
    ofn.nMaxFile = MAX_PATH;
    ofn.lpstrTitle = "Best test of all tests!";
    ofn.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
    ofn.lpstrDefExt = "txt";

    if(GetOpenFileName(&ofn))
        /* bla bla */;

Автор: andrew_121 23.5.2009, 02:53
Цитата(bugmenot @  22.5.2009,  19:21 Найти цитируемый пост)
А тебя не кажется, что fn и ofn.lpstrFile - одно и то же? smile

Верно подмечено! smile 

Автор: xXvladXx 23.5.2009, 13:08
Спасибо, ZeroMemory, Помогло=)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)