Windows编程二之Windows内部运行机制详解
声明:本文主要根据IT学吧 小金鱼的Windows程序设计视频教程而写,原文有许多素材来之视频。
一、Windows内部运行机制详解
Windows操作系统负责管理所有的窗体,想要设计一个窗体,可以类比一个朋友想要开一个公司,设计一个窗体时,一个需要五步:
第一步:向操作系统注册此窗体类 类比:向有关部门注册公司
第二步:注册成功以后,开始创建窗口 类比:创建公司
第三步:显示更新窗口 类比:公司开张
第四步:消息循环 类比:接受业务来往
第五步:处理消息 类比:处理业务
具体代码如下:
#include<Windows.h> #include<tchar.h> /*第一个参数:传入一个窗口句柄,由操作系统自动生成 *第二个参数:传入上一个窗口的句柄,Win32程序现在一般不用,设置为null *第三个参数:长指针类型,传入一个程序运行的时候的命令行 *第四个参数:窗口默认显示方式,比如全屏,最小化等 */ extern LRESULT CALLBACK WindowProc(HWND hWDd,UINT uMsg,WPARAM wParam,LPARAM lparam );//声明过程函数,在注册窗口的时候,会使用到。 int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmLine, int nShowCmd) { const TCHAR pClassName[] = _T("WindowsDemo"); //这个窗体的名字,类似BUTTON,用来用来唯一标识该窗体 WNDCLASSEX wcex; //申请一个窗口,设计窗口的样式 //实例化窗口类对象 wcex.cbSize = sizeof(WNDCLASSEX);//对象的大小 wcex.cbClsExtra = 0; //指定紧跟在窗口类结构后的附加字节数 wcex.cbWndExtra = 0; //指定紧跟在窗口实例的附加字节数 wcex.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);//指定窗口背景颜色 wcex.hCursor = ::LoadCursor(NULL,IDC_ARROW);//指定光标的样式。比如输入样式:I,正常鼠标等,::两个冒号代表是调用的系统的API函数 wcex.hIcon = ::LoadIcon(NULL,IDI_APPLICATION);//指定图标,也可以自己设计 wcex.hIconSm = ::LoadIcon(NULL,IDI_APPLICATION);//指定小型图标 wcex.hInstance = hInstance;//将操作系统生成的句柄传递给我们所绑定的窗口 wcex.lpfnWndProc = WindowProc;//过程处理函数,回调函数,用来处理消息 wcex.lpszClassName = pClassName;//窗口类名 wcex.lpszMenuName = NULL;//菜单类名 wcex.style = CS_HREDRAW | CS_VREDRAW;//窗口样式 /*1.注册这个窗口类*/ BOOL bRet = ::RegisterClassEx(&wcex);//窗口有可能会注册失败,因此会返回一个布尔值 if (!bRet) { MessageBox(NULL,_T("提示"),_T("注册窗口失败!"),MB_OK); return FALSE; } /*2.创建窗口*/ /*hWnd窗口句柄,和hInstance的区别:hInstance是整个应用程序的句柄,hWnd是这个应用程序的某个窗口的句柄,一个应用程序可能包含几个窗口*/ HWND hWnd = ::CreateWindowEx( 0, //窗口扩展风格[double类型] pClassName,//窗口类名称[CHAR指针类型] _T("Windows"),//窗口的标题[CHAR指针类型] WS_VISIBLE | WS_OVERLAPPEDWINDOW,//窗口的风格[INT] CW_USEDEFAULT,//窗口默认位子的X坐标(左上角)[INT] CW_USEDEFAULT,//窗口默认位子的Y坐标(左上角)[INT] CW_USEDEFAULT,//窗口默认大小宽度[INT] CW_USEDEFAULT,//窗口默认大小高度[INT] NULL,//父窗口的句柄 NULL,//菜单的句柄或是子窗口的标识符 hInstance,//当前的实例的句柄 NULL//指向窗口的创建数据 ); //因为有可能会创建失败,创建失败后返的句柄的null。 if (hWnd==NULL) { MessageBox(NULL, _T("提示"), _T("创建窗口失败!"), MB_OK); return FALSE; } /*3.显示窗口*/ ::ShowWindow(hWnd,SW_SHOW); ::UpdateWindow(hWnd);//刷新窗口 /*4.消息循环*/ MSG msg; while (GetMessage(&msg,NULL,0,0)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } return TRUE; } /*5.处理消息*/ LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { //关闭的消息 case WM_CLOSE: ::DestroyWindow(hWnd); return 0; //销毁应用程序的消息 case WM_DESTROY: ::PostQuitMessage(0); return 0; default: break; }//否则返回默认的操作系统处理函数 return ::DefWindowProc(hWnd,uMsg,wParam,lParam); }
在以上代码中,为了字符集的兼容性,在预定义中,有
WinMain _tWinMain
LPSTR LPTSTR
char TCHAR
普通字符串 _T()