c_win32窗体的创建
#include <Windows.h>
//6、处理消息(窗口过程)回调函数
//CALLBACK 代表__stdcall 参数传递顺序 从左到右 依次进栈 在函数返回前 清空栈
LRESULT CALLBACK WindowProc(
HWND hwnd,//消息所属的窗口句柄
UINT uMsg,//具体消息名称 WM_XXX消息名
WPARAM wParam,//键盘消息
LPARAM lParam//鼠标消息
) {
switch (uMsg)
{
case WM_CLOSE:
//所有以XXXWindow为结尾的方法 都不会进入消息队列中 而是直接执行
DestroyWindow(hwnd);//DestroyWindow 发送另一个消息 WM_DESTORY
break;
case WM_DESTROY:
PostQuitMessage(0);//0表示正常退出
break;
case WM_LBUTTONDOWN: //鼠标按下事件
{//注意 c语言中在case后面写多行代码要加{} c++中则不需要
int xPos = LOWORD(lParam);//坐标
int yPos = HIWORD(lParam);
char buf[1024] = {0};
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, 500, 200, TEXT("你好 世界!"), strlen("你好 世界!"));//绘画文字
EndPaint(hdc, &ps);//结束绘画
break;
}
}
//返回值使用默认处理方式
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
//WINAPI 代表是 __stdcall 参数传递顺序 从左到右 依次进栈 在函数返回前 清空栈
int WINAPI WinMain(HINSTANCE hInstance, //应用程序实例 H:句柄
HINSTANCE hPrevInstance, //上一个应用程序实例 Win32环境下 参数一般为空
LPSTR lpCmdLine, //命令行参数 char*argv[]
int nShowCmd) //窗口显示的样式(显示命令 正常 最大化 最小化 )
{
//1、设计窗口
WNDCLASS wc;
wc.cbClsExtra = 0;//类的额外内存
wc.cbWndExtra = 0;//窗口的额外内存
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设计背景
wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标 第一个参数若为空 表示使用系统提供的光标
wc.hIcon = LoadIcon(NULL, IDI_HAND);//设置图标 第一个参数若为空 表示使用系统提供的图标
wc.hInstance = hInstance;//应用程序实例句柄(传入WinMain中的形参即可)
wc.lpfnWndProc = WindowProc;//回调函数(窗口过程)
wc.lpszClassName = TEXT("Window");//指定窗口类名称
wc.lpszMenuName = NULL;//指定菜单名称
wc.style = 0;//显示风格 0代表默认风格
//2、注册窗口
RegisterClass(&wc);
//3、创建窗口
/*
lpClassName, //类名
lpWindowName, //标题名
dwStyle, //风格(正常 最大化 最小化)
x, //显示坐标(显示坐标 距离左上角偏移多少)
y,
nWidth, //宽(窗口的宽高)
nHeight, //高
hWndParent, //父窗口(上一级窗口)
hMenu, //菜单
hInstance, //实例句柄
lpParam //附加值
*/
HWND hwnd= CreateWindow(wc.lpszClassName, TEXT("我的窗口"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
//4、显示和更新
ShowWindow(hwnd, SW_SHOWNORMAL);//正常化显示窗口
UpdateWindow(hwnd);
//5、循环队列取消息
/*
HWND hwnd;//主窗口句柄
UINT message;//具体消息名称
WPARAM wParam;//附加消息(键盘消息)
LPARAM lParam;//附加消息(鼠标消息)
DWORD time;//消息产生时间
POINT pt;//附加消息 鼠标消息(检测鼠标在哪个坐标)
*/
MSG msg;
while (1)
{
/*
_Out_ LPMSG lpMsg,//消息
_In_opt_ HWND hWnd,//捕获窗口 NULL代表捕获所有窗口
_In_ UINT wMsgFilterMin,//最小与最大的过滤的消息 一般填入零
_In_ UINT wMsgFilterMax//填零表示捕获所有
*/
if (GetMessage(&msg,NULL,0,0)==FALSE)//等于false结束
{
break;
}
//翻译消息
TranslateMessage(&msg);//主要是防止组合键
//分发消息
DispatchMessage(&msg);
} return 0;
}
效果图: