Windows API 程序设计入门(创建第一个窗口)
目的
- 了解 windows操作系统应用程序开发的基本概念,win32 API函数、消息与事件驱动;
- 掌握WinMain函数的基本框架,窗口定义、窗口创建、消息循环及窗口过程函数;
参考书目
《Windows程序设计》《深入浅出MFC》《VC++深入讲解》
利用Visual Studio 2015创建窗口
- 打开Visual Studio 2015
- “文件” —> “新建” —> “项目” —> “Win32项目”
在下方输入项目名称"Winmainproject1";
- “头文件” —> “添加” —> “新建项” —> “C++文件”;
- 定义 WinMain 函数;
- 设计窗口类 WNDCLASS;
- 创建窗口;
- 显示及刷新窗口;
- 定义消息结构体,开始消息循环;
- 编写窗口过程函数;
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WinSunProc(
HWND hwnd, // 窗口句柄
UINT uMsg, // 消息标识符
WPARAM wParam, // 第一个消息参数
LPARAM lParam // 第二个消息参数
);
int WINAPI WinMain(
HINSTANCE hInstance, // 当前实例句柄
HINSTANCE hPrevInstance, // 上一个实例句柄
LPSTR lpCmdLine, // 命令行
int nCmdShow // 显示状态
)
{ //设计一个窗口类
WNDCLASS wndcls;
wndcls.cbClsExtra = 0;
wndcls.cbWndExtra = 0;
wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);
wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);
wndcls.hInstance = hInstance;
wndcls.lpfnWndProc = WinSunProc;
wndcls.lpszClassName = "yolo";
wndcls.lpszMenuName = NULL;
wndcls.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndcls);
//创建窗口
HWND hwnd;
hwnd = CreateWindow("yolo", "yolo", WS_OVERLAPPEDWINDOW,
0, 0, 600, 400, NULL, NULL, hInstance, NULL);
//显示及刷新窗口
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);
//定义消息结构体,开始消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
//编写窗口过程函数
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_CHAR:
char szChar[20];
sprintf(szChar, "char is %d", wParam);
MessageBox(hwnd, szChar, "weixin", 0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd, "鼠标左键点击", "鼠标左键点击", 0);
HDC hdc;
hdc = GetDC(hwnd);
TextOut(hdc, 0, 50, "you only live once", strlen("you only live once"));
ReleaseDC(hwnd, hdc);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC = BeginPaint(hwnd, &ps);
TextOut(hDC, 0, 0, "第一个win32", strlen("第一个win32"));
EndPaint(hwnd, &ps);
break;
case WM_CLOSE:
if (IDYES == MessageBox(hwnd, "确定要走了吗?", "", MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
效果如下
-
运行
-
退出