Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Open File Dialog WinApi 
:(
    Опции темы
xXvladXx
Дата 22.5.2009, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бездарь
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 9.3.2008

Репутация: нет
Всего: 1



Привет,
Возникла следущая проблемма, требуеться сделать кнопку которая отображает 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){
....
}



В коде я закоментировал пару строк, если любую из них раскоментировать программа вылетает при нажатии кнопки, а когда они закоментированы, просто ничего не происходит.
Подскажите как реализовать вот такую задачу.
Заранее спасибо=)
PM MAIL   Вверх
bugmenot
Дата 22.5.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 3.7.2006

Репутация: 0
Всего: 1



Вроде все верно, кроме одного:
Цитата(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.
--------------------
доска объявленийвсе о горных велосипедах 
PM MAIL   Вверх
andrew_121
Дата 22.5.2009, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 2
Всего: 33



Цитата(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;
}




--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bugmenot
Дата 22.5.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 3.7.2006

Репутация: 0
Всего: 1



Цитата(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 */;

--------------------
доска объявленийвсе о горных велосипедах 
PM MAIL   Вверх
andrew_121
Дата 23.5.2009, 02:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 2
Всего: 33



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

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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
xXvladXx
Дата 23.5.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бездарь
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 9.3.2008

Репутация: нет
Всего: 1



Спасибо, ZeroMemory, Помогло=)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0975 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.