windows编程学习笔记(2)窗口过程函数

一.窗口过程函数

窗口过程函数是“真正干活的函数”,系统和用户所产生的各种消息,最后都要通过调用这个函数来进行处理。

定义如下:

LRESULT CALLBACK WindowProc

(

HWND hwnd, // 窗口句柄

UINT uMsg, //消息

WPARAM wParam, // 附加信息1

LPARAM lParam // 附加信息2

);

Win32api编程,对窗口的操作,都是应用窗口过程函数这个回调函数进行操作的。通过GetMessage函数获取到了一个消息,然后通过DispatchMessage函数派发出去,WindowProc函数中对接受到的消息进行相应。在窗口过程函数中通过一个switch结构,对不同的消息进行相应的处理,如果没有要处理的消息,就执行DefWindowProc这个默认的窗口过程函数。

<pre name="code" class="cpp">//窗口过程函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	HDC hdc = NULL;
	switch(message)
	{
	case WM_PAINT://绘图消息
		hdc = GetDC(hwnd);
		TextOut(hdc, 100, 100, L"hello Windows", strlen("hello Windows"));
		ReleaseDC(hwnd, hdc);
		break;
	case WM_KEYDOWN://处理键盘消息
		if (wParam == 'Q')
			DestroyWindow(hwnd);
		break;
	case WM_DESTROY://当有关闭消息时
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd, message, wParam, lParam);//默认窗口过程函数
	}

	return 0;
}


 
 

程序运行结果如下图:

二.WM_XXX消息

消息的形式上一节已经说过,在窗口过程函数中,各种消息都采取WM_XXX的形式表示(即WINDOW MESSAGE),比如WM_PAINT,WM_COMMAND等等。

那么这个消息到底是什么呢,在VS中,我们选中一个消息,点击转到定义处,就可以看到如下的定义:

原来这些消息都是一些十六进制的数字。用这样的一个宏定义,为每个消息定义一个便于我们理解的表示符,这样,我们在编程的时候就不需要记忆那些枯燥无味的数字,而是用这些从字面上就能理解的字符。

窗口过程函数在处理的时候,通switch函数,针对不同的WM_XXX消息,调用不同case中的代码,进而完成各种操作。

对于lParam和wParam,这两个参数中保存的是消息中的附加信息,比如:

WM_LBUTTONDOW这个消息

就需要用lParam参数来传递鼠标位置信息。

<pre name="code" class="cpp"><span style="white-space:pre">	</span>point.x=LOWORD(pMsg->lParam);//LOWORD取低位 后面四位 相对于客户窗体左上角的X偏移值
    <span style="white-space:pre">	</span>point.y=HIWORD(pMsg->lParam);//HIWORDs取高位 前面四位 相对于客户窗体左上角的Y偏移值
 
  
 



你可能感兴趣的:(windows,Win32,操作系统)