#include <windows.h>//包含底层实现窗口的头文件
//第六步:处理消息窗口
//LRESULT 默认返回值
//CALLBACK代表着_stdcall的参数传递顺序,从右至左,依次入栈,并且在函数返回前,清空堆栈
LRESULT CALLBACK WindowProc(//函数名称与下面创建的回调函数名对应
HWND hwnd,//消息所处的窗口句柄
UINT uMsg,//具体的消息名称 底层的消息实现都是以WM_xxxx为消息名
WPARAM wParam,//键盘的附加消息
LPARAM IParam//鼠标的附加消息
)
{
switch (uMsg) {
case WM_CLOSE://关闭窗口应进行的步骤
DestroyWindow(hwnd);//DestroyWindow 发送另一个消息给 WM_DESTROY
//所有xxxwindow为结尾的方法,都不会进入到消息队列中,而是直接执行
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN://鼠标左键按下事件
{
int xPos = LOWORD(IParam);
int yPos = HIWORD(IParam);
char buf[1024];
wsprintf(buf, TEXT("x=%d,y=%d"), xPos, yPos);//打印光标的位置
MessageBox(hwnd, TEXT("windows"), TEXT("鼠标左键按下"), MB_OK);//弹出消息的窗口
break;
}
case WM_KEYDOWN://键盘事件
MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘按下"), MB_OK);
break;
case WM_PAINT://绘图事件
{
PAINTSTRUCT ps;//生成一个绘图结构体
HDC hdc=BeginPaint(hwnd, &ps);//返回值用HDC类型的变量接受
TextOut(hdc, 100, 100, TEXT("HELLO"), strlen("HELLO"));//开始绘图
EndPaint(hwnd, &ps);
}
}
//返回值默认处理方式
return DefWindowProc(hwnd, uMsg, wParam, IParam);
}
//WINAPI代表着_stdcall的参数传递顺序,从右至左,依次入栈,并且在函数返回前,清空堆栈
int WINAPI WinMain(
HINSTANCE hInstance,//应用程序的实例句柄
HINSTANCE hPrevInstance,//上一个应用的句柄
PSTR szCmdLine,//相当于 char *argv[]
int iCmdShow//显示命令
) {
//第一步:创建窗口对象
WNDCLASS wc;
//对各个属性初始化
wc.cbClsExtra = 0;//类的额外内存
wc.cbWndExtra = 0;//窗口的额外内存
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设置背景
wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标 如果第一个参数为 NULL 代表使用系统提供的光标
wc.hIcon = LoadIcon(NULL, IDI_ERROR);//设置图标 如果第一个参数为 NULL 代表使用系统提供的图标
wc.hInstance = hInstance;//应用程序实例句柄 传入WinMain中的形参即可
wc.lpszClassName = TEXT("我的窗口");//指定窗口类 名称
wc.lpszMenuName = NULL;//菜单名称
wc.style = 0;//显示风格 0代表默认风格
wc.lpfnWndProc = WindowProc;//回调函数 窗口过程
//第二步:注册窗口类
RegisterClass(&wc);
//第三步:创建窗口
/*具体形参(变量类型+变量名):
LPCTSTR lpClassName 窗口类名,要与注册时指定的名称相同
LPCTSTR lpWindowName 窗口标题
DWORD dwStyle 窗口样式 WS_OVERLAPPEDWINDOW
int x 窗口横坐标 程序默认值为:CW_USEDEFAULT
int y 窗口纵坐标
int nWidth 宽
int nHeight 高
HWND hWndParent 父窗口句柄 NULL
HMENU hMenu //菜单句柄 NULL
HINSTANCE hInstance // 应用程序实例句柄 hInstance
LPVOID lpParam 附加值 NULL
*/
//依次对应上面11个参数
//创建一个窗口句柄,接受其返回值
HWND hwnd = CreateWindow(wc.lpszClassName,
TEXT("我的窗口"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
//第四步:显示和更新
//hwnd作为函数的第一个参数,nCmdShow 即展示方法(光标移至函数名 即可查看 函数类型 参数类型等)
ShowWindow(hwnd, SW_SHOWNORMAL);//显示
UpdateWindow(hwnd);//更新
//第五部:通过循环获取消息
MSG msg;//创建一个消息结构体
//消息作为结构体存在 转定义查看下列属性
/*
HWND hwnd; 主窗口句柄
UINT message; 具体消息名称
WPARAM wParam; 附加消息:键盘消息
LPARAM lParam;附加消息:鼠标消息
DWORD time; 消息产生时间
POINT pt; 附加消息:鼠标消息 (坐标点)
*/
/*
GetMessage(
_Out_ LPMSG lpMsg,//传入一个指向MSG结构体的指针
_In_opt_ HWND hWnd,//获取具体窗口的位置 传入NULL指捕获所有窗口
_In_ UINT wMsgFilterMin,//获取主消息值的最小值 传入0指捕获所有消息
_In_ UINT wMsgFilterMax);//获取主消息值的最大值 传入0指捕获所有消息
*/
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//分发消息
}
}
/*
底层实现以窗口
介绍相关词汇:
SDK:软件工具包
API:程序编程接口
窗口:程序生成的显示在屏幕上面的一个矩形区域,分为客户区和非客户区
句柄:资源标识,应用程序通过句柄访问相应的对象的信息
消息处理机制
需要包含的头文件window.h
程序入口函数 WinMain
具体实现的六个步骤:
设计窗口:WNDCLASS wc;
注册窗口:RegisterClass(&wc);
创建窗口:CreateWindow
显示和更新:ShowWindow UpdateWindow(hwnd)
通过循环获取消息:创建消息结构体+写循环+翻译消息+分发消息
窗口过程:写成WinMain函数前):
创建函数设定形参巴拉巴拉:LRESULT CALLBACK WindowProc
返回默认处理值
(以下这些均为本程序所涉及的流程)
设定关闭机制
设定鼠标按下机制
设定安排按下机制
绘图文字
*/