#include<windows.h> //win32程序需要包含<windows.h>
#include<TCHAR.h> //程序中使用了TCHAR类型,因此需要包含<TCHAR.h>
static TCHAR szWindowClass[] = _T("WindowClass"); //窗口名字
static TCHAR szTitle[] = _T("我的窗口程序"); //窗口标题
//(先看一至四)第五步:窗口函数中处理窗口消息
//如仅在此做声明,函数的实现可以放到主函数后边,也就是第五步放到第四步之后
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
//CALLBACK代表这个函数是回调函数,也就是作为主函数的参数(这里是在注册窗口时作为
//WNDCLASSEX声明的wcex的成员被主函数调用
{
PAINTSTRUCT ps;//每个需要显示的窗口都需有一个PAINTSTRUCT结构来记录一些绘制信息,
//PAINTSTRUCT结构保存了窗口绘制信息用来绘制窗口
HDC hdc = {0};//HDC是指向窗体、控件的句柄(带H的基本都是句柄类型),是长整类型。
//它唯一标识了如窗口,按钮等对象。由Windows系统定义。
TCHAR greeting[] = _T("祝大家好!!!"); //窗口中显示的文字
switch (uMsg) //接收第四步DispatchMessage()发出得消息或者系统直接发出的消息
{
case WM_PAINT: //接到由系统发出的WM_PAINT消息时,画出窗口
hdc = BeginPaint(hWnd, &ps);//开始画hWnd窗口,画窗口的
//可以理解为:hWnd是第二步注册的句柄,但还没
//实际画出,而hdc是已经画出来的窗口的句柄;
//如没有向窗口中写入内容的需要,"hdc="可以没
//空白窗口照样可以画出,hdc是将画出的窗口的句
//柄,这个句柄为写入这个窗口内容的语句使用
TextOut(hdc, 15, 15, greeting, _tcslen(greeting));//向窗口中写入内容
EndPaint(hWnd, &ps);
MessageBox(NULL, _T("回车继续"), _T("Tip"), NULL);
case WM_DESTROY://接到DispatchMessage()发来WM_DESTROY消息
PostQuitMessage(0);//通知系统进程中止退出
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);//由系统默认处理的其它消息
break;
}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
//第一步:注册窗口类:指定窗口的名称与窗口回调函数(在此步骤并无实质窗口显示出来)
WNDCLASSEX wx = { 0 }; //注意:1.注册的窗口类并不直接显示;
// 2.WNDCLASSEX成员很多,先赋值0;
// 3.赋值0后,除下面必要的给成员赋值外,其余赋值0的
// 均自动使用默认值。
wx.cbSize = sizeof(WNDCLASSEX); //因适应不同操作系统版本需要,必须如此赋值不能缺省。
wx.lpfnWndProc = WindowProc; //回调函数(在第五步实现),我们的显示内容在回调
//函数中实现
wx.lpszClassName = szWindowClass;//窗口名称:在程序开始定义
if (!RegisterClassEx(&wx)) //声明并赋值的wcex窗口类由RegisterClassEx()向系统注册
{
MessageBox(NULL, _T("注册窗口失败"), _T("Caption"), NULL);
}
//第二步:创建窗口,指定注册窗口类,窗口标题,窗口大小
HWND hWnd = CreateWindow( //该函数创建一个重叠式窗口、弹出式窗口或子窗口。hWnd是它的句柄。并
//指定窗口类、标题、风格、初始位置及大小(可选的)。
szWindowClass,//程序开始已定义:是窗口的名字,这里是"WindowClass"。这个名字已在第一步注册。
szTitle, //程序开始已经定义:是窗口的标题,这里是"我的窗口程序"。
WS_OVERLAPPEDWINDOW,//窗口类型
CW_USEDEFAULT,//初始位置 x 用缺省
CW_USEDEFAULT,//初始位置 y 用缺省
500, 300,//窗口大小:x=500 y=300
NULL, //指向被创建窗口的父窗口或所有者窗口的句柄
NULL, //菜单句柄
hInstance,//应用程序当前实例句柄(注意,只有运行中的程序实例,才有实例句柄)
NULL//指向一个值的指针,该值传递给窗口 WM_CREATE 消息
);
if (!hWnd)
{
MessageBox(NULL, _T("创建窗口失败"),_T("Tip"), NULL);
return 1;
}
//第三步:显示窗口
ShowWindow(hWnd, nCmdShow);//将窗口在屏幕上显示出来,显示模式nCmdShow按缺省
//第四步:开始消息循环
MSG msg = { 0 };//声明一个
while (GetMessage(&msg, NULL, 0, 0))//从系统消息队列里获得消息
{
TranslateMessage(&msg);//virtual-keys消息到characters消息
DispatchMessage(&msg); //分发消息
}
return (int)msg.wParam;//通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。
}