使用带有STAP_ALLOW_CONTROLS
标志的参数调用SetThemeAppProperties
会导致CoCreateInstance
的公共对话框(或列表文件打开对话框,CLSID_FileOpenDialog
)返回错误{{1} }。
示例代码如下:
0x80040111
要使其成为运行代码,我已创建(在Visual Studio 2010 Professional中)一个简单的Win32 GUI应用程序,并将该代码添加到菜单“帮助”|“关于处理程序”。
为什么会这样以及如何解决这个问题?
答案 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();
在窗口过程中。但是,我没有管理的是从OpenFile Dialog获取选定的文件名 在CDN_SELCHANGE上。发送CDM_GETFILEPATH只返回256个字符,无论缓冲区使用此消息有多大。也许有人知道在Windows 7上这样做的方法吗?