创建窗口分几大步骤
1.设计窗口类
2.注册窗口类
3.创建窗口
4.显示/更新窗口
5.消息循环
#include <windows.h>
#include <tchar.h> //用于宽字符TCHAR操作
//消息处理函数的前置声明
LRESULT CALLBACK WindowsProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//主函数WinMain()
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,_In_ LPSTR CmdLine, _In_ int nShowCmd)
{
TCHAR clsName[] = TEXT("MyWindowsClass"); //窗口类名称
//设计窗口类
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX); //结构体的大小
wc.style = CS_HREDRAW | CS_VREDRAW; //指定大小改变就水平|垂直重画
wc.lpfnWndProc = WindowsProc; //窗口回调函数指针
wc.cbClsExtra = 0; //类的额外内存
wc.cbWndExtra = 0; //窗口的额外内存
wc.hInstance = hInstance; //实例句柄
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //使用预定义图标(大图标)
wc.hCursor = LoadCursor(NULL, IDC_ARROW); //使用预定义光标
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); //使用系统颜色
wc.lpszMenuName = NULL; //的指定菜单
wc.lpszClassName = clsName; //窗口类的名称
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //类的小图标
if (!RegisterClassEx(&wc)) //注册窗口类
return 0;
//创建窗口
HWND hWnd = ::CreateWindowExW(
0, //dwExStyle, 扩展样式
clsName, //lpClassName, 窗口类名
L"我的应用程序", //lpWindowName, 窗口显示的标题
WS_OVERLAPPEDWINDOW, //dwStyle, 窗口风格
CW_USEDEFAULT,/*200*/ //X, 初始X坐标
CW_USEDEFAULT,/*150*/ //Y, 初始Y坐标
CW_USEDEFAULT,/*800*/ //nWith, 宽度
CW_USEDEFAULT,/*500*/ //nHeight, 高度
NULL, //hWndParent, 父窗口句柄
NULL, //hMenu, 菜单句柄
hInstance, //hInstance, 实例句柄
NULL); //lParam, 用户数据
if (hWnd == NULL)
{
::MessageBox(hWnd, TEXT("创建窗口出错!"), TEXT("error"), MB_OK);
return -1;
}
//显示与更新窗口
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
//消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg); //转化键盘消息
DispatchMessage(&msg); //将消息发送到相应的窗口函数
}
return msg.wParam; //GetMessaage 返回FALSE 时程序结束
}
LRESULT CALLBACK WindowsProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
TCHAR szText[] = TEXT("最简单的窗口程序!");
switch (uMsg)
{
case WM_PAINT:
{
HDC hdc;
PAINTSTRUCT ps;
//使无效的客户区变的有效,并取得设备环境句柄
hdc = ::BeginPaint(hWnd, &ps);
//显示文字
::TextOut(hdc, 10, 10, szText, _tcslen(szText));
::EndPaint(hWnd, &ps);
return 0;
}
case WM_DESTROY: //正在销毁窗口
//向消息队列发送一个WM_QUIT消息,使GetMessage函数返回0
::PostQuitMessage(0);
return 0;
}
//不处理的消息交给系统默认处理
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
效果: