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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно обработать сообщение WM_DROPFILES, Как правильно обработать сообщение WM_DR 
V
    Опции темы
StillPhelix
Дата 31.12.2017, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Написал на С++ программу, которая шифрует/дешифрует файлы. Начальные диалоги, которые задают параметры шифрования/дешифровки файлов вызываются либо через меню главного окна, либо путём перетвскивания в главное окно программы. При закрытии любого диалогового окна которые вызываются через меню и вызовы которых входят в блок операторов case WM_COMMAND, срабатывает оператор case WM_DROPFILES и функцией DialogBox(hInst,MAKEINTRESOURCE(IDD_ENCR_DECR_WIZARD),hWnd,WizardDlgProc) создаётся окно которое должно было создаваться только при перетаскивании файлов в главное окно программы. Отладчик Visual Studio в этом случае пишет, что hDrop=0x00009c44{unused=???}. Перетаскивание обрабатывается нормально и при этом hDrop=0x0017003c. Как проверить корректность дескриптора hDrop или как сделать так, чтобы при перехвате сообщения WM_DROPFILES  не вызывальсь окно, в случае не корректного дескриптора hDrop. Код оконной процедуры приведен ниже.
Код

LRESULT CALLBACK pWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
    HDC hDC;
    PAINTSTRUCT ps;
    
    static HINSTANCE hInst;
    static HMENU hMenu;  // дескриптор главного меню

    switch(uMsg){
    
    case WM_CREATE:
        hInst = GetModuleHandle(NULL);
        hBitMapUaFlag = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_UAFLAG));
        GetObject(hBitMapUaFlag, sizeof(bm), (LPSTR)&bm);//отыскивает информацию об указанном графическом объекте
        break;
    case WM_PAINT:
        hDC=BeginPaint(hWnd, &ps);
        hMemDC = CreateCompatibleDC(hDC);//создаёт контекст устройства, совместимый с указанным
        SelectObject(hMemDC, hBitMapUaFlag);
        BitBlt(hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
        DeleteDC(hMemDC);
    break;
    case WM_CLOSE:
        
            DestroyWindow(hWnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case ID_FILE_ENCRYPTFILE:
            DialogBox(hInst,MAKEINTRESOURCE(IDD_ENCRYPT_DIALOG),hWnd,EncryptDlgProc);
            break;
        case ID_FILE_DECRYPTFILE:
            DialogBox(hInst,MAKEINTRESOURCE(IDD_DECRYPT_DIALOG),hWnd,DecryptDlgProc);
            break;
        case ID_FILE_EXIT:
            SendMessage(hWnd,WM_DESTROY,0,0);
            break;
        case ID_HELP_ABOUTENCRYPTDECRYPT:
            DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUT),hWnd,AbuotDlg);
            break;
        }
    case WM_DROPFILES:
            hDrop=(HDROP)wParam;
            DialogBox(hInst,MAKEINTRESOURCE(IDD_ENCR_DECR_WIZARD),hWnd,WizardDlgProc);
            DragFinish(hDrop);
            break;
    default:
        return DefWindowProc(hWnd,uMsg,wParam,lParam);
    }
    return 0;
}

PM MAIL   Вверх
StillPhelix
Дата 31.12.2017, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблема решена.
При закрытии диалогов, которые вызываются после перехвата сообщения WM_COMMAND, возникает сообщение WM_DROPFILES. Переменная wParam содержит идентификатор ресурса закрытого окна, из-за которого и было сгенерировано сообщение M_DROPFILES.
PM MAIL   Вверх
xvr
Дата 16.1.2018, 17:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Всё проще - у вас в switch (конкретно перед строкой 45) отсуствует break, поэтому ваш case WM_COMMAND после обработки проваливается в WM_DROPFILES (никакого сообщения не генерируется)

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.1165 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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