首页 / 软件开发 / C++ / 持续化更新的视状态,在DLL中使用托管扩展
持续化更新的视状态,在DLL中使用托管扩展2010-12-22持续化更新的视状态在DLL中使用托管扩展这个月是我的专栏11周年纪念以及新标题:“C++ At Work”的开幕式。同时我们还新增了一个新的双月专栏:“Pure C++”,这个专栏由我的伙伴,C++ 大师级人物之一—— Stan Lipman 主持。Stan 将更多地涉及纯粹的 C++/CLI 语言方面(他会告诉你更多这方面的东西),而我将继续一如既往地编写 C++ 日常应用以及现实中的MFC(和目前的托管扩展)Windows 编程方面的文章。Stan 的新专栏描绘的是公认的当今最为活跃的主流编程语言之一的 Microsoft C++(译者:即微软的 C++ ),MSDN 杂志将在这个栏目中为我们的读者提供更多的 C++ 内容。我选择“C++ At Work”这个标题是因为它有两层含义:第一个意思是“工作中的 C++”(C++ on-the-job),指在工作中使用 C++ 的人们。而对我来说的另一个含义,也是更重要的含义是“让 C++ 工作”(Putting C++ Work)——也就是说让 C++ 为你做事。这才是我的专栏主旨之所在,这一点是不会改变的。唯一正式的变化是在名字中不会再有“Q&A”,但我保留偶尔写一些我认为重要而且有趣和值得的不是直接来自读者提问的 C++ 主题和技术的权利。此外,我打算专栏还是保持 Q&A 风格,所以说不管怎样,尽管给我提问就是了。我怀着极大的兴趣阅读了你在2004年11月关于如何持续化不同用户会话“打开”对话框视图状态的专栏文章,我觉得有一个问题。你的 CListViewShellWnd (对话框中的 m_wndListViewShell)在用户进入另一个文件夹时会被销毁。所以当你关闭对话框时,它不会存储当前的视图模式,而是用户进入另一个文件夹时所处的视图模式。用什么方法解决这个问题? 被人抓住了小辫子,真的让我好尴尬!你说的完全正确,在我去年11月的代码中有一个bug。在那篇文章中,我描述了如何实现定制的“打开”对话框(CPersistOpenDlg),使之能记住不同用户会话的视图模式。也就是说,如果用户在“打开”对话框中选择缩略图,那么下次再运行此程序时,该对话框便会以缩略图模式打开。我是通过子类化一个特殊的窗口 SHELLDLL_DefView 来现实的,“打开”对话框使用该窗口显示文件和文件夹。我用 Spy++ 发现这个神奇的命令 IDs 来设置视图模式,同时我还示范了用 LVM_GETITEMSPACING 来区分图标模式和缩略图模式——两者从 LVM_GETVIEW/GetView 返回的都是 LV_VIEW_ICON。任何时候,只要你存储窗口状态,不管是大小/位置,还是视图模式,在窗口销毁之前的 WM_DESTROY/OnDestroy 处理例程中做这项工作是很自然的事情。那也是我在 CListViewShellWnd 中要做的事,它是为处理 SHELLDLL_DefView 而建立的一个 MFC 类:void CListViewShellWnd::OnDestroy() {
m_lastViewMode = GetViewMode(); // 记住当前视图模式
}
当对话框被销毁时,其对象(CPersistOpenDlg)便在构造函数中将 m_lastViewMode 写入用户配置文件。过程就是如此——它是一种做这类事情的常规方式。但是正像 John 发现的那样,“打开”对话框在用户关闭它时并没有销毁外壳视图;它每次都是在用户转到另一个文件夹时销毁的。要改变文件清单的显示,唯一的方法是去全部从头再建立一次。(现在你知道为什么“打开”对话框后,进入另一个文件夹是如此之慢了)。为了了解文件夹视图的销毁,你只要添加一个 TRACE 即可:void CListViewShellWnd::OnDestroy() {
TRACE(_T("CListViewShellWnd::OnDestroy
"));
...
}