Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2011, 01:33   #1
LockHeart
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 14
По умолчанию GetMessage

Код:
LRESULT APIENTRY WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 int x_max, y_max, center_x, center_y;
 HBRUSH hbrush;
 HGDIOBJ hbrushOld;
	switch(msg) {
		case WM_PAINT:	
			{					
				PAINTSTRUCT ps;									
				HDC hdc = BeginPaint(hWnd, &ps);				
				EndPaint(hWnd, &ps);

        return 0;
			}
			break;
		case WM_SIZE:	
			rect.right = LOWORD(lParam);	
			rect.bottom = HIWORD(lParam);
			break;
		case WM_DESTROY:	
			PostQuitMessage(0);	
			break;
		} 
	return DefWindowProc(hWnd, msg, wParam, lParam);
}


int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int nShowCmd)
{

	WNDCLASS wc = {0};						
	 wc.style = CS_HREDRAW | CS_VREDRAW;		
         wc.lpfnWndProc = WndProc;				
         wc.hInstance = hInst;					
         wc.hCursor = LoadCursor(0, IDC_ARROW);
  	 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
         wc.lpszClassName = strWindowTitle;		


	if ( !RegisterClass(&wc) ) return(0);	

	HWND hWnd = CreateWindow(
		strWindowTitle,				
		strWindowTitle,				
		WS_OVERLAPPEDWINDOW,		
		0, 0,		
		300, 300,	             
		0, 0, hInst, 0);		
	if ( !hWnd ) return(0);
	
	ShowWindow(hWnd, nShowCmd);
	UpdateWindow(hWnd);

MSG msg = {0};					
	while( GetMessage(&msg, 0, 0, 0) ) {	
		TranslateMessage(&msg);		
		DispatchMessage(&msg);		
	}
Несколько вопросов вот по последней части программы...

Насколько я понял, в случае, если нам приходит сообщение WM_KEYDOWN, TranslateMessage генерирует сообщение WM_CHAR о том, какой именно символ мы получили, а DispatchMessage просто отсылает это сообщение в главную функцию обработки сообщений.



Тобишь, все сообщения, которые принимает главная функция обработки сообщений, приходят из GetMessage...?
Что произойдет с WM_KEYDOWN после обработки в TranslateMessage, пропадет или будет отправлено вместе с WM_CHAR в главную функцию обработки сообщений? Если будет отправлено, то как именно это произойдет(как можно отправить сразу два сообщения в данном случае? Где они будут храниться и как именно будут отправлены...)
Что нужно добавить в главную функцию обработки сообщений, чтобы доказать, что WM_KEYDOWN пропадет/не пропадет?
LockHeart вне форума Ответить с цитированием
Старый 28.10.2011, 07:14   #2
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Функция GetMessage извлекает сообщения из очереди сообщений. Если поле message сообщения, извлеченного из очереди сообщений, равно любому значению, кроме WM_QUIT, то функция GetMessage возвращает ненулевое значение.

Функция TranslateMessage передает структуру msg обратно в Windows для преобразования аппаратных сообщений клавиатуры в символьные сообщения. Если этим сообщением является M_KEYDOWN или WM_SYSKEYDOWN и, если нажатие клавиши в сочетании с положением клавиши сдвига генерирует символ, тогда TranslateMessage помещает символьное сообщение в очередь сообщений. Это символьное сообщение будет следующим, после сообщения о нажатии клавиши, которое функция GetMessage извлечет из очереди сообщений.

Функция DispatchMessage также передает структуру msg обратно в Windows. Windows отправляет сообщение для его обработки соответствующей оконной процедуре — таким образом, Windows вызывает оконную процедуру.

Цитата:
Сообщение от LockHeart Посмотреть сообщение
Тобишь, все сообщения, которые принимает главная функция обработки сообщений, приходят из GetMessage...?
Есть синхронные сообщения они будут помещены в очередь и извлечены с помощью GetMessage. А есть асинхронные, которые сразу отправляются в оконную процедуру.
An1ka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хук на GetMessage HollyPaladin Win Api 19 16.01.2010 01:09