底层MFC窗口的实现
2017-11-12 17:28
531 查看
用多了面向对象的封装特性,突发奇想来试一试底层窗口的实现机制。
以下是代码的实现及其过程:
以下是代码的实现及其过程:
#include <windows.h>//底层实现窗口的头文件 //6.处理消息(窗口过程) //CALLBACK 代表 _stdcall 参数的传递顺序:从右到左 一次入栈,并且在函数返回前,清空堆栈 LRESULT CALLBACK WindowProc( _In_ HWND hwnd,//消息所属的窗口句柄 _In_ UINT uMsg,//具体的消息名称 WM_XXXXXX消息名 _In_ WPARAM wParam,//键盘的附加消息 _In_ LPARAM lParam//鼠标的附加消息 ) { switch (uMsg) { case WM_CLOSE: //所有以xxxwindow为结尾的方法,都不会进入到消息队列中,而是直接执行 DestroyWindow(hwnd);//DestroyWindow 发送另外一个消息 WM_DESTROY break; case WM_DESTROY: PostQuitMessage(0); break; case WM_LBUTTONDOWN://鼠标左键按下 { int xPos = LOWORD(lParam); int yPos = LOWORD(lParam); char buf[1024]; 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);//HDC就是一个画家 TextOut(hdc, 100, 100, TEXT("HELLO"), strlen("HELOO")); EndPaint(hwnd, &ps); } break; } //返回值用默认处理方式 return DefWindowProc(hwnd, uMsg, wParam, lParam); } //WINAPI 代表 _stdcall 参数的传递顺序:从右到左 一次入栈,并且在函数返回前,清空堆栈 int WINAPI WinMain( _In_ HINSTANCE hInstance,//应用程序实例句柄 _In_opt_ HINSTANCE hPrevInstance,//上一个的应用程序句柄,在win32环境下,参数一般为NULL,不起作用了 _In_ LPSTR lpCmdLine,//char * argv[] _In_ 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); wc.hIcon = LoadIcon(NULL, IDI_ERROR); wc.hInstance = hInstance; wc.lpfnWndProc = WindowProc; wc.lpszClassName = TEXT("WIN"); wc.lpszMenuName = NULL; wc.style = 0; //2.注册窗口 RegisterClass(&wc); /* lpClassName,类名 lpWindowName, 标题名 dwStyle,WS_OVERLAPPEDWINDOW 风格 x,显示坐标 y, nWidth,宽高 CW_USERDEFAULT(不指定会有默认值) nHeight, hWndParent,父窗口 NULL hMenu, 菜单 NULL hInstance,实例句柄 lpParam)附加值 NULL */ //3.创建窗口 HWND hand = CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); //4 显示和更新 ShowWindow(hand, SW_SHOWNORMAL); UpdateWindow(hand); //5 通过循环取消息 /* HWND hwnd;主窗口句柄 UINT message;具体的消息名称 WPARAM wParam;附加消息 键盘消息 LPARAM lParam;附加消息 鼠标消息 DWORD time;消息的产生时间 POINT pt;附加消息 鼠标消息 x y */ MSG msg; while (1) { /* _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); } }
相关文章推荐
- 实现TRACE宏功能(内联函数形式和宏形式),无MFC时打印到Output窗口
- 使用Win32/MFC实现Splash窗口(含有alpha通道的位图窗口)
- mfc任意位置实现窗口拖动
- 关于MFC实现圆角矩形窗口
- MFC(7) 利用CWinThread实现跨线程父子MFC窗口
- MFC中弹出对话框,父窗口消失不见的实现
- [VC/MFC]实现程序运行时隐藏窗口 (多种方法,推荐方法2)
- MFC单文档框架编程(一): 分隔窗口的实现
- MFC中利用多线程实现opencv视频窗口多画面
- MFC中实现组合键调用窗口功能
- VC++MFC 窗口最大化、最小化的实现!
- MFC 控件随窗口同步变大的实现
- MFC 中实现窗口淡入淡出、逐步放大显示效果
- MFC任意位置实现窗口拖动
- VC++MFC 窗口最大化、最小化的实现!
- MFC实现启动时无子窗口的MDI程序
- VC++MFC 窗口最大化、最小化的实现
- MFC splitter窗口的实现
- 【旧资料整理】MFC--实现在程序启动画面关闭后再显示窗口
- MFC中将窗口最小化到托盘实现原理及操作步骤