WEB开发网
开发学院软件开发VC SetForegroundWindow 及类保护 阅读

SetForegroundWindow 及类保护

 2006-07-20 11:43:51 来源:WEB开发网   
核心提示: Figure 3 TraceMYWM_POSTINIT是我自己定义的消息(WM_USER+1),其处理函数调用 SetListView,SetForegroundWindow 及类保护(2),因为 OnInitDialog 用 PostMessage 发送消息,而不是 SendMessag

Figure 3 Trace

MYWM_POSTINIT是我自己定义的消息(WM_USER+1),其处理函数调用 SetListView,因为 OnInitDialog 用 PostMessage 发送消息,而不是 SendMessage。Windows 一直到所有的其它未决的消息已经处理之后才会处理 MYWM_POSTINIT 消息。到那时,打开对话框已经设置妥当,而且 SetListView 成功地获得列表控制。

第三个问题,一旦你最后拥有了列表控制,你怎样设置它的视图模式?你可能想你所要做的只是调用SetView/LVM_SETVIEW。唉,这样做行不通。列表视图为空白。 难道是一个画面刷新问题吗?也许吧。但如果你仔细想一想,你将意识到发送 LVM_SETVIEW 充满危险。记得 SHELLDLL_DefView 窗口吗?不难想象它维持着 有关它的列表控制的某种状态信息。如果你直接操作列表控制,它怎样知道你做了什么?无论怎样,它都不工作。你必须另辟蹊径。

Figure 4 使用 Spy++

幸运的事,这种情况找到解决方法并不难。Spy++ 又一次帮上大忙。用 Spy++ 进行深入探究后,揭示出当用户操作下拉菜单,如 Figure 4 所示,选择不同的视图时会发生什么。对话框发送了一个 WM_COMMAND 消息给 SHELLDLL_DefView,命令ID= 0x702c 。所以为了将视图改为详细资料视图,你要做的是发送一个 WM_COMMAND 消息到外壳窗口,而不是列表控制: CWnd* pshellwnd = dlg->GetDlgItem(lst2);
  pshellwnd->SendMessage(WM_COMMAND, ODM_VIEW_DETAIL); // 0x702c
  经历了所有的惊愕以及重重艰难险阻,最终的解决方案很简单。你可以用 Spy++ 来检验每个视图模式的命令代码。我是个大好人,为你做了这些。结果参见 Figure 5 。我在 Windows XP 中对它们进行了调用;Windows 的其它版本有一或两个别的代码。Figure 2 是 CMyOpenDlg 的源码,它以详细资料视图模式调用文件打开对话框。 至于如何保存不同用户会话的列表模式,我将它作为一个练习由你自己解决;实现细节很简单。如通常一样,你可以从本文顶部的链接处下载完整的测试程序源代码。

上一页  1 2 3 4  下一页

Tags:SetForegroundWindow 保护

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