当前位置: 首页 > wzjs >正文

教育集团网站设计策划书3 建设营销型网站流程图

教育集团网站设计策划书,3 建设营销型网站流程图,西海岸建设局网站,建设银行官方网网址前言 此前系列文章回顾: 在MFC中使用Qt(一):玩腻了MFC,试试在MFC中使用Qt!(手动配置编译Qt) 在MFC中使用Qt(二):实现Qt文件的自动编译流程 在M…

前言

此前系列文章回顾:
在MFC中使用Qt(一):玩腻了MFC,试试在MFC中使用Qt!(手动配置编译Qt)

在MFC中使用Qt(二):实现Qt文件的自动编译流程

在MFC中使用Qt(三):通过编辑项目文件(.vcxproj)实现Qt的自动化编译流程

在MFC中使用Qt(四):使用属性表(Property Sheet)实现自动化Qt编译流程

在MFC中使用Qt(五):MFC和Qt的共存和交互

通过源码qt-solutions开源项目可知QMfcApp 通过以下几个关键技术点实现 MFC 和 Qt 事件循环的共存:
1.使用Windows钩子来监控消息队列,确保Qt事件在MFC的消息循环中被处理。
2.重写事件过滤器(winEventFilter)来处理Windows消息。
3.在Qt的事件循环中集成MFC的消息泵,通过定期处理MFC的Onldl或消息分发。
4.管理模态循环的计数,调整Qt的事件处理行为,避免在模态期间出现问题。
5.静态方法run0和instance0帮助初始化和协调两个框架的事件循环。

本文将详细说明其工作原理。

深入了解QMfcApp

Windows钩子(Hook)确保事件同步

关键代码:

// 安装 WH_GETMESSAGE 钩子监控消息队列
hhook = SetWindowsHookEx(WH_GETMESSAGE, QtFilterProc, 0, GetCurrentThreadId());LRESULT CALLBACK QtFilterProc(...) {// 强制刷新 Qt 事件队列,防止事件积压qApp->sendPostedEvents();return CallNextHookEx(...);
}

作用:
在每次 Windows 消息被取出(GetMessage 或 PeekMessage)时,触发钩子回调,确保 Qt 的 DeferredDelete 等事件及时处理。

​避免阻塞:即使 MFC 窗口模态对话框阻塞了 Qt 主循环,钩子仍能保证 Qt 事件被处理。

重写事件过滤器(winEventFilter)

关键代码:

