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.消息分为队列化和非队列化消息