#include <Windows.h>
#include <stdio.h>
HINSTANCE hinst;
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
{
hinst = hinstance;//把系统传来的实例句柄用全局实例句柄变量保存起来,方便以后使用
//定义窗口类
WNDCLASSEX wcx;//末尾加EX代表扩展功能,比不加EX更强大
//给窗口对象赋值(手动初始化)
wcx.cbSize = sizeof(wcx);
wcx.style = CS_HREDRAW | CS_VREDRAW;
wcx.lpfnWndProc = MainWndProc;//窗口过程,由这个窗口过程处理消息,把这个与窗口过程联系起来了
wcx.cbClsExtra = 0;//不使用类内存
wcx.cbWndExtra = 0;//不使用窗口内存
wcx.hInstance = hinstance;
wcx.lpszMenuName = NULL;
wcx.lpszClassName = L"MainWClass";
wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcx.hCursor = LoadCursor(NULL, IDC_ARROW);//箭头形状 的鼠标指针
wcx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//用白色的画刷把窗口背景变白色
wcx.hIconSm = (HICON)LoadImage(hinstance,
MAKEINTRESOURCE(5)/*在5号资源里有一个图片*/, IMAGE_ICON,
GetSystemMetrics(SM_CXSMICON),//CX宽度
GetSystemMetrics(SM_CYSMICON),//CY高度
LR_DEFAULTCOLOR);
//先要注册这个窗口类,如果失败就会提前结束
if (!RegisterClassEx(&wcx))
{
return 1;
}
//注册成功后,使用窗口类创建窗口
//先要定义一个窗口句柄
HWND hwnd;//窗口句柄
hwnd = CreateWindow(L"MainWClass",
L"HELLO",
WS_OVERLAPPEDWINDOW,//微软最经典的样式
CW_USEDEFAULT,//左上角点的x值
CW_USEDEFAULT,//左上角点的y值
CW_USEDEFAULT,//窗口的长
CW_USEDEFAULT,//窗口的高
(HWND)NULL,
(HMENU)NULL,
hinstance,
(LPVOID)NULL);
if (!hwnd)//创建失败
{
return 1;
}
//显示窗口 如何显示是 Windows 告诉我们的 就是Winmain里面最后一个参数
ShowWindow(hwnd, CmdShow);
UpdateWindow(hwnd);//立即显示
//写消息循环 即去消息队列里取消息
//先要定义消息变量 和判断有没有取到消息
MSG msg;//消息变量
BOOL fGotMessage;//有没有取到消息
while (fGotMessage = GetMessage(&msg, (HWND)NULL, 0, 0) != 0)//用一个 循环不停取消息
{
TranslateMessage(&msg);//转化消息
DispatchMessage(&msg);//转发消息 转发给窗口
}
return msg.wParam;
}
// 窗口过程函数 消息处理
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
//每当要处理一个消息 就写一个 case
case WM_DESTROY:
PostQuitMessage(0);//发送一个退出消息给Windows
return 0;
default://我们不想去处理这个消息,就转给Windows去处理
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}
点击运行
这个是简化版 直接省略了菜单和其他的一些部分 自己写的目的是对这些代码有个深刻的了解