SetThemeAppProperties禁用COM公共对话框

时间:2011-03-11 07:02:02

标签: winapi com fileopendialog common-dialog windows-themes

使用带有STAP_ALLOW_CONTROLS标志的参数调用SetThemeAppProperties会导致CoCreateInstance的公共对话框(或列表文件打开对话框,CLSID_FileOpenDialog)返回错误{{1} }。

示例代码如下:

0x80040111

要使其成为运行代码,我已创建(在Visual Studio 2010 Professional中)一个简单的Win32 GUI应用程序,并将该代码添加到菜单“帮助”|“关于处理程序”。

为什么会这样以及如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

在所有控件上禁用视觉样式是一个非常沉重的锤子。最新版本的对话框不支持它并不奇怪。尝试使用GetOpenFileName()回退到旧版shell对话框界面。接下来,删除启用6.0版常用控件的清单条目。对皮肤化的想法可能有点诅咒。

答案 1 :(得分:0)

也许是一个愚蠢的问题:但在尝试使用CoCreateInstance之前,您是否打电话给InitCommonControlsEx()和CoInitializeEx()?

我的猜测是,如果设置了STAP_ALLOW_CONTROLS标志,则对SetThemeAppProperties的调用会自动初始化COM。但如果没有设置该标志,你必须自己动手。

答案 2 :(得分:0)

使用模板自定义常用对话框在Windows 7上并不那么容易。首先,您必须强制GetOpenFileName从DoModal调用遗留函数,这可以使用m_bVistaStyle = false轻松完成。但是我不得不处理一些断言

ASSERT(pThreadState-> m_pAlternateWndInit == NULL);
pThreadState-> m_pAlternateWndInit = NULL;

我仍然不确定它是什么,但它可以通过处理WM_NCDESTROY并简单地“工作” 分配     

_AFX_THREAD_STATE * pThreadState = AfxGetThreadState();
            if(:: IsWindow(pThreadState-> m_pAlternateWndInit-> m_hWnd))
            追踪(“可怕......”);
            否则
            pThreadState-> m_pAlternateWndInit = NULL;
            TRACE(“WM_NCDESTROY”);
            返回false;

在窗口过程中。但是,我没有管理的是从OpenFile Dialog获取选定的文件名 在CDN_SELCHANGE上。发送CDM_GETFILEPATH只返回256个字符,无论缓冲区使用此消息有多大。也许有人知道在Windows 7上这样做的方法吗?