你的第一个Windows程序
在这个模块,我们编写一个最小的Windows程序。它的作用是创建并显示一个空白窗口。这第一个程序包含大约50行代码,不计算空白行和注释。这将是我们的起点;以后还会添加图形,文本,用户输入和其它功能。
示例程序屏幕截图
下面是完整的程序代码:
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg, WPARAM wParam,LPARAM lParam);
int wWinMain(HINSTANCE hInstance,HINSTANCE,PWSTR pCmdLine,int nCmdShow)
{
//注册窗口类
const wchar_t CLASS_NAME[]=L"Sample Window Class";
WNDCLASS wc = {};
wc.lpfnWndProc =WindowProc;
wc.hInstance =hInstance;
wc.lpszClassName =CLASS_NAME;
RegisterClass(&wc);
//创建窗口
HWND hwnd = CreateWindowEx(
0, //可选窗口样式
CLASS_NAME, //窗口类
L"Learn to Program Windows", //窗口文本
WS_OVERLAPPEDWINDOW, //窗口样式
//窗口大小和定位
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL, //父窗口
NULL, //菜单
hInstance, //实例句柄
NULL //其它应用程序的数据
);
if(hwnd == NULL)
{
return 0;
}
ShowWindow(hwnd,nCmdShow);
//运行消息循环
MSG msg = {};
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg, WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd,&ps);
FillRect(hdc,&ps.rcPaint,(HBRUSH)(COLOR_WINDOW+1));
EndPaint(hwnd,&ps);
return 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
你可以从Windows Hello World Sample下载完整的Visual Studio项目。
它会给出一个有帮助的简要概述,说明这段代码是做什么的。随后的主题将详细的分析代码。
- wWinMain是程序的入口点,当程序启动,他注册应用程序窗口某些行为的信息。其中最重要的信息是一个函数的地址,在这个例子中是WindowProc,这个函数定义窗口的行为——它的外观,如何与用户交互等等。
- 下一步,程序创建窗口和接收这个窗口唯一标识的句柄。
- 如果这个窗口顺利地创建,程序进入while循环,程序保持循环,直到程序关闭窗口并退出应用程序。
请注意程序没有显式地调用WindowProc函数,尽管我们说这是大多数应用程序逻辑的定义。Windows通过一系列的消息与程序通信,While循环内的代码驱动过程。每次程序调用 DispatchMessage 函数,每个消息间接的使Windows调用WindowProc函数。
详细的代码分析后续......