MFC之底层窗口创建
来源:互联网 发布:关宁锦防线 知乎 编辑:程序博客网 时间:2024/05/29 17:50
1.MFC中底层窗口的创建主要使用以下几个步骤:
- 1.设计窗口类
- 2.注册窗口类
- 3.创建窗口
- 4.显示和更新
- 5.通过循环来取消息
- 6.回掉函数 处理消息(窗口过程)
2.实现效果如下:可以捕获到用户键盘、鼠标的按下事件等
3.实现代码
/* 底层窗口创建 6步骤 */#include<Windows.h> //底层实现窗口头文件#define true 1#define false 0/* #define CALLBACK __stdcall 代表参数的传递顺序,从右往左依次传递,并且入栈,在函数返回前,清空堆栈 WindowProc 窗口过程(回调)*/LRESULT CALLBACK WindowProc( HWND hwnd, //消息所属窗口句柄 UINT uMsg, //消息类别 WPARAM wParam, //额外参数 wParam-->键盘 LPARAM lParam //额外参数 lParam-->鼠标){ switch (uMsg) { case WM_CLOSE: //销毁窗口 /* 会触发另外一个消息WM_DESTROY ;约定所有以xxxWindow为结尾的方法, 都不会进入消息队列,而是直接执行 */ DestroyWindow(hwnd); case WM_DESTROY: PostQuitMessage(0); //发送一个退出消息 break; case WM_LBUTTONUP: //鼠标左键消息 { int xPos = LOWORD(lParam); int yPos = HIWORD(lParam); TCHAR buf[1024]; memset(buf, 0x00, sizeof(buf)); wsprintf(buf, TEXT("x = %d,y = %d"), xPos, yPos); MessageBox(hwnd, buf, TEXT("鼠标左键按下!"), MB_OK); } case WM_KEYDOWN: { MessageBox(hwnd, TEXT("键盘被按下!"), TEXT("键盘被按下!"), MB_OK); break; } case WM_PAINT: { //画图 PAINTSTRUCT paint; HDC hdc = BeginPaint(hwnd,&paint); //开始画图 TextOut(hdc, 100, 100, TEXT("Hello World."),strlen("Hello World.")); EndPaint(hwnd, &paint);//结束画图 break; } default: break; } return DefWindowProc(hwnd,uMsg,wParam,lParam); //返回默认处理}/*WINAPI __stdcall 代表参数的传递顺序,从右往左依次传递,并且入栈,在函数返回前,清空堆栈*/int WINAPI WinMain( HINSTANCE hInstance, //应用程序的实例句柄 HINSTANCE hPrevinstance, //上一个应用程序实例,在win32环境下, //为NULL,不起作用了 LPSTR lpCmdLine, //char *argv[] 命令行参数 int nShowCmd) //窗口的显示、最大化、最小化、正常显示{ //1.设计窗口类 WNDCLASS winc; winc.cbClsExtra = 0; //类的额外的内存,通常为0 winc.cbWndExtra = 0; //窗口的额外的内存,通常为0 winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景色 //加载光标,第一个参数为null,代表使用系统提供的默认的一些光标 winc.hCursor = LoadCursor(NULL,IDC_HAND); //加载图标,第一个参数为null,代表使用系统提供的默认的一些光标 winc.hIcon = LoadIcon(NULL,IDI_WARNING); winc.hInstance = hInstance;//应用程序实例句柄,传入WinMain中的形成即可 //窗口过程,函数名称任意,WindowsProc为一个回调函数 winc.lpfnWndProc = WindowProc; winc.lpszClassName = TEXT("WIN"); //指定窗口类的名称 winc.lpszMenuName = NULL; //菜单名称 winc.style = 0; //风格,0代表默认的风格 //2.注册窗口类 RegisterClass(&winc); //3.创建窗口 /* CreateWindowW( lpClassName, //类名 lpWindowName, //窗口名称 dwStyle, // 风格 混合 WS_OVERLAPPEDWINDOW x, //CW_USEDEFAULT 默认值 y, //CW_USEDEFAULT 默认值 nWidth, //CW_USEDEFAULT 默认值 nHeight, //CW_USEDEFAULT 默认值 hWndParent, //父窗口 没有写NULL hMenu, //菜单,没有写NULL hInstance, //实例句柄,WinMain函数中的形参 lpParam //额外参数 没有写NULL ) */ HWND hwnd = CreateWindow( winc.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; //额外参数 鼠标 (x,y坐标信息) */ MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { /* GetMessage( LPMSG lpMsg, 消息结构体 HWND hWnd, 主窗口句柄 NULL 捕获所有窗口的消息 UINT wMsgFilterMin, 过滤消息通常为0 UINT wMsgFilterMax 过滤消息 通常为0 代表捕获所有的消息 ) */ //翻译消息 TranslateMessage(&msg); //分发消息 DispatchMessage(&msg); } //6.回掉函数 处理消息(窗口过程) /* LRESULT CALLBACK WindowProc */ return 0;}
4.若想了解更多,可以参考msdn文档;
阅读全文
0 1
- MFC之底层窗口创建
- MFC基础学习之底层实现窗口
- 底层MFC窗口的实现
- MFC 窗口的创建
- MFC创建悬浮窗口
- MFC窗口创建过程
- mfc创建不规则窗口
- MFC创建不规则窗口
- MFC窗口创建过程
- MFC窗口的创建
- MFC动态创建窗口
- MFC动态创建窗口
- MFC中窗口创建
- MFC创建窗口菜单
- MFC创建非模态子窗口
- MFC六大机制之二:窗口创建机制
- mfc学习之主框架窗口创建过程
- 使用MFC创建悬浮窗口
- eclipse一些简单设置
- 455. Assign Cookies
- shiro 异常总结
- PHP5升级PHP7-永久环境变量设置
- 跳跃游戏 II-LintCode
- MFC之底层窗口创建
- Elasticsearch安装及自动同步mysql数据库数据
- android 开发规范1
- Eclipse打开C/C++文件报错问题
- 启动多个MySQL实例作为Windows服务
- java 类加载顺序
- 深度学习:Sigmoid函数与损失函数求导
- 记腾讯互娱网站布局(1)
- ajax请求后台数据在ie浏览器上显示为空