XTP( xtreme ToolKit Pro )界面库是基于 MFC 扩展的优秀的界面库,公司的项目一直在使用,但是最近尝试使用 VS2010 编辑工程时发现,停靠窗口居然消失了,跟踪消息发现停靠窗口通知消息 XTPWM_DOCKINGPANE_NOTIFY 中的 XTP_DPN_SHOWWINDOW ( wParam ) 居然在主窗口中收不到了,这个消息可是将自定义的窗口关联到停靠窗口容器的入口啊,为什么如此呢?

经过跟踪发现:CXTPDockingPaneManager 在注册到主窗口时没有指定子窗口 ID , 而在 MFC 2010 中,请看下列代码实现:

// for child windows
BOOL CWnd::PreCreateWindow(CREATESTRUCT& cs)
{
if (cs.lpszClass == NULL)
{
// make sure the default window class is registered
VERIFY(AfxDeferRegisterClass(AFX_WND_REG));

// no WNDCLASS provided - use child window default
ASSERT(cs.style & WS_CHILD);
cs.lpszClass = _afxWnd;
}

if ((cs.hMenu == NULL) && (cs.style & WS_CHILD))
{
cs.hMenu = (HMENU)(UINT_PTR)this;
}

return TRUE;
}

如果不指定 ID ,那么 MFC 将会把 this 指针转化为 ID 存放到 HMENU 中,所以通过 spy++ 可以看到停靠窗口是创建了的,但是 ID 非常大,这样就导致了停靠窗口的消息无法正常进行处理从而导致停靠窗口显示不出来的问题,最简单的解决办法就是为停靠窗口的管理器指定一个 ID,如下所示:

m_paneManager.InstallDockingPanes( this );
m_paneManager.SetDlgCtrlID( AFX_IDW_PANE_FIRST + 1 );

这样就正常了,当然,如果你不想所有的工程都修改一遍,那么只有两种办法了:

1、升级 XTP 库到 13.3 以上版本,例如现在最新的版本 13.4.1

2、修改 XTP 库中创建 CXTPDockingPaneManager的代码,在创建时指定一个 ID

最后附带提供 VS2008 中 MFC 的代码以作比较:

// for child windows
BOOL CWnd::PreCreateWindow(CREATESTRUCT& cs)
{
if (cs.lpszClass == NULL)
{
// make sure the default window class is registered
VERIFY(AfxDeferRegisterClass(AFX_WND_REG));

// no WNDCLASS provided - use child window default
ASSERT(cs.style & WS_CHILD);
cs.lpszClass = _afxWnd;
}
return TRUE;
}

转载于:https://www.cnblogs.com/WonKerr/archive/2010/09/28/VS2010_XTP_FixBug.html

