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. |