Win32创建一个简单的窗口
环境:Win10专业版 VS2017 桌面应用程序
在该环境下创建一个Hello World!的桌面应用程序:
直接贴上代码:里面包含有代码的具体解释,无论多么大,多么复杂的窗口软件,都是在这个基础上面增加的。
#include "stdafx.h"
#pragma comment(lib, "winmm") //使用了该函数PlaySound,在winmm.lib
LRESULT WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); //声明窗口过程函数
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdline,
int nCmdShow)
{
//声明一个窗口类
WNDCLASS wc = { 0 };
wc.hbrBackground = (HBRUSH)GetStockObject(COLOR_WINDOW + 1); //该窗口类的背景
wc.hCursor = LoadCursor(NULL, IDC_ARROW); //光标
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //图标
wc.hInstance = hInstance; //实例化的句柄
wc.lpfnWndProc = WndProc; //窗口过程函数
wc.lpszClassName = "HelloWin"; //窗口类名
wc.lpszMenuName = NULL; //菜单栏的名称
wc.style = CS_HREDRAW | CS_VREDRAW; //窗口类的风格设置
//注册窗口类
if (!RegisterClass(&wc)) //注册窗口类
{
MessageBox(NULL, //注册失败就弹出消息警告框
TEXT("注册窗口类失败"),
TEXT("HelloWin"),
MB_ICONEXCLAMATION
);
return 0;
}
//创建窗口类
HWND hWnd = CreateWindow("HelloWin", //该窗口使用的窗口类的名称
"FirstWindows", //窗口标题名
WS_OVERLAPPEDWINDOW, //窗口风格
CW_USEDEFAULT, //窗口左上角的横坐标(这里使用默认值)
CW_USEDEFAULT, //窗口左上角的纵坐标(这里使用默认值)
CW_USEDEFAULT, //窗口的宽度
CW_USEDEFAULT, //窗口的高度
NULL, //父窗口的句柄
NULL, //菜单的句柄
hInstance, //窗口实例化的句柄
NULL //将WM_CREATE消息中通过的lParam传递给窗口的回调函数
);
//显示窗口
ShowWindow(hWnd, SW_SHOW);
//刷新窗口
UpdateWindow(hWnd);
//消息循环处理
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) //获取消息
{
TranslateMessage(&msg); //将虚拟键消息转换为字符消息。字符消息被发送到调用线程的消息队列,在下一次线程调用GetMessage或PeekMessage函数时读取
DispatchMessage(&msg); //将消息分派给窗口过程。它通常用于分派由GetMessage函数检索的消息。
}
return msg.wParam;
}
LRESULT WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //窗口过程函数的定义
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch (uMsg)
{
case WM_CREATE: //创建时刻的消息
PlaySound(TEXT("Hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC);
break;
case WM_PAINT: //描绘时刻的消息
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rect);
DrawText(hdc, TEXT("Hellow 愿意百年挽朝夕, 2017.11.12"), -1, &rect, DT_SINGLELINE | DT_VCENTER | DT_CENTER);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY: //销毁窗口时刻的消息
PostQuitMessage(0); //销毁的动作
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam); //当不是以上这些消息的时候,就会默认调用该函数处理
}
return 0;
}
再来一个运行成功的截图:
最后附上完整代码的项目:
链接:http://pan.baidu.com/s/1hs0908G 密码:74ne