客户写一个消息处理函数,在窗口建立前,将消息处理函数与窗口关联。这样,每当有消息产生时,就会去调用这个消息处理函数。通常情况下,客户都不会处理全部的消息,而是只处理自己感兴趣的消息,其他的,则送回到系统的缺省消息处理函数中去。
系统会将针对这个程序的消息依次放到程序的“消息队列”中,由程序自己依次取出消息,在分发到对应的窗口中去。
因此,建立窗口后,将进入一个循环。
在循环中,取出消息、派发消息,循环往复,直到取得的消息是退出消息。 循环退出后,程序即结束。 #include \"stdafx.h\" #include //参数:窗口句柄,消息,消息参数,消息参数 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { //处理感兴趣的消息 switch (message) { case WM_DESTROY: //当用户关闭窗口,窗口销毁,程序需结束,发退出消息,以退出消息循环 PostQuitMessage (0) ; return 0 ; } //其他消息交给由系统提供的缺省处理函数 return ::DefWindowProc (hwnd, message, wParam, lParam) ; } //二、应用程序主函数 //参数:实例句柄、前一个实例的句柄、命令行参数、窗口显示方式 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { //1.注册窗口类 static TCHAR szAppName[] = TEXT (\"HelloWin\") ;//窗口类名称 //定制\"窗口类\"结构 WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ;//关联消息处理函数 wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ;//实例句柄 wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;//图标 wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;//光标 wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);//画刷 wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName;//类名称 //注册 if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT (\"RegisterClass Fail!\"), szAppName, MB_ICONERROR) ; return 0 ; } //建立窗口 HWND hwnd ; hwnd = CreateWindow (szAppName,//窗口类名称 TEXT (\"The Hello Program\"),//窗口标题 WS_OVERLAPPEDWINDOW,//窗口风格 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance,//实例句柄 NULL); ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; //消息循环 MSG msg ; while (GetMessage (&msg, NULL, 0, 0))//从消息队列中取消息 { TranslateMessage (&msg) ;//转换消息 DispatchMessage (&msg) ;//派发消息 return msg.wParam ; } } LRESULT LRESULT是一个数据类型, MSDN: 32-bit value returned from a window procedure or callback function 指的是从窗口程序或者回调函数返回的32位值 在winnt.h中typedef long LONG; 在windef.h中typedef LONG LRESULT; 所以LRESULT就是long,也就是长整形 之所以取名类LRESULT,L=>long result表示结果,说明这个函数的返回值是某个结果。 WNDCLASS 的 cbClsExtra 和 cbWndExtra 有什么用啊? 应该是分别规定类的额外需要保存的空间的大小值,就好像你设计了一个窗口类,然后定义了一个窗口类的基本特征以后,你还需要将你这个类进行某种个性化,比如说你想用一个BOOL标记这种类的对象窗口是否带背景音乐功能,你cbClsExtra的大小应该设置为sizeof(bool),然后你的窗口,也可以指定其有一个保留内存大小,比如说你想通过一个字符串来指定背景音乐的路径,这时你的cbWndExtra的值可以设置为一定大小,你的音乐字符串大小不能超过此值。 你看SIZEOF()这个值当然应该是相同的了,这个SIZEOF的结果是cbWndExtra与cbClsExtra的数据类型的大小 GetStockObject 函数功能:该函数检索预定义的备用笔、刷子、字体或者调色板的句柄。 函数原型:HGDIOBJ GetStockObject(int fnObject); 参数: fnObject:指定对象的类型,该参数可取如下值之一; BLACK_BRUSH:黑色画笔;DKGRAY_BRUSH:暗灰色画笔;DC_BRUSH:在Windows98,Windows NT 5.0和以后版本中为纯颜色画笔,缺省色为白色,可以用SetDCBrushColor函数改变颜色,更多的信息参见以下的注释部分。GRAY_BRUSH:灰色画笔;HOLLOW_BRUSH:空画笔(相当于HOLLOW_BRUSH); LTGRAY_BRUSH:亮灰色画笔;NULL_BRUSH:空画笔(相当于HOLLOW_BRUSH); WHITE_BRUSH:白色画笔;BLACK_PEN:黑色钢笔; DC_PEN:在Windows98、Windows NT 5.0和以后版本中为纯色钢笔,缺省色为白色,使用SetDCPenColor函数可以改变色彩,更多的信息,参见下面的注释部分。 WHITE_PEN:白色钢笔;ANSI_FIXED_FONT:在Windows中为固定间距(等宽)系统字体; ANSI_VAR_FONT:在Windows中为变间距(比例间距)系统字体; DEVICE_DEFAUCT_FONT:在WindowsNT中为设备相关字体; DEFAULT_GUI_FONT:用户界面对象缺省字体,如菜单和对话框; OEM_FIXED_FONT:原始设备制造商(OEM)相关固定间距(等宽)字体; SYSTEM_FONT:系统字体,在缺省情况下,系统使用系统字体绘制菜单,对话框控制和文本; SYSTEM_FIXED_FONT:固定间距(等宽)系统字体,该对象仅提供给兼容16位Windows版本; DEFAULT_PALETTE:缺省调色板,该调色板由系统调色板中的静态色彩组成。 返回值:如果成功,返回值标识申请的逻辑对象,如果失败,返回值为NULL。 因篇幅问题不能全部显示,请点此查看更多更全内容