Сохранить / открыть общие диалоговые окна в win32 без MFC - PullRequest
3 голосов
/ 11 октября 2011

Как создать глухие диалоговые окна Сохранить / Открыть, используя чистый неуправляемый Win32 API?Следуя указаниям здесь , при обработке сообщения WM_CREATE в цикле сообщений главного окна выполняется следующий код: Ive included <Commdlg.h> также.

            OPENFILENAMEA ofn;
        char Buffer[300];
        fill(Buffer, Buffer + 300, '\0');
        ofn.lStructSize = sizeof(OPENFILENAMEA);
        ofn.hwndOwner = hWnd;
        ofn.lpstrFile = Buffer;
        ofn.nMaxFile = 300;
        ofn.Flags = OFN_EXPLORER;
        ofn.lpstrFilter = NULL;
        ofn.lpstrCustomFilter = NULL;
        ofn.nFilterIndex = 0;
        ofn.lpstrFileTitle = NULL;
        ofn.lpstrInitialDir = NULL;
        ofn.lpstrTitle = NULL;
        out << GetOpenFileNameA(&ofn) << endl;
        out << Buffer << (int)CommDlgExtendedError();

Однако этокод дает NO вывод вообще.Помощь?!

Ответы [ 3 ]

7 голосов
/ 11 октября 2011

следующий код выполняется при обработке сообщения WM_CREATE

Посмотрите в окне «Вывод» и просмотрите уведомление об исключении первого шанса для 0xc0000005, исключения AccessViolation.В эмуляторе Wow64 есть обратная остановка, которая поглощает исключения во время отправки WM_CREATE.

Исключение вызвано неполной инициализацией структуры OPENFILENAMEA.Быстрое исправление:

 OPENFILENAMEA ofn = {0};

и предпочтение отображению диалогового окна перед вызовом ShowWindow () вместо обработчика сообщений WM_CREATE.

2 голосов
/ 11 октября 2011

Общая идея верна, но если вы передаете дескриптор окна, которое вы создаете как владелец, то оно еще не будет инициализировано.

Для диагностики рассмотрите возможность создания переменных для храненияфункция API возвращает значения и проверяет их в отладчике.

Также удобнее и менее подвержено ошибкам инициализировать структуру до нуля, вместо того, чтобы явно обнулять ненужные элементы, например:

OPENFILENAME ofn = { 0 };
0 голосов
/ 11 октября 2011

GetOpenFileName блокирует (на некоторое время), а затем возвращает либо TRUE, если диалог был закрыт нажатием 'OK', либо FALSE, если оно было отменено.

Фактический результат (путь к каталогу / файлу) можно прочитать из структуры OPENFILENAME.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...