代码改变世界

Windows编程——窗口生成的过程

2019-04-12 13:18  徐徐风  阅读(1768)  评论(0编辑  收藏  举报
 1 #include<windows.h>
 2 
 3 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//CALLBACK函数由Windows调用 

WndProc函数用来处理用户在窗口上下达的指令。

步骤:

1.窗口类结构 WNDCLASS

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int iCmdShow)
{
    static TCHAR szAppName[]=TEXT("类的名字");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;
                                 //CS 类风格选项 
    wndclass.style=CS_HREDRAW|CS_VREDRAW;// 调整高度(vehicle)、宽度(horizon)后是否重绘窗口 
    wndclass.lpfnWndProc=WndProc;//
    wndclass. cbClsExtra=0;//预留的额外空间 
    wndclass.cbWndExtra=0;//预留的额外空间 
    wndclass.hInstance=hInstance;//应用程序的实力句柄 
    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//为所有基于该窗口的类 ;   IDI图标的ID号,IDIcon 
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW) ;// 光标;    IDC光标的ID号 ,IDCursor 
    wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);// 
    wndclass.lpszMenuName=NULL;//菜单 
    wndclass.lpszClassName=szAppName;//窗口类的名字,第七行

2.注册窗口类 RegisterClass

1     if(!RegisterClass(&wndclass)) 
2     {                                                                    //MB  消息框选项 
3         MessageBox(NULL,TEXT("这个程序需要在Windows NT才能执行!"),szAppName,MB_ICONERROR);
4         return 0;
5     }

 

3.创建窗口实例 CreateWindow  此时窗口在内存中诞生(句柄),但还未显示出。

 1     hwnd= CreateWindow(szAppName,
 2             TEXT("学习Windows编程"),
 3             WS_OVERLAPPEDWINDOW,// WS  窗口风格   OVERLAPPEDWINDOW很多属性叠加 
 4             CW_USEDEFAULT,//  初始x坐标                           CW 创建窗口选项  create window 
 5             CW_USEDEFAULT, //初始y坐标
 6             CW_USEDEFAULT,  //初始x方向尺寸
 7             CW_USEDEFAULT,//初始y方向尺寸
 8             NULL,            // 父窗口句柄
 9             NULL,   // 窗口菜单句柄
10             hInstance,   // 程序实例句柄
11             NULL);// 创建参数

 

4.显示窗口 ShowWindow

ShowWindow(hwnd,iCmdShow);//显示窗口 

 

5.更新窗口 UpdateWindow

 

 1 UpdateWindow(hwnd);//更新窗口
 2     
 3     
 4     //消息循环   
 5      while(GetMessage(&msg,NULL,0,0))
 6      {
 7          TranslateMessage(&msg);
 8          DispatchMessage(&msg);
 9     } 
10        
11       return msg.wParam;
12             
13 }

LRESULT  CALLBACK Wndproc函数

  hwnd是要处理窗口的句柄,message是消息ID,代表了不同的消息类型,wParam的值为按下按键的虚拟键码,lParam则存储按键的相关状态信息。

 7 
 8 
 9 
10 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
11 {
12         HDC hdc;
13         PAINTSTRUCT ps;//存放绘制窗口需要的参数 
14         RECT rect;  //定义了矩形左上角和右下角的坐标 
15 
16         switch (message)
17         {
18         case WM_PAINT:
19                 hdc = BeginPaint(hwnd, &ps);  //device context 设备环境 
20                 GetClientRect(hwnd, &rect);  //获得客户区位置坐标信息 
21                 DrawText(hdc, TEXT("这里是徐徐风的第一个窗口~"), -1, &rect,
22                         DT_SINGLELINE | DT_CENTER | DT_VCENTER);//分别是显示在 一行,居中,垂直居中  
23                 EndPaint(hwnd, &ps);
24                 return 0;
25         case WM_DESTROY:
26                 PostQuitMessage(0);
27                 return 0;
28         }
29 
30         return DefWindowProc(hwnd, message, wParam, lParam);
31 }

 

 

 

 

 

 

 

另外:

消息机制 : 1.FIFO  先进先出

                    2.WM_PAINT,WM_TIMER,WM_QUIT这三个消息时刻在消息队列最后

       3.消息分为队列化和非队列化消息