Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как правильно обработать сообщение WM_DROPFILES

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

sunstars

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Написал на С++ программу, которая шифрует/дешифрует файлы. Начальные диалоги, которые задают параметры шифрования/дешифровки файлов вызываются либо через меню главного окна, либо путём перетвскивания в главное окно программы.При закрытии любого диалогового окна которые вызываются через меню и вызовы которых входят в блок операторов 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;
}
 
 

 
 
Добавлено:
Проблема решена.
При закрытии диалогов, которые вызываются после перехвата сообщения WM_COMMAND, возникает сообщение WM_DROPFILES. Переменная wParam содержит идентификатор ресурса закрытого окна, из-за которого и было сгенерировано сообщение M_DROPFILES.

Всего записей: 22 | Зарегистр. 06-01-2016 | Отправлено: 16:22 31-12-2017
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как правильно обработать сообщение WM_DROPFILES


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru