MFC

MFC控件CListBox调整大小时的高度注意事项

CListBox控件在进行调整大小时,默认是按照控件内item的高度进行高度变化递增的,也就是说,高度会是单个项高度的倍数,以便完整显示可见项。这样在父窗口OnSize时调整控件大小会出现高度和计算出的填充全客户区大小高度不一致的问题,显示上会有部分区域重绘错误。改变这种默认高度行为的方法就是在创建控件时,加上LBS_NOINTEGRALHEIGHT这个style bit。

用BCG Control Bar库的MFC程序中文字体过小问题的解决方法

这个问题和上一个转帖的VS2010 MFC文字过小问题如出一辙,但是那篇帖子里的解决方法只是一个临时的解决方法,对于应用BCG库后的MFC程序,尤其是应用了部分主题以后,即使修改了字体,也会由于UI部分很多地方会调用BCGPGLOBAL_DATA的UpdateFonts导致修改后的font被默认字体覆盖。
其实用源码跟踪了一下后发现,导致中文字体难看的原因其实是Segoe UI这个字体,于是修改了Bcgglobals.cpp中
static const CString strOffice2007FontName = _T(“Segoe UI”);
这行为
static const CString strOffice2007FontName = _T(“Tahoma”);
使用Tahoma字体就可以了。

记录VS2010下用BCGControlBar编译程序时的一个小问题

链接期错误信息如下:

1>BCGCBPRO1200StaticUD100.lib(BCGPGridCtrl.obj) : error LNK2001: unresolved external symbol _xGetSystemMetrics@4
1>BCGCBPRO1200StaticUD100.lib(BCGPFrameImpl.obj) : error LNK2001: unresolved external symbol _xGetSystemMetrics@4
1>BCGCBPRO1200StaticUD100.lib(BCGPFullScreenImpl.obj) : error LNK2001: unresolved external symbol _xGetSystemMetrics@4
1>BCGCBPRO1200StaticUD100.lib(BCGPDlgImpl.obj) : error LNK2001: unresolved external symbol _xGetSystemMetrics@4
1>BCGCBPRO1200StaticUD100.lib(BCGPAppBarWnd.obj) : error LNK2001: unresolved external symbol _xGetSystemMetrics@4

WM下MFC基于对话框(dialog based)程序的最小化

在WM下的MFC基于对话框程序(VS模板自动生成状态下),运行之后右上角显示的是OK图标,点击后走的逻辑是dialog的OnOK()默认逻辑,会直接把对话框程序关闭掉。这个右上角的按钮据说在SDI或MDI程序运行时显示的是X,会有对应smart minimize的功能,就是点了是最小化隐藏的功能。开始尝试使用ShowWindow(SW_MINIMIZE)的方法来最小化对话框程序,发现结果是右上角的ok没了,下面的左右软键菜单没了,但程序主窗口还在显示,没有像用过的其他程序那样ok按了以后显示windows的today界面。后来换用ShowWindow(SW_HIDE),这样确实是隐藏了,也看见today了,但是再想重新打开程序就不行了,htc的应用程序列表里没有我的程序,开进程管理器直接激活进程倒是可以,但是切换的话会提示说程序窗口已被隐藏XX,不能再打开了,只能强制结束进程。
其实这个问题好像很早以前就被发现了,据说是个today的bug,详情看这:QA: How to create Today-friendly dialog based application?,默认对话框的窗口类型是WS_POPUP,而默认情况下基于对话框程序的这个dialog window的parent就是today这个窗口(等价于windows的desktop),最小化或者直接激活today显示会导致触发其子窗口的显示,所以又把dialog给弄出来了,解决方法倒是相当简单:把WS_POPUP样式换成WS_OVERLAPPED!

关于WM上左右软件菜单项的EnableMenuItem(使用MFC的CCommandBar添加)

关于WM上MFC程序对左右软件菜单的控制,可以用win32的方法ShCreateMenu这套逻辑,或者使用CCommandBar这个类(替换掉的以前5.0之前的CCeCommandBar类),先Create然后InsertMenuBar就可以将常规menu资源作为左右软键对应的菜单显示,还可以添加toolbar,虽然看上去有点挤。
由于这种创建菜单的方法,让我误认为只是将win32的menu换了个添加方法,换了个绘图位置,导致后来要实现动态enable,disable菜单项时遇到了挠头的问题。按照常规的做法,在执行逻辑时调用EnableMenuItem(hMenu,IDM_MITEM,MF_BYCOMMAND|MF_GRAYED),函数调用,返回值以及参数hMenu都没有问题,但执行起来就是没有disabled的效果,google了一通发现国内国外都有很多人提到这个问题,最终也没有个明确的答复,不是说参数hMenu不对,就是说用ShGetMenuXXX的去取菜单,怎么看也不像是真正的解决办法。
后来在一篇动态更新菜单名称的文章中看到貌似WM对左右软键的菜单是作为POPUP MENU处理的,也就不像是win32正统主菜单那样,嗖得丝内,恍然大悟,换用响应WM_INITMENUPOPUP消息的方式,对要变更的菜单项作弹出菜单时的enable disable处理,问题解决,没想到被一个菜单项给杯具了……