VC2010 中 MFC 的改进导致 XTP 停靠窗体无法显示的解决方法相关推荐

  1. dcom配置计算机下没有,Win7 DCOM配置中我的电脑出现红色箭头,dcom没有属性显示的解决方法...

    操作word,excel时,通常需要对com组件进行配置.dcomcnfg配置DCOM时,我的电脑出现红色箭头并且点右键无属性显示. 解决方案: 一.     DCOM配置时右键属性不见, 确保下面四 ...

  2. 9.png(9位图)在android中作为background使用导致居中属性不起作用的解决方法

    在使用到9.png的布局上面添加 android:padding="0dip" 比如 <LinearLayout             android:layout_wid ...

  3. android百度地图覆盖物异步加载图片,Android 百度地图marker中图片不显示的解决方法(推荐)...

    目的: 根据提供的多个经纬度,显示所在地的marker样式,如下: 问题: 1.发现marker中在线加载的图片无法显示出来: 2.获取多个对象后,却只显示出了一个marker: 以下为官网实现方法: ...

  4. VSS新建项目后导致项目组成员不能打开解决方案的解决方法

    VSS新建项目后导致项目组成员不能打开解决方案的解决方法 找到刚从VSS中获取的源文件,中的解决方案*.sln 用记事本打开,找到源代码控制节点将其删除,即可. GlobalSection(Sourc ...

  5. 虚拟机无法在更新服务器,今win10更新导致VMware workstation pro无法打开的解决方法...

    今win10更新导致VMware workstation pro无法打开的解决方法 发布时间:2020-09-15 06:58:54 来源:脚本之家 阅读:182 作者:wx5d8a17c45cb5b ...

  6. Android学习笔记-recreate()方法导致fragment重复新建的问题,解决方法

    Android学习笔记-recreate()方法导致fragment重复新建的问题,解决方法 今天修改一个比较奇怪的bug: 在操作一个事件的时候,使用eventbus来监听事件,断点发现有时候是会执 ...

  7. 关于van-card中thumb引入本地图片而无法正常显示的解决方法

    关于van-card中thumb引入本地图片而无法正常显示的解决方法 前言 解决办法 总结 前言 最近在弄一个微信公众号,是H5前端,用到的是vant组件. 当然Vant的官方文档以及例子都有,但是很 ...

  8. Oracle 表空间不足导致的系统无法登陆问题及解决方法

    Oracle 表空间不足导致的系统无法登陆问题及解决方法 某医院的 HIS 系统突然无法登陆,并且出现以下提示信息: 初步判断是表空间不足导致的问题,登录服务器查看表空间信息如下: 一.查看表空间信息 ...

  9. wps中公式存在遮挡,无法正常显示的解决方法

    wps中公式存在遮挡,无法正常显示的解决方法 问题描述 如图,公式部分被遮挡,导致公式无法完全显示 解决方法 将鼠标移至公式所在行,点击左侧的下拉栏中的清除段落布局即可让公式正常显示,效果如下:

最新文章

  1. 《深入理解Hadoop(原书第2版)》——1.3大数据的编程模型
  2. Linux版本之redhat9---gFtp中文乱码解决方案
  3. Apache虚拟主机(转)
  4. 算法导论之单源最短路径
  5. c++对那些类型的数据不能使用引用_基于js数据类型浅谈deepClone
  6. spring mybatis 整合jar 包冲突问题
  7. php 启动管理工具下载,phpPgAdmin|PostgreSQL管理工具(phpPgAdmin)下载v5.0.4 开源版 - 欧普软件下载...
  8. Spring学习(五)bean装配详解之 【XML方式配置】
  9. Shell 命令大全Xhell入门
  10. 代码审查“思维导图”
  11. edittext实现自动查询,刷新listview
  12. 页面缓存,数据源缓存
  13. #164. 【清华集训2015】V
  14. Vue2源码学习笔记 - 12.响应式原理—Dep 类详解
  15. 2021-10-23
  16. 网速1mbps是多少兆?
  17. hough变换直线方程推导
  18. sublimetext的文件编码理解reopen/reload with encoding,set encoding,save with encoding, set file encoding to
  19. 转 为什么数码相机可以拍出彩色照片?
  20. Linux下修改hostname的三种方式

热门文章

  1. 内网渗透(五十二)之域控安全和跨域攻击-搭建和查看域信任关系
  2. 【微信小程序】-- 全局配置 -- window - 下拉刷新 上拉触底(十六)
  3. 第八届育才杯机器人比赛_太子湾学校:育才教育集团第五届“星升代·育才杯”校园文学大赛颁奖暨文学“微创作”比赛在太子湾学校隆重举行...
  4. Unity引擎UI模块知识Tree
  5. 谷歌中国追求中国式生存
  6. 【坐标轴移位+主辅刻度设定】两年梳理一次性清晰的展示出来,大图解析学习超简单
  7. python实现四参数七参数坐标转换
  8. Springboot RestTemplate post/get请求所有情况
  9. JAVA学习代码——验证手机号码是否正确
  10. Emlog程序纯黑色调CYP音乐模板源码