想实现XP界面,通过写.manifest文件的方法可以实现,但我在ActiveX控件中却达不到效果(我给ActiveX生成一个子窗口,子窗口继承自CDialog,上面有一些标准控件),我怀疑是CXXXXCtrl类没有调用InitCommonControlsEx函数的原因,可是我调用这个函数却通过不过编译,原因就是INITCOMMONCONTROLSEX结构中的可取值ICC_STANDARD_CLASSES找不到定义,我在.net下也说找不到定义,commctrl.h文件也包函了!为什么啊?我发现InitCommonControls函数不用参数,无奈它已被废除了!怎么办?另外还想问一下,在哪里调用InitCommonControlsEx函数才行?在我这个项目中有CXXXApp,CXXXXCtrl还有我那个继承自CDialog的子窗口.后来我发现VC7.0和VC6.0下的commctrl.h是一模一样的,真不解,我是在.net 2003的MSDN中看到ICC_STANDARD_CLASSES定义的,但在VC7.0中却说未定义!总之就一句话,我在ActiveX中打开了个子窗口,子窗口继承自CDialog,我想让这个子窗口上的按钮变成XP样式的按钮,就这个问题.
调_AfxInitCommonControls函数,而_AfxInitCommonControls的主要操作就是把comctl32.dll装载进来,然后判断.dll文件中有没有InitCommonControlsEx函数,如果有就调用,没有则调用InitCommonControls
#include <uxtheme.h>
#include <tmschema.h>// AltTab 列表容器窗口的对话框程序
INT_PTR CALLBACK DlgProc(HWND hwnd, UINT uMsg, WPARAM, LPARAM lParam)
{
static HTHEME htheme = NULL; switch (uMsg)
{
case WM_INITDIALOG:
{
htheme = OpenThemeData(hwnd, L"StartPanel"); if (htheme)
{
// 获取要用于绘制容器窗口的
// 背景区域部分并将其应用于
// 对话框。 HRGN hrgn = NULL;
GetWindowRect(hwnd, &rc);
OffsetRect(&rc, -rc.left, -rc.top); if (SUCCEEDED(GetThemeBackgroundRegion(htheme, NULL,
SPP_USERPANE, 0, &rc, &hrgn)))
{
SetWindowRgn(hwnd, hrgn, FALSE);
}
} break;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
if (hdc)
{
if (htheme)
{
// 外观风格处于活动状态,使用外观
// 风格 API 进行绘制。 RECT rc;
GetWindowRect(hwnd, &rc);
OffsetRect(&rc, -rc.left, -rc.top); DrawThemeBackground(htheme, hdc, SPP_USERPANE, 0, &rc, NULL);
}
else
{
// 外观风格不处于活动状态,按传统
// 窗口样式进行绘制。
}
}
EndPaint(hwnd, &ps); break;
}
case WM_THEMECHANGED:
{
// 外观风格已更改,关闭现有的 htheme 并尝试
// 打开一个新的 htheme。
if (htheme)
{
CloseThemeData(htheme);
}
htheme = OpenThemeData(hwnd, L"StartPanel"); break;
}
}
}
#if (_WIN32_WINNT >= 0x501)
#define ICC_STANDARD_CLASSES 0x00004000
#define ICC_LINK_CLASS 0x00008000
#endif你的_WIN32_WINNT 定义为多少?是为0x501了么?