快速业务通道

调用虚拟函数、持续化视图状态及POD类型概念

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
= plc->GetView();
  CListCtrl::GetView 返回 LV_XXX 代码之一,但正像 Maarten 发现的那样,Windows 对图标模式和缩略图模式都返回 LV_VIEW_ICON。

那么如何区分到底是哪种视图模式呢?我绞尽脑汁并钻进头文件查找,最后发现一个叫 LVM_GETITEMSPACING 的消息,该消息是作什么用的呢——用来获取图标间隔。顾名思义,图标间隔是图标视图模式中图标之间的像素间隔。LVM_GETITEMSPACING 不是很好使用,以至于 MFC 都没有对之进行包装(比如说 MFC 中并没有 CListCtrl::GetIconSpacing 这样的函数)。所以在 MFC 中你得自己发送消息:

CSize sz = CSize(plc->SendMessage(LVM_GETITEMSPACING));
  Windows 按照通常方式返回尺寸,在高位和低位字中编码的 cx/cy,然后CSize很礼貌地为你进行解码。一旦有了图标间隔,你便可以将它与 GetSystemMetrics(SM_CXICONSPACING) 返回的系统间隔值进行比较。如果列表视图的图标间隔与系统的一样,则视图是图标模式。如果大于系统间隔,则视图为缩略图模式:

if (sz.cx > GetSystemMetrics(SM_CXICONSPACING)) {
  // thumbnail view
} else {
  // icon view
}
  讲了那么多缩略图,接下来的问题是如何持续化不同用户会话的视图状态?对此,当程序终止时,你需要用 Profile 函数在用户配置文件中保存最后使用的模式,并在下一次启动程序时再次恢复它。我写了一个小示范程序,DlgTest。程序使用了一个实现持续化程序行为的类 CPersistOpenDlg。这个类又借助另外一个类 CListViewShellWnd,用它来封装 SHELLDLL_DefView 窗口(参见三月份专栏)。CListViewShellWnd 包含获取和设置视图模式的函数,由这些函数来区分图标和缩略图模式:

CListViewShellWnd m_wndLVSW;
...
m_wndLVSW.SetViewMode(ODM_VIEW_THUMBS);
  CListViewShellWnd 的 OnDestroy 处理器在某个数据成员 m_lastViewMode 中保存视图模式。当对话框被销毁时,CPersistOpenDlg 的析构函数调用 WriteProfileInt 将这个值写入用户配置文件。对话框启动时,CPersistOpenDlg 给自己送一个初始化消息;该消息处理例程调用 GetProfileInt 从磁盘读取存储在配置文件中的值并设置视图模式。PostMessage 是必须调用的,因为常规初始化消息 WM_INITDIALOG 和 CDN_INITDONE 在文件对话框被完全初始化之前就会到来——有关这一点的解释参见三月份专栏。

顺便说一下,任何时候你都应该使用 GetProfileXxx 和 WriteProfileXxx 来持续化应用程序的设置。MFC 用 CWinApp 包装了这些函数。如果你在应用程序启动时调用(一般都是在 InitInstance 函数中) CMyApp::SetRegistryKey("KeyName"),MFC 使用注册表来存储用户配置信息,而不是 INI 文件。下面是 DlgTest 用的 INI 文件:

[settings]
ViewMode=28717
  偶尔在一些文字资料和 C++ 文档以及 Microsoft .NET 框架中看到术语“POD 类型”。这个术语是什么意思?

你可以将 POD 类型看作是一种来自外太空的用绿色保护层包装的数据类型,POD 意为“Plain Old Data”(译者:如果一定要译成中文,那就叫“彻头彻尾的老数据”怎么样!)这就是 POD 类型的含义。其确切定义相当粗糙(参见 C++ ISO 标准),其基本意思是 POD 类型包含与 C 兼容的原始数据。例如,结构和整型是 POD 类型,但带有构造函数或虚拟函数的类则不是。 POD 类型没有虚拟函数,基类,用户定义的构造函数,拷贝构造,赋值操作符或析构函数。


  为了将 POD 类型概念化,你可以通过拷贝其比特来拷贝它们。此外, POD 类型可以是非初始化的。例如:

struct RECT r; // value undefined
POINT *ppoints = new POINT[100]; // ditto
CString s; // calls

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号