Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1722999
  • 博文数量: 1493
  • 博客积分: 38
  • 博客等级: 民兵
  • 技术积分: 5834
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-19 17:28
文章分类

全部博文(1493)

文章存档

2016年(11)

2015年(38)

2014年(137)

2013年(253)

2012年(1054)

2011年(1)

分类:

2012-10-25 18:17:26

原文地址:窗口与消息 作者:Q_Tao

本文主要涉及知识点:
一.窗口的创建过程
   1.设计窗口类
   2.注册窗口类
   3.创建窗口
   4.显示窗口
二.获取设备描述表的两种方法
   BeginPaint和GetDC获取设备描述表的区别:(获取设备描述表的两种方法)
   ①GetDC不会使无效区域变为有效,可以通过Validate使之有效
   ②GetDC获取的设备描述表所指区域为整个客户区,而BeginPaint获取的是无效区域
三.应用程序的退出过程
   1.窗口关闭的时候会给窗口过程发送一个WM_SYSCOMMAND消息
   2.窗口过程接收到WM_SYSCOMMAND消息后,会调用DefWindowProc来发送一个WM_CLOSE消息
   3.如果不处理WM_CLOSE消息,DefWindowProc会默认调用DestroyWindow来发送WM_DESTROY消息
   4.接收到WM_DESTROY消息后,调用PostQuitMessage发送WM_QUIT消息
   5.GetMessage接收到WM_QUIT消息后,返回0,退出消息循环,程序结束

实例:

点击(此处)折叠或打开

  1. #include <windows.h>

  2. //回调函数声明
  3. LRESULT CALLBACK MyProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );

  4. //主函数
  5. int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance
  6.                  HINSTANCE hPrevInstance, // handle to previous instance
  7.                  LPSTR lpCmdLine, // command line
  8.                  int nCmdShow ) // show state
  9. {
  10.     const char clsName[] = "mycls"; //窗口类名称
  11.     HWND hFirstWnd;//创建的窗口的句柄
  12.     WNDCLASS cls; //wndclass结构体
  13.     MSG msg;//消息结构体
  14.     
  15.     //填充wndclass结构体
  16.     cls.cbCl***tra= 0;
  17.     cls.cbWndExtra= 0;
  18.     cls.hbrBackground= HBRUSH( GetStockObject( WHITE_BRUSH ) );
  19.     cls.hCursor = LoadCursor( NULL, IDC_ARROW );
  20.     cls.hIcon = LoadIcon( NULL, IDI_WARNING );
  21.     cls.hInstance = hInstance;
  22.     cls.lpfnWndProc= MyProc;
  23.     cls.lpszClassName= "mycls";
  24.     cls.lpszMenuName= NULL;
  25.     cls.style = CS_VREDRAW | CS_HREDRAW;
  26.         
  27.     //注册窗口类
  28.     if( !RegisterClass(&cls) )
  29.     {
  30.         return 0;
  31.     }
  32.     
  33.     //创建窗口
  34.     hFirstWnd = CreateWindow(
  35.         clsName, //窗口类名称,必须与注册的窗口类名称一致及与lpszClassName一致
  36.         "hello world",//窗口的标题
  37.         WS_OVERLAPPEDWINDOW,//窗口的style,是否有最大最小等按钮
  38.         CW_USEDEFAULT,//窗口左上角x坐标
  39.         CW_USEDEFAULT,//窗口左上角y坐标
  40.         CW_USEDEFAULT,//窗口的宽
  41.         CW_USEDEFAULT,//窗口的高
  42.         NULL, //父窗口
  43.         NULL, //菜单menu
  44.         hInstance, //实例,与main中一致
  45.         NULL //传递的参数,在窗口创建WM_CREATE的时候传递给msg的lparam
  46.         );
  47.     
  48.     
  49.     //创建完成后显示窗口
  50.     ShowWindow( hFirstWnd, nCmdShow );
  51.     //UpdateWindow更新窗口,此时会使客户区域无效,发送WM_PAINT消息,WM_PAINT使区域有效
  52.     UpdateWindow(hFirstWnd);
  53.     //消息循环
  54.     //GetMessage在接收到WM_QUIT消息时,返回0,消息循环结束
  55.     while ( GetMessage( &msg, NULL, 0, 0 ) )
  56.     {
  57.         TranslateMessage( &msg );//转化键盘按键等消息
  58.         DispatchMessage( &msg );//分发给相应窗口来处理
  59.     }
  60.     return msg.wParam;
  61. }

  62. //回调函数的实现
  63. LRESULT CALLBACK MyProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
  64. {
  65.     PAINTSTRUCT ps;
  66.     HDC hdc;
  67.     RECT rect;
  68.     char *szTmp = "hello world ! !";
  69.     
  70.     
  71.     switch( uMsg )
  72.     {
  73.         /*====================设备描述表的两种方法的区别================================
  74.         **1.WM_PAINT的调用,是因为客户区域无效
  75.         **2.如果不调用BeginPaint和EndPaint,不会使无效的区域有效
  76.         ** 这样的话,系统就会一直发送WM_PAINT消息,死循环
  77.         **3.BeginPaint和GetDC获取设备描述表的区别:(获取设备描述表的两种方法)
  78.         ** ①GetDC不会使无效区域变为有效,可以通过Validate使之有效
  79.         ** ②GetDC获取的设备描述表所指区域为整个客户区,而BeginPaint获取的是无效区域
  80.         **==============================================================================
  81.         */
  82.     case WM_PAINT:
  83.         hdc = BeginPaint( hwnd, &ps );
  84.         GetClientRect( hwnd, &rect );
  85.         DrawText( hdc, szTmp, -1, /*-1表示自动计算字符串的长度*/
  86.             &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER );
  87.         EndPaint( hwnd, &ps);
  88.         return 0;
  89.         /*==================程序的退出过程==============================================
  90.         **1.窗口关闭的时候会给窗口过程发送一个WM_SYSCOMMAND消息
  91.         **2.窗口过程接收到WM_SYSCOMMAND消息后,会调用DefWindowProc来发送一个WM_CLOSE消息
  92.         **3.如果不处理WM_CLOSE消息,DefWindowProc会默认调用DestroyWindow来发送WM_DESTROY消息
  93.         **4.接收到WM_DESTROY消息后,调用PostQuitMessage发送WM_QUIT消息
  94.         **5.GetMessage接收到WM_QUIT消息后,返回0,退出消息循环,程序结束
  95.         **==============================================================================
  96.         */
  97.     case WM_CLOSE:
  98.         DestroyWindow(hwnd); //destroywindow发送一个WM_DESTROY消息
  99.         return 0;
  100.     case WM_DESTROY:
  101.         PostQuitMessage( 0 ); //postquitmessage发送一个WM_QUIT消息
  102.         return 0;
  103.     default:
  104.         return DefWindowProc( hwnd, uMsg, wParam, lParam );
  105.     }
  106. }


 

阅读(260) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~