Windows核心编程第01天 创建窗口
1.入口函数WinMain,该函数的功能是被系统调用,作为一个32位应用程序的入口点。
int WINAPI WinMain( HINSTANCE hInstance, //应用程序当前实例的句柄。
HINSTANCE hPrevInstance, //应用程序的先前实例的句柄。对于同一个程序打开两次,出现两个窗口第一次打开的窗口就是先前实例的窗口。对于一个32位程序,该参数总为NULL。
LPSTR lpCmdLine, //指向应用程序命令行的字符串的指针,不包括执行文件名。pCmdLine是一个以空终止的字符串,指定传递给应用程序的命令行参数。
int nCmdShow) //指明窗口如何显示。
2.WNDCLASS,该结构包含一个窗口类的全部信息,也是Windows编程中使用的基本数据结构之一,应用程序通过定义一个窗口类确定窗口的属性
typedef struct _WNDCLASS { UINT style; // 窗口类型 WNDPROC lpfnWndProc; //窗口处理函数 int cbClsExtra; //窗口扩展 int cbWndExtra; //窗口实例扩展 HINSTANCE hInstance; //实例句柄 HICON hIcon; //窗口的最小化图标 HCURSOR hCursor; //窗口鼠标光标 HBRUSH hbrBackground; //窗口背景色 LPCTSTR lpszMenuName; //窗口菜单 LPCTSTR lpszClassName;// 窗口类名 } WNDCLASS, *LPWNDCLASS;
初始化代码如下:
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW; //设置当水平长度或垂直长度改变或移动窗口时,重画整个窗口 wndclass.lpfnWndProc = (WNDPROC)WinSunProc; //设置WinSunProc为窗口处理函数 wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; // wndclass.hIcon = LoadIcon(NULL, IDI_ERROR); //设置图标为系统的错误图标 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //设置鼠标光标为系统箭头光标 wndclass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH); //设置背景画刷为深灰色 wndclass.lpszMenuName = NULL; //无窗口菜单 wndclass.lpszClassName = L"WeiXin"; //设置窗口类名
3.注册窗口
RegisterClass(&wndclass);
4.创建窗口
HWND hwnd; hwnd = CreateWindow(L"WeiXin", //指定窗口类名,这可以是任何用函数RegisterClass注册的类名,或是任何预定义的控制类名。
L"测试", //设置窗口名字
WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, //设置无最大化(~WS_MAXIMIZEBOX表示取反最大化窗口)窗口风格
100, 100, 640, 480, //窗口初始位置设置为(100,100),大小为640x480
NULL, //无父窗口设为NULL
NULL, //无菜单设为NULL
hInstance, //窗口实例句柄
NULL); //窗口创建数据
5.显示并更新窗口
ShowWindow(hwnd, SW_SHOWNORMAL); //设置正常显示
UpdateWindow(hwnd);
6.消息循环(保证窗口一直显示)
MSG msg; while (GetMessage(&msg, NULL, 0, 0)) //设置NULL表示接收所有窗口消息 { TranslateMessage(&msg); DispatchMessage(&msg); }
完整代码如下:
#include <Windows.h> #include <stdio.h> LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { return DefWindowProc(hwnd, uMsg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = (WNDPROC)WinSunProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_ERROR); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = L"WeiXin"; RegisterClass(&wndclass); HWND hwnd; hwnd = CreateWindow(L"WeiXin", L"测试", WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, 100, 100, 640, 480, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, SW_SHOWNORMAL); UpdateWindow(hwnd); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }