|
今天照着书打了第一个Windows可视化的窗口大概,写一些自己理解的东西。
自己的感觉就是首先需要定义函数窗口的说明,可能在WinMain()函数中会用到这个定义的窗口函数。
然后开始编写 WinMain()函数,函数的参数有点多,初学记起来有些困难。
不是很能理解那些参数的意义。感觉首先要做的事情就是定义一个窗口的类,然后在给这个窗口的类里面的东西赋值,
里面有一堆变量名称,依次的进行赋值。
然后调用窗口类的注册函数进行注册,成功以后会返回一个句柄,而那个句柄hWnd可以给之后的窗口的函数里面的形参赋值。
接下来显示窗口和刷新窗口,消息循环的那个逻辑,为什么要那样,现在不是很清楚。慢慢再看书吧。
/*
这里写WinMain函数的定义
int WINAPI WinMain(HINSTANCE hThisInst,HINSTANCE hPrevInst,LPSTR lpszCmd,Int nCmdShow);
*/
//windows.h文件中包含应用程序中所需的数据类型和数据结构的定义
#include<windows.h>
#include<tchar.h>
//函数的窗口说明
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow) {
WNDCLASSEX wcex;
HWND hWnd;
MSG msg;
TCHAR szWindowClass[] = _T("窗口示例");//窗口类名
TCHAR szTitle[] = _T("My WIndows");//窗口标题名
wcex.cbSize = sizeof(WNDCLASSEX);//窗口类的大小
wcex.style = 0;//窗口类型为默认类型
wcex.lpfnWndProc = WndProc;//窗口处理函数为WndProc
wcex.cbClsExtra = 0;//窗口类无扩展
wcex.cbWndExtra = 0;//窗口示例无扩展
wcex.hInstance = hInstance;//当前实例句柄
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));//窗口的图标为默认图标
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);//窗口采用箭头光标
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景颜色为白色
wcex.lpszMenuName = NULL;//窗口中无菜单
wcex.lpszClassName = szWindowClass;//窗口类名为窗口示例
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));//窗口的小图标为默认图标
//------以下进行窗口类的注册------
if (!RegisterClassEx(&wcex)) {
MessageBox(NULL, _T("窗口类注册失败了"), _T("窗口注册"), NULL);
return 1;
}
//------以下创建窗口--------
//返回值用于给之后的CALLBACK那个函数来调用
hWnd = CreateWindow(
szWindowClass,//窗口类名
szTitle,//窗口实例的标题名
WS_OVERLAPPEDWINDOW,//窗口的风格
CW_USEDEFAULT, CW_USEDEFAULT,//窗口的左上角坐标为默认值
CW_USEDEFAULT, CW_USEDEFAULT,//窗口的高和宽为默认值
NULL,//窗口无默认值
NULL,//窗口无主菜单
hInstance,//创建此窗口应用程序的当前句柄
NULL//不使用该值
);
if (!hWnd) {
MessageBox(NULL,_T("创建窗口失败"),_T("创建窗口"),NULL);
return 1;//如果这里不加返回值的话,程序将在这里卡死,导致后面的部分没用作用了
}
ShowWindow(hWnd, nCmdShow);//显示窗口
UpdateWindow(hWnd);//绘制用户区
while (GetMessage(&msg, NULL, 0, 0)) {//消息循环
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;//程序终止时将信息返回系统
}
//-----以下是窗口函数的代码
LRESULT CALLBACK WndProc(
HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam) {
switch(message){
case WM_DESTROY:
PostQuitMessage(0);//调用PostQuitMessage函数发出WM_QUIT消息
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);//默认时采用系统消息默认处理函数
break;
}
return 0;
}
补充:看了书,和我昨天想的应该是一样的,Windows应用程序的运行以消息为核心,Windows将产生的消息放入应用程序的消息队列 中,应用程序的WinMain函数从消息循环提取队列中的消息,并将其传递给窗口函数的响应过程处理。
其中GetMessage的作用是从消息队列中读取一条消息,并将消息放在一个MSG结构中。
TranslateMessage函数负责将消息的虚拟键转换为字符信息
DispatchMessage函数(dispatch 调遣)将参数lpMSG指向的消息传送到制定的窗口函数中,当GEtMessage函数返回零值,即会检索到WM_QUITE消息,程序将结束循环并退出。 |