bool QMfcApp::winEventFilter(MSG *msg, long *result)
{static bool recursion = false;if (recursion)return false;recursion = true;QWidget *widget = QWidget::find((WId)msg->hwnd);HWND toplevel = 0;if (widget) {HWND parent = (HWND)widget->winId();while(parent) {toplevel = parent;parent = GetParent(parent);}HMENU menu = toplevel ? GetMenu(toplevel) : 0;if (menu && GetFocus() == msg->hwnd) {if (msg->message == WM_SYSKEYUP && msg->wParam == VK_MENU) {// activate menubar on Alt-up and move focus awaySetFocus(toplevel);SendMessage(toplevel, msg->message, msg->wParam, msg->lParam);widget->setFocus();recursion = false;return TRUE;} else if (msg->message == WM_SYSKEYDOWN && msg->wParam != VK_MENU) {SendMessage(toplevel, msg->message, msg->wParam, msg->lParam);SendMessage(toplevel, WM_SYSKEYUP, VK_MENU, msg->lParam);recursion = false;return TRUE;}}}
#ifdef QTWINMIGRATE_WITHMFCelse if (mfc_app) {MSG tmp;while (doIdle && !PeekMessage(&tmp, 0, 0, 0, PM_NOREMOVE)) {if (!mfc_app->OnIdle(idleCount++))doIdle = FALSE;}if (mfc_app->IsIdleMessage(msg)) {doIdle = TRUE;idleCount = 0;}}if (mfc_app && mfc_app->PreTranslateMessage(msg)) {recursion = false;return TRUE;}
#endifrecursion = false;
#if QT_VERSION < 0x050000return QApplication::winEventFilter(msg, result);
#elseQ_UNUSED(result);return false;
#endif
}
  • 作用QMfcApp::winEventFilter 是 Qt 与 MFC 消息协调的核心枢纽,其核心目标是 ​优先让 MFC 处理关键消息(如菜单、快捷键、空闲任务),剩余消息交由 Qt 处理
  • 处理逻辑
    • winEventFilter 中优先处理 MFC 消息(如 WM_ENTERIDLE),调用 MFC 的 OnIdle 等接口。
    • 剩余消息交给 Qt 的标准处理流程 QApplication::winEventFilter()

Qt 主循环驱动 MFC 消息泵

关键代码:

// 伪代码:Qt 主循环内部逻辑
int QApplication::exec() {while (!exit_loop) {// 处理 Qt 事件processEvents(); // 嵌入 MFC 消息泵逻辑while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {TranslateMessage(&msg);DispatchMessage(&msg); // MFC 窗口处理消息}}return exit_code;
}

关键点
Qt 的 exec() 并非单纯阻塞,其内部会通过 ​非阻塞轮询(PeekMessage)​ 持续检查并分发 Windows 消息。

  • PeekMessage 代替了 MFC 的 PumpMessage,允许在 Qt 主循环中处理 MFC 窗口消息。
  • MFC 无需独立事件循环:所有消息最终由 DispatchMessage 分发到 MFC 窗口过程(如 CWnd::WindowProc)。

模态循环协同

关键代码:

// 进入/退出模态循环时更新计数器
void QMfcApp::enterModalLoop() { ++modalLoopCount; }
void QMfcApp::exitModalLoop()  { --modalLoopCount; }

作用:在 MFC 模态对话框(如 MessageBox)期间调整 Qt 事件处理策略。

逻辑细节

  • 进入模态时暂停 Qt 的 DeferredDelete 事件,防止对象在模态期间被销毁。
  • 退出时恢复事件处理,确保 UI 状态一致。

绕过MFC 的 CWinApp::Run

QMfcApp 的设计中,​MFC 的消息循环并未独立启动,而是通过 ​将 MFC 消息泵嵌入到 Qt 的主事件循环 中实现共存。

// 典型 MFC 应用的主循环(被 QMfcApp 替换)
int CWinApp::Run() {while (PumpMessage()) {} // 传统 MFC 消息泵return ExitInstance();
}// QMfcApp 的替代实现
int QMfcApp::run(CWinApp *mfcApp) {qApp->exec();          // 启动 Qt 主循环(内含 MFC 消息泵)mfcApp->ExitInstance(); // 清理 MFC 资源
}

关键设计

  • 不调用 CWinApp::Run:QMfcApp 完全接管消息循环,避免 MFC 自身循环启动。
  • 资源清理:Qt 主循环退出后,手动调用 ExitInstance 完成 MFC 清理。

总结

QMfcApp ​未同时运行两个独立事件循环,而是通过以下方式实现协作而非并行:

  1. Qt 主循环驱动:通过 PeekMessage 处理所有消息(包括 MFC 窗口消息)。
  2. MFC 逻辑嵌入:消息过滤器和钩子确保 MFC 的 PreTranslateMessageOnIdle 等关键逻辑被触发。
  3. 无阻塞设计:Qt 的 exec() 内部以非阻塞方式轮询消息,避免独占线程。

这种设计使得 MFC 窗口能够响应消息,而 Qt 控件也能正常更新,实现无缝混合运行。

http://www.dtcms.com/wzjs/787393.html

相关文章:

  • 网站建设培训 南宁做销售网站的公司哪家最好
  • 做论坛网站需要备案广告公司设计
  • 1小时快速搭建网站御名是什么意思
  • 网站设计好了如何上传到自己搭建的网上去山东住房和建设厅网站
  • 珠海做网站ims2009 asp企业网站建设
  • 河南做网站公司哪家好直播教育网站建设
  • 沧州网站建设cztj0511网站
  • 免费网站素材下载制作个人网页教程
  • 制作网站购买主机网站维护和制作怎么做会计分录
  • 网站建设华企云商曹县做网站建设
  • 网站建设证有徐州网站建设哪家好
  • 游戏编程长沙官网优化公司
  • 网站设计需要那些人百度怎么投广告
  • 网站改版重新备案野望原文及翻译
  • 网站横幅图片哈尔滨市工程招标网
  • 三网合一的网站怎么做上海哪家seo好
  • 西安企业网站建设价格军博网站建设公司
  • 苏州市建设职业中心网站东莞莞城网站建设
  • 公司网站设计与开发响应式网站价格
  • 网站优化什么意思电脑培训班附近有吗
  • 做海报的网站推荐django做网站效率高吗
  • 南宁网站建设建站系统企业管理系统项目经历怎么写简历范文
  • 装修网站源码网站登录超时怎么解决
  • 网站想换空间点点站长工具
  • 宝塔建站wordpresswordpress优化插件
  • ps网站主页按钮怎么做网站的设计方案在哪里
  • 南阳公司网站制作手机网站设计立找亿企邦
  • asp室内装修装潢网站源码短视频推广
  • 网站栏目结构最有性价比的网站建设
  • 怎么设计手机网站创造网站的软件