#include<windows.h>//底层实现窗口的头文件
#include<stdio.h>
//6 处理窗口过程
//CALLBACK 代表了__stdcall 参数的传递顺序,从右到左依次入栈,并且在函数返回前,清空堆栈
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,//消息所属的窗口句柄
_In_ UINT uMsg,//具体消息名称 WM_XXXXX消息名(window message)
_In_ WPARAM wParam,//键盘附加消息
_In_ LPARAM lParam//鼠标附加消息
)
{
switch (uMsg)
{
case WM_CLOSE:
//所有xxxwindow为结尾的方法,都不会进入到消息队列中,而不是直接执行
DestroyWindow(hwnd);//DestroyWindow 发送另一个消息 WM_DESTROY
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN://鼠标左键按下
{
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
char buf[1024];
wsprintf(buf,TEXT("x = %d y = %d"),xPos,yPos);
MessageBox(hwnd,buf,TEXT("鼠标左键按下"),MB_OK);
break;
}
case WM_KEYDOWN://键盘
MessageBox(hwnd,TEXT("键盘按下"),TEXT("键盘按下"),MB_OK);
break;
case WM_PAINT://绘图
{
PAINTSTRUCT ps;//绘图结构体
HDC hdc = BeginPaint(hwnd,&ps);
TextOut(hdc,200,200,TEXT("HELLO"),strlen("HELLO"));
EndPaint(hwnd,&ps);
break;
}
default:
break;
}
//返回值用默认处理方式
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
//程序入口函数
//WINAPI 代表了__stdcall 参数的传递顺序,从右到左依次入栈,并且在函数返回前,清空堆栈
int WINAPI WinMain(
HINSTANCE hInstance, //应用程序的实例句柄
HINSTANCE hPrevInstance, //上一个应用程序句柄,在win32环境下,参数一般为NULL,不起作用
LPSTR IpCmdLine,//char* argv[]
int nshowCmd)//显示命令 最大化、最小化 正常
{
//1、设计窗口
//2、注册窗口
//3、创建窗口
//4、显示并更新
//5、通过循环取消息
//6、处理消息(窗口过程)
//1 设计窗口
WNDCLASS wc;
MSG msg;//消息
HWND hwnd;//CreateWindow
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.lpfnWndProc = WindowProc;//回调函数 窗口过程
wc.lpszClassName = TEXT("WIN");//指定窗口的类名称
wc.lpszMenuName = NULL;//菜单名称 NULL不提供菜单
wc.style = 0;//风格 0代表默认风格
//2、注册窗口
RegisterClass(&wc);
//3、创建窗口
/*
lpClassName,类名
lpWindowName,标题名
dwStyle, WS_OVERLAPPEDWINDOW
x, 坐标 CW_USEDEFAULT 默认值
y, 坐标 CW_USEDEFAULT
nWidth,宽高 CW_USEDEFAULT
nHeight, CW_USEDEFAULT
hWndParent, 父窗口 NULL
hMenu, 菜单 NULL
hInstance, 实例句柄 hInstance
lpParam 附加值 鼠标附加值 NULL
*/
hwnd = CreateWindow(wc.lpszClassName,TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, NULL,NULL,hInstance ,NULL);
//4、显示并更新
ShowWindow(hwnd,SW_SHOWNORMAL);//SW_SHOWNORMAL表示展示方式
UpdateWindow(hwnd);
//5、通过循环取消息
/*
HWND hwnd;//主窗口句柄
UINT message;//具体消息名称
WPARAM wParam;//附加消息 键盘消息
LPARAM lParam;//附加消息 鼠标消息
DWORD time;//消息产生时间
POINT pt;//附加消息 鼠标消息 x y
*/
while(1){
/*
_Out_ LPMSG lpMsg, 消息
_In_opt_ HWND hWnd, 捕获窗口 填NULL 代表捕获所有的窗口
_In_ UINT wMsgFilterMin,最小和最大的过滤的消息 一般填0
_In_ UINT wMsgFilterMax); 填0代表捕获所有的消息
*/
if(GetMessage(&msg,NULL,0,0)== FALSE)
break;
//翻译消息
TranslateMessage(&msg);
//不为FALSE
//分发消息
DispatchMessage(&msg);
}
return 0;
}