想实现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样式的按钮,就这个问题.

解决方案 »

  1.   

    看看用专门的界面开发SDK能不能改ActiveX的.如果不能改就重写ActivesX吧.
    调_AfxInitCommonControls函数,而_AfxInitCommonControls的主要操作就是把comctl32.dll装载进来,然后判断.dll文件中有没有InitCommonControlsEx函数,如果有就调用,没有则调用InitCommonControls
      

  2.   

    MSDN上面调用WINDOWS风格的一个例子
    #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;
            }
        }
    }
      

  3.   

    InitCommonControlsEx一般来说是在CXApp::InitInstance中调用。
    #if (_WIN32_WINNT >= 0x501)
    #define ICC_STANDARD_CLASSES   0x00004000
    #define ICC_LINK_CLASS         0x00008000
    #endif你的_WIN32_WINNT 定义为多少?是为0x501了么?
      

  4.   

    意思是在应用程序类的初始化函数里面调用InitCommonControlsEx吗?我调用了,可是没有效果?因为找不到ICC_STANDARD_CLASSES的定义,我也是直接写0x00004000的,为什么不行呢?根本得不到XP效果,而在普通应用程序中,不调用InitCommonControlsEx函数,只要加入.manifest资源就可以达到XP效果(据说是MFC自动调用了该函数,可是不管怎么样,它的确是实现了XP界面),那么我想知道MFC是怎么样调用InitCommonControlsEx函数的呢?可能是我的调用方法不对,总之我想在ActiveX中实现XP界面.