SetForegroundWindow 及类保护
2006-07-20 11:43:51 来源:WEB开发网本文示例源代码或素材下载
1、列表视图模式
2、SetForegroundWindow
3、类保护
我试图使用C++/MFC自定义文件打开对话框。是否有一种办法能在打开/保存对话框启动时改变列表视图的类型?启动时默认的是列表视图, 这个视图没什么用。我希望程序启动对话框时采用详细资料视图,或最好是用户最后一次使用的视图。您能推荐一种方法吗?
Udi Mishan
当然,在 Windows 中总是有办法的。当我第一次看你的问题时,我想那很容易。只要在 WM_INITDIALOG 消息处理函数中获取列表视图,然后将其视图模式设置为详细资料即可。但在 Windows 中你经常会碰到逻辑上可行,实际做起来行不通。上述做法有三个问题。
问题一是获取列表视图。个别读者已经问到过这个问题,因为它显得有价值了。使用Microsoft Spy++你可以发现,列表控制不是对话框的直接子类,它是孙子类。Spy++运行的屏幕截图 Figure 1 显示了文件打开对话框的真实的窗口层次。你可以看到,主对话框有一个子窗口,类的名字为 SHELLDLL_DefView。接着依次包括文件和文件夹的列表控制。(我第一次提到SHELLDLL_DefView 是在2002年2月专栏)SHELLDLL_DefView的 ID 是 lst2 (值为 0x0461, 在 dlgs.h 中定义),但它不是列表框或列表控制。真正的 SysListView32 是 SHELLDLL_DefView 的 孩子,子 ID 为 1。
Figure 1 窗口层次
问题二是当你的对话框获得 WM_INITDIALOG 时,结合列表控制/SHELLDLL_DefView的窗口还不存在。当你得到CDN_INITDONE时,它依然不存在 ,尽管这个消息的意思是打开对话框已完成初始化。好了,实验是最好的证明:要想Windows做了什么,唯一的途径是做一个实验,或是阅读 MSDN 杂志。Figure 2 是我编写的用来说服自己确信列表控制并不存在的测试对话框。CMyOpenDlg 有一个函数叫 SetListView,顾名思义。此函数也显示 TRACE 诊断信息 ,指示它能否找到列表控制。Figure 3 是 TRACE 流输出的结果,当 WM_INITDIALOG 或 CDN_INITDONE 到来时列表视图不存在。两种情况下 GetDlgItem 都返回 NULL。那么你该怎么做呢?最简单的 做法是让你的对话框给自己发个消息: BOOL CMyOpenDlg::OnInitDialog()
{
CFileDialog::OnInitDialog();
PostMessage(MYWM_POSTINIT,0,0);
return TRUE;
}
Tags:SetForegroundWindow 保护
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接