本文主要涉及知识点:
一.窗口的创建过程
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,退出消息循环,程序结束
实例:
- #include <windows.h>
- //回调函数声明
- LRESULT CALLBACK MyProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
- //主函数
- int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance
- HINSTANCE hPrevInstance, // handle to previous instance
- LPSTR lpCmdLine, // command line
- int nCmdShow ) // show state
- {
- const char clsName[] = "mycls"; //窗口类名称
- HWND hFirstWnd;//创建的窗口的句柄
- WNDCLASS cls; //wndclass结构体
- MSG msg;//消息结构体
-
- //填充wndclass结构体
- cls.cbCl***tra= 0;
- cls.cbWndExtra= 0;
- cls.hbrBackground= HBRUSH( GetStockObject( WHITE_BRUSH ) );
- cls.hCursor = LoadCursor( NULL, IDC_ARROW );
- cls.hIcon = LoadIcon( NULL, IDI_WARNING );
- cls.hInstance = hInstance;
- cls.lpfnWndProc= MyProc;
- cls.lpszClassName= "mycls";
- cls.lpszMenuName= NULL;
- cls.style = CS_VREDRAW | CS_HREDRAW;
-
- //注册窗口类
- if( !RegisterClass(&cls) )
- {
- return 0;
- }
-
- //创建窗口
- hFirstWnd = CreateWindow(
- clsName, //窗口类名称,必须与注册的窗口类名称一致及与lpszClassName一致
- "hello world",//窗口的标题
- WS_OVERLAPPEDWINDOW,//窗口的style,是否有最大最小等按钮
- CW_USEDEFAULT,//窗口左上角x坐标
- CW_USEDEFAULT,//窗口左上角y坐标
- CW_USEDEFAULT,//窗口的宽
- CW_USEDEFAULT,//窗口的高
- NULL, //父窗口
- NULL, //菜单menu
- hInstance, //实例,与main中一致
- NULL //传递的参数,在窗口创建WM_CREATE的时候传递给msg的lparam
- );
-
-
- //创建完成后显示窗口
- ShowWindow( hFirstWnd, nCmdShow );
- //UpdateWindow更新窗口,此时会使客户区域无效,发送WM_PAINT消息,WM_PAINT使区域有效
- UpdateWindow(hFirstWnd);
- //消息循环
- //GetMessage在接收到WM_QUIT消息时,返回0,消息循环结束
- while ( GetMessage( &msg, NULL, 0, 0 ) )
- {
- TranslateMessage( &msg );//转化键盘按键等消息
- DispatchMessage( &msg );//分发给相应窗口来处理
- }
- return msg.wParam;
- }
- //回调函数的实现
- LRESULT CALLBACK MyProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
- {
- PAINTSTRUCT ps;
- HDC hdc;
- RECT rect;
- char *szTmp = "hello world ! !";
-
-
- switch( uMsg )
- {
- /*====================设备描述表的两种方法的区别================================
- **1.WM_PAINT的调用,是因为客户区域无效
- **2.如果不调用BeginPaint和EndPaint,不会使无效的区域有效
- ** 这样的话,系统就会一直发送WM_PAINT消息,死循环
- **3.BeginPaint和GetDC获取设备描述表的区别:(获取设备描述表的两种方法)
- ** ①GetDC不会使无效区域变为有效,可以通过Validate使之有效
- ** ②GetDC获取的设备描述表所指区域为整个客户区,而BeginPaint获取的是无效区域
- **==============================================================================
- */
- case WM_PAINT:
- hdc = BeginPaint( hwnd, &ps );
- GetClientRect( hwnd, &rect );
- DrawText( hdc, szTmp, -1, /*-1表示自动计算字符串的长度*/
- &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER );
- EndPaint( hwnd, &ps);
- return 0;
- /*==================程序的退出过程==============================================
- **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,退出消息循环,程序结束
- **==============================================================================
- */
- case WM_CLOSE:
- DestroyWindow(hwnd); //destroywindow发送一个WM_DESTROY消息
- return 0;
- case WM_DESTROY:
- PostQuitMessage( 0 ); //postquitmessage发送一个WM_QUIT消息
- return 0;
- default:
- return DefWindowProc( hwnd, uMsg, wParam, lParam );
- }
- }
阅读(1763) | 评论(0) | 转发(1) |