WEB开发网
开发学院软件开发VC 持续化更新的视状态,在DLL中使用托管扩展 阅读

持续化更新的视状态,在DLL中使用托管扩展

 2006-07-20 11:43:22 来源:WEB开发网   
核心提示: void CListViewShellWnd::OnDestroy() {m_lastViewMode = GetViewMode(); // 与以前一样,没有变化m_pDialog->PostMessage(MYWM_POSTINIT); // 重新发送初始化消息}现在,持续化更新
void CListViewShellWnd::OnDestroy() {
  m_lastViewMode = GetViewMode(); // 与以前一样,没有变化
  m_pDialog->PostMessage(MYWM_POSTINIT); // 重新发送初始化消息
}

现在,如果“打开”对话框处于任何原因决定要销毁其文件夹视图(切换文件夹或者Red Sox),CListViewShellWnd 都会发送初始化消息,从而使得我的对话框重新子类化此新的文件夹视图。很聪明,是不是?这里是 Post MYWM_POSTINIT 消息,而不是 Send,这一点很重要,所以“打开”对话框可以在 CPersistOpenDlg::OnPostInit 子类化它之前创建新的文件夹视图。之所以在 CListViewShellWnd::OnDestroy 中修复此问题,是要保证能够抓住所有“打开”对话框可能销毁其文件夹视图的地方,并且还有一个好处是不需要任何新的事件处理例程。绝对不要画蛇添足,以免遭受隐晦 bug 的困扰。

聪明的读者可能已经注意到我在代码中加了一个数据成员,m_pDialog,它指向“父”CPersistOpenDlg 对象。向视图的父窗口(GetParent)发 YUWM_POSTINIT 消息是较为干净的做法(因为它不需要添加数据成员),但在这里行不通,因为在此情况很特殊,CPersistOpenDlg 实际上是真正对话框的子窗口。所以我加了一个在构造函数中初始化的回头指针(back pointer)。

我还必须对 CPersistOpenDlg::OnPostInit 作一下些细微的修改。原来的处理程序不仅子类化文件夹视图,而且还初始化用户配置文件中的视图模式。对话框第一次启动时我是需要这样做的——但我不想每次用户切换文件夹时将视图模式重置成保存的状态。所以我需要一个方法来区分第一次和后继的初始化。既然我没有将 WPARAM 用于其它目的,那就用它吧。下面来修改代码,OnInitDialog 在 WPARAM 为 TRUE 时,则发送 MYWM_POSTINIT,而 CListViewShellWnd::OnDestroy 在 WPARAM 为 FALSE 时发送。新的 OnPostInit 程序代码参见 Figure 1。

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:持续化 更新 状态

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接