Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 31.12.2017, 17:16   #1
StillPhelix
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 26
Репутация: 10
По умолчанию Как правильно обработать сообщение WM_DROPFILES

Написал на С++ программу, которая шифрует/дешифрует файлы. Начальные диалоги, которые задают параметры шифрования/дешифровки файлов вызываются либо через меню главного окна, либо путём перетвскивания в главное окно программы.При закрытии любого диалогового окна которые вызываются через меню и вызовы которых входят в блок операторов case WM_COMMAND, срабатывает оператор case WM_DROPFILES и функцией DialogBox(hInst,MAKEINTRESOURCE(IDD _ENCR_DECR_WIZARD),hWnd,WizardDlgPr oc) создаётся окно которое должно было создаваться только при перетаскивании файлов в главное окно программы. Отладчик 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;
}

StillPhelix вне форума   Ответить с цитированием
Старый 31.12.2017, 18:09   #2
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,474
Репутация: 1667
По умолчанию

Цитата:
Сообщение от StillPhelix Посмотреть сообщение
как сделать так, чтобы при перехвате сообщения WM_DROPFILES не вызывальсь окно, в случае не корректного дескриптора hDrop
Никак, он всегда корректный.
С чего бы ему быть некорректным?
waleri на форуме   Ответить с цитированием
Старый 31.12.2017, 18:44   #3
StillPhelix
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 26
Репутация: 10
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Никак, он всегда корректный.
С чего бы ему быть некорректным?
Дословно с MSDN:
PostMessage(
(HWND) hWndControl, // handle to destination control
(UINT) WM_DROPFILES, // message ID
(WPARAM) wParam, // = (WPARAM) (HDROP) hDrop;
(LPARAM) lParam // = 0; not used, must be zero
);
PostMessage(
(HWND) hWndControl, // handle to destination control
(UINT) WM_DROPFILES, // message ID
(WPARAM) wParam, // = (WPARAM) (HDROP) hDrop;
(LPARAM) lParam // = 0; not used, must be zero
);

Parameters

hDrop
A handle to an internal structure describing the dropped files. Pass this handle DragFinish, DragQueryFile, or DragQueryPoint to retrieve information about the dropped files.
lParam
Must be zero.
Здесь hDrop - это указатель на внутреннюю структуру, описывающую перетащеные файлы.

Программа ведёт себя так. Когда закрывается любое диалоговое окно, которое было вызвано через меню программы (блок операторов после case WM_COMMAND), вызывается окно, которое должно было быть вызвано после перетаскивания файлов в главное окно программы (блок операторов после case WM_DROPFILES). Такого быть не должно. Так как в этом случае перетаскивания файлов не происходило, то hDrop остаётся не инициализированым. Отладчик Visual Studio при трассировке в этом случае пишет, что hDrop=0x00009c44{unused=???}.
StillPhelix вне форума   Ответить с цитированием
Старый 31.12.2017, 20:20   #4
StillPhelix
Пользователь
 
Регистрация: 18.05.2014
Сообщений: 26
Репутация: 10
По умолчанию

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение имён, отправка ID. Как правильно обработать? Jopses JavaScript, Ajax 0 02.02.2013 02:54
как правильно обработать событие в cxGrid, в ячейке с CheckBox ? $T@LKER Компоненты Delphi 0 26.08.2010 23:46
Как правильно обработать onkeypress? Stilet JavaScript, Ajax 6 13.08.2009 16:14
Как в DBGrid обработать сообщение на кнопки прокрутки ArtInt БД в Delphi 4 12.03.2009 22:09


10:42.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru