Windows底层窗口实现

编程入门 行业动态 更新时间:2024-10-11 23:18:41

Windows<a href=https://www.elefans.com/category/jswz/34/1768082.html style=底层窗口实现"/>

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底层窗口实现

本文发布于:2024-03-08 20:07:49,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1722160.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:底层   窗口   Windows

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!