#include<iostream>
#include<windows.h>
using namespace std;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); //用来处理消息队列
//wWinMain 和 WinMain的区别 可以解决Unicode和ANSI之间的切换问题
int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nShowCmd)
{
//四个参数:
//hInstance:当前应用的句柄
//hprevious instance:上一个应用的句柄 通常设为NULL
//LPSTR cmdLine:用户和窗体之间的交互
UNREFERENCED_PARAMETER(hPrevInstance); //告诉编译器已经使用了这个变量
UNREFERENCED_PARAMETER(lpCmdLine); //告诉编译器已经使用了该变量
WNDCLASSEX wndClass = { 0 };
wndClass.cbSize = sizeof(WNDCLASSEX); //窗体类的大小,可以用sizeof来获取
wndClass.style = CS_HREDRAW | CS_VREDRAW; //窗体的风格
wndClass.lpfnWndProc = WndProc; //窗口函数处理指针
wndClass.cbClsExtra = 0; //指定紧跟在窗口类结构后的附加字数
wndClass.cbWndExtra = 0; //指定紧跟在窗口类结构后的附加字节数
wndClass.hInstance = hInstance; //本模块的实例句柄
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //图标的句柄
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //光标的句柄
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景画刷的句柄
wndClass.lpszMenuName = NULL; //指向菜单的指针
wndClass.lpszClassName = TEXT("DX11BookWindowClass"); //指向类名称的指针
wndClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO); //和窗口关联的小图标
//提交注册表单
if (!RegisterClassEx(&wndClass)) {
MessageBox(NULL, TEXT("Register Window failed!"), TEXT("Warning"), MB_OK);
return -1;
}
//设置窗体的大小
RECT rc = { 0, 0, 640, 480 }; //窗口规模 左上角坐标 宽度 高度
AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);
//创建一个标准的窗体
HWND hwnd = CreateWindowA("DX11BookWindowClass", "BLACK WIN32 Window", WS_OVERLAPPED, CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left,
rc.bottom - rc.top, NULL, NULL, hInstance, NULL);
//参数说明:
//(1)窗口类名:这里有个坑 这里填写的类名必须与上面注册的类名一致
//(2)窗体标题
//(3)窗体风格
//(4)坐标x
//(5)坐标y
//(6)宽度
//(7)高度
//(8)父类窗体的句柄
//(9)lpParam--
if (!hwnd) {
MessageBox(NULL, TEXT("Register Window failed!"), TEXT("Warning"), MB_OK);
return -1;
}
ShowWindow(hwnd, nShowCmd);
//窗体创建完毕后 开始消息循环
MSG msg = { 0 };
while (msg.message != WM_QUIT) //如果不退出的话 则一直循环
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg); //获取新的消息
DispatchMessage(&msg); //派遣消息
}
else {
//Update 更新
//Draw 绘制
}
}
return static_cast<int>(msg.wParam); //把expression转换为type-id
}
//消息队列
//每当消息循环获取到新消息后 开始处理消息
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
PAINTSTRUCT ps;
HDC hdc;
switch (message) //选择消息类型进行处理
{
case WM_PAINT: { //窗体绘制
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
}break;
case WM_CLOSE: { //窗体关闭
PostQuitMessage(0);
DestroyWindow(hWnd);
}break;
case WM_DESTROY: {
PostQuitMessage(0);
break;
}
default:{
return DefWindowProc(hWnd, message, wParam, lParam); //确保每个消息都得到处理
}
}
}
windows窗体程序的创建
最新推荐文章于 2024-04-10 22:00:22 发布