底层窗口实现"/>
Windows底层窗口实现
1,底层实现窗口1.1 sdk ,api 句柄1.2 Windows的消息处理机制消息--->操作系统--->消息队列--->应用程序(从消息队列捕获消息,翻译消息,分发消息给操作系统) --->操作系统(调用回调函数)--->窗口过程。1.3 头文件windows.h1.4 程序入口 WinMain 作用和main()一样
2,具体六个步骤2.1 设计窗口 WNDCLASS wc;2.2 注册窗口 RegisterClass(&wc);2.3 创建窗口HWND hwnd= CreateWindow(wc.lpszClassName,TEXT("WINDOWS"),WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL,hInstance,NULL);2.4 显示和更新 ShowWindow(hwnd, SW_SHOWNORMAL);UpdateWindow(hwnd);2.5 通过循环取消息2.5.1 写循环MSG msg; while(1){ }2.5.2 退出循环if (GetMessage(&msg, NULL, 0, 0)==FALSE){break;}2.5.3 翻译消息 TranslateMessage(&msg);2.5.4 分发消息 DispatchMessage(&msg);2.6 窗口过程
C语言,Windows底层窗口的简单实现
当也只能是C语言,因为Windows是C语言写的emmm…
代码示例:
#include <windows.h>//6,处理消息(窗口过程)//CALLBACK表示_stdcall参数的传递顺序,从左到右依次入栈,并在函数返回前清空堆栈
LRESULT CALLBACK WindowProc(HWND hwnd,//消息所处的窗口句柄UINT uMsg,//具体的消息名称,WM_XXXX消息名WPARAM wParam,//键盘附加消息LPARAM lParam//鼠标附加消息
){switch (uMsg){//所有以xxxWindow 结尾的方法都不会进入消息队列,而是直接执行case WM_CLOSE:DestroyWindow(hwnd);//DestroyWindow 发送另一个消息 WM_DESTROYbreak;case WM_DESTROY:PostQuitMessage(0);break;case WM_LBUTTONDOWN: //鼠标左键按下{int xPos = LOWORD(lParam);//点击位置x轴坐标int yPos = HIWORD(lParam);//点击位置y轴坐标wchar_t buf[1024];//VS2019的版本用wchar_t;其他可以试一试wcharwsprintf(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);//hdc 是一个画家TextOut(hdc, 100, 100, TEXT("HELLO"), strlen("HELLO"));//文字也是画的一种吧emmmm......EndPaint(hwnd, &ps);}break;}//返回值使用默认处理方式return DefWindowProc(hwnd, uMsg, wParam, lParam);
}//WINAPId表示_stdcall参数的传递顺序,从左到右依次入栈,并在函数返回前清空堆栈
int WINAPI WinMain(HINSTANCE hInstance,//应用程序实例句柄HINSTANCE hPrevInstance,//上一个应用程序实例,在win32 环境下,参数一般为NULL,不起作用LPSTR lpCmdLine,//char*argv[]int nShowCmd //显示命令,最大化,最小化,正常
)
{//1,设计窗口//2,注册窗口//3,创建窗口//4,显示和更新//5,通过云换取消息//6,处理消息(窗口过程)//1,设计窗口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.lpfnWndProc = WindowProc;//回调函数,窗口过程,等号右面是一个函数名,之后声明wc.lpszClassName = TEXT("Win");//指定窗口类名称wc.lpszMenuName = NULL;//菜单名称,不需要菜单的话就是NULLwc.style = 0;//显示风格,最大化,还是最小化等等,0代表默认风格//2,注册窗口RegisterClass(&wc);//将设计的窗口地址放进去//3,创建窗口/*lpClassName, 类名lpWindowName, 标题名dwStyle, 风格,一般使用混合风格 WS_OVERLAPPEDWINDOWx, y, 显示坐标//有默认值nWidth, nHeight 高 宽hWndParent, 父窗口 NULLhMenu, 菜单 NULLhInstance, 实例句柄lpParam 附加值*/HWND 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);UpdateWindow(hwnd);//5,通过云换取消息/*MSG是windows.h中的一个类,typedef struct {HWND hwnd; 主窗口名称UINT message;具体消息名称WPARAM wParam;附加消息 键盘消息LPARAM lParam;附加消息 鼠标消息,左右键DWORD time;消息产生的时间POINT pt;附加消息,鼠标消息 ,点击的点} MSG, *PMSG;*/MSG msg;while (1){/*GetMessage函数的四个参数:_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;
}
更多推荐
Windows底层窗口实现
发布评论