//纯API创建窗口 底层代码
#include <windows.h>
//如果出现该符号在函数中被引用需要配置:项目-》属性->配置属性->连接器=》系统 子系统 设置为 窗口 (/SUBSYSTEM:WINDOWS)
//WINAPI代表_stdcall参数的传递顺序,从右到左以此入栈,并且在函数返回前清空堆栈
LRESULT CALLBACK 窗口过程(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM LParam);
//WINAPI代表_stdcall参数的传递顺序,从右到左以此入栈,并且在函数返回前清空堆栈
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
//1.设计窗口
//2.注册窗口
//3.创建窗口
//4.显示和更新
//5通过循环取消息
//6处理消息
//第一步:设计窗口
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;//实例句柄 传入形参即可
wc.lpfnWndProc = 窗口过程; //回调函数
wc.lpszClassName = TEXT("win");//窗口类名
wc.lpszMenuName = NULL;//菜单名称
wc.style = 0;//0代表默认风格
//第二部:注册窗口类
RegisterClass(&wc);
//第三部:创建窗口
HWND hWndParent = CreateWindow("win","窗口标题",WS_OVERLAPPEDWINDOW,50,50,500,500,NULL,NULL,hInstance,NULL);
//第四部:显示和更新
ShowWindow(hWndParent, SW_SHOWNORMAL);
UpdateWindow(hWndParent);
//第五步:通过循环取消息
//HWND hwnd; 主窗口句柄
//UINT message; 消息名称
//WPARAM wParam; 附加消息 键盘消息
//LPARAM lParam; 附加消息 鼠标消息(按键消息)
//DWORD time; 消息产生的时间
//POINT pt; 附加消息 鼠标消息(位置xy)
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))// 参数一:消息指针 参数2:null代表捕获所有窗口 3和4 填写0代表捕获所有消息
{
//翻译消息
TranslateMessage(&msg);//翻译消息是为了处理一些组合按键
//分发消息
DispatchMessage(&msg);
}
return true;
}
LRESULT CALLBACK 窗口过程(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM LParam){ //消息所处的窗口句柄,具体消息名称 WM_xxxx消息
switch (uMsg)
{
case WM_CLOSE:
DestroyWindow(hwnd);//销毁窗口 但是不是结束进程,而是发送另一个消息:WM_DESTROY
break;
case WM_DESTROY:
PostQuitMessage(0); //发送退出消息,发完此消息后,在while死循环里 GetMessage() 获取到的就是 false了.就会结束程序!
break;
case WM_CREATE:
{
LPCREATESTRUCT pcs = (LPCREATESTRUCT)LParam;
HWND Hbut1 = CreateWindow("button", "按钮1", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 15, 5, 100, 50, hwnd, (HMENU)1001, pcs->hInstance, NULL);
HWND Hbut2 = CreateWindow("button", "按钮2", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 15, 100, 100, 50, hwnd, (HMENU)1002, pcs->hInstance, NULL);
HWND Hbut3 = CreateWindow("button", "按钮3", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 15, 200, 100, 50, hwnd, (HMENU)1003, pcs->hInstance, NULL);
HWND Hbut4 = CreateWindow("button", "按钮4", WS_CHILD | WS_VISIBLE | BS_AUTO3STATE, 15, 300, 100, 50, hwnd, (HMENU)1004, pcs->hInstance, NULL);
HWND Hbut5 = CreateWindow("button", "图片按钮", WS_CHILD | WS_VISIBLE | BS_BITMAP, 120, 300, 32, 32, hwnd, (HMENU)1005, pcs->hInstance, NULL);
HANDLE hBmp = LoadImage(NULL, "D:/c++练习/精通Windows API高级编程_练习/16按钮美化/xxxxxxxx.bmp", IMAGE_BITMAP, 60, 60, LR_LOADFROMFILE);
SendMessage(Hbut5, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBmp);
break;
}
case WM_COMMAND:
{
WORD id = LOWORD(wParam);//控件id
WORD code = HIWORD(wParam);//事件,是双击还是单击还是....
HWND hCtrl = (HWND)LParam;
if (id==1001 && code==BN_CLICKED) //控件id=1001 且 事件=单击
{
MessageBox(hwnd, "按钮1被单击", "提示", MB_OK);
}
else if (id == 1002 && code == BN_CLICKED)
{
MessageBox(hwnd, "按钮2被单击", "提示", MB_OK);
}
else if (id == 1003)
{
if (SendMessage(hCtrl, BM_GETCHECK, 0, 0)==BST_CHECKED)
{
MessageBox(hwnd, "复选框被选中", "提示", MB_OK);
}
else
{
MessageBox(hwnd, "复选框未选中", "提示", MB_OK);
}
}
break;
}
}
//消息一般都是 WM_开头的,可以从API常量里查询!
/*返回值用默认的处理方式*/
return DefWindowProc(hwnd, uMsg, wParam, LParam);
}