第一个WIndows可视化窗口的创建

论坛 期权论坛 脚本     
匿名技术用户   2021-1-15 00:39   32   0

今天照着书打了第一个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消息,程序将结束循环并退出。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP