首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控件使用XP主题空白。

控件使用XP主题空白。
EN

Stack Overflow用户
提问于 2012-06-11 03:54:56
回答 1查看 430关注 0票数 2

我一直在慢慢地学习Win32 API,并且被以下内容所困扰:

当我在Windows 7上运行它时,无论是“经典外观”还是"Windows 7 Aero玻璃“外观,一切都很好,甚至在控件上都有Aero外观,这些外观看起来很正常。当我在XP机器上运行它时,再次使用“经典外观”,一切看起来都很好,但是当我在XP上使用"Windows主题“运行它时,上面就是我所得到的。

按照微软关于http://msdn.microsoft.com/en-us/library/bb773175%28VS.85%29.aspx视觉风格的指导方针,我需要做三件事:

1.链接到ComCtl32.lib并调用InitCommonControls。

检查一下,我在链接器设置中添加了comctl32。

2.将名为YourApp.exe.manifest的文件添加到具有XML清单格式的源树中。

检查一下,做了这个。我有一个我正在使用的版本,但为了安全起见,我尝试了在他们的网站上建议的版本,我甚至把它重命名为started,以涵盖所有的基础。(是的,我知道给它我申请的名字.)

3.将清单添加到应用程序的资源文件,如下所示:

检查一下,做了这个。我将他们建议的指定行添加到我的rc文件中。

因此,在所有条件下,一切都正常,除了Windows样式的主题。

我所想的唯一剩下的就是我没有响应WM_PAINT消息,但是我将它传递给默认的窗口proc,以便允许windows在这方面做它的事情。(我看不出这是否有效,在其他任何地方都行不通。)

我看到了一个类似的帖子,它说要使用InitCommonControlsEx,也是这样做的,但没有用。

我很困惑。

代码语言:javascript
复制
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <uxtheme.h>

#include <iostream>
using namespace std;


#define IDC_MAIN_BUTTON_1    101            // Button identifier
#define IDC_MAIN_BUTTON_2    102            // Button identifier
#define IDC_MAIN_BUTTON_3    103            // Button identifier
#define IDC_MAIN_BUTTON_4    104            // Button identifier

HWND hWndButton1;
HWND hWndButton2;
HWND hWndButton3;
HWND hWndButton4;

MSG msg;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK MyWndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass,
                            DWORD_PTR dwRefData);
int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInst,
                    LPSTR lpCmdLine,
                    int ShowCmd) {

    INITCOMMONCONTROLSEX icc;

    // Initialize common controls.
    icc.dwSize = sizeof(icc);
    icc.dwICC = ICC_WIN95_CLASSES        |
                ICC_COOL_CLASSES         |
                ICC_INTERNET_CLASSES     |
                ICC_LINK_CLASS           |
                ICC_STANDARD_CLASSES     |
                ICC_USEREX_CLASSES;
    InitCommonControlsEx(&icc);


    WNDCLASSEXW wClass;
    ZeroMemory(&wClass,sizeof(WNDCLASSEXW));

    wClass.cbSize                          = sizeof(WNDCLASSEX);
    wClass.hInstance                       = hInstance;
    wClass.lpszClassName                   = L"Window Class";
    wClass.lpfnWndProc                     = (WNDPROC)WndProc;
    wClass.style                           = CS_HREDRAW | CS_VREDRAW;
    wClass.lpszMenuName                    = NULL;
    wClass.hbrBackground                   = (HBRUSH)COLOR_WINDOW;
    wClass.hCursor                         = LoadCursor(NULL,IDC_ARROW);
    wClass.hIcon                           = NULL;
    wClass.hIconSm                         = NULL;
    wClass.cbClsExtra                      = 0;
    wClass.cbWndExtra                      = 0;

    RegisterClassEx(&wClass);

    HWND hWnd=CreateWindowExW(
            0,                          // in      DWORD    dwExStyle,
            L"Window Class",            // in_opt  LPCTSTR    lpClassName,
            L"Windows application",     // in_opt  LPCTSTR    lpWindowName,
            WS_OVERLAPPEDWINDOW,        // in      DWORD    dwStyle,
            200,                        // in      int        x,
            200,                        // in      int        y,
            640,                        // in      int        nWidth,
            480,                        // in      int        nHeight,
            NULL,                       // in_opt  HWND        hWndParent,
            NULL,                       // in_opt  HMENU    hMenu,
            hInstance,                  // in_opt  HINSTANCE hInstance,
            NULL);                      // in_opt  LPVOID    lpParam

    ShowWindow(hWnd,ShowCmd);


    ZeroMemory(&msg,sizeof(MSG));

    while(GetMessageW(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessageW(&msg);
    }
    return (int)&msg.wParam;
}

void Button_Proc (WPARAM, LPARAM);

LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    HWND GROUP1 = 0;
    HWND GROUP2 = 0;
    switch(msg)
    {
        case WM_CREATE:
        {

            // Create a group box
            GROUP1 = CreateWindowExW(
                0,
                L"BUTTON",
                L"Group",
                        WS_TABSTOP  |
                        WS_VISIBLE  |
                        WS_CHILD    |
                        BS_NOTIFY   |
                        BS_GROUPBOX  ,
                100,
                60,
                150,
                80,
                hWnd,
                0,
                GetModuleHandle(NULL),
                0);
                SetWindowSubclass(GROUP1, (SUBCLASSPROC) MyWndProc, 0, 0);

            // Create a group box
            GROUP2=CreateWindowExW(
                0,
                L"BUTTON",
                L"Group 2",
                        WS_TABSTOP  |
                        WS_VISIBLE  |
                        WS_CHILD    |
                        BS_GROUPBOX  ,
                100,
                160,
                150,
                80,
                hWnd,
                0,
                GetModuleHandle(NULL),
                0);
                SetWindowSubclass(GROUP2, (SUBCLASSPROC) MyWndProc, 0, 0);

            // Create a push button
            hWndButton1=CreateWindowExW(
                0,
                L"BUTTON",
                L"Option 1",
                        WS_TABSTOP  |
                        WS_VISIBLE  |
                        WS_CHILD    |
                        WS_GROUP    |
                        BS_NOTIFY   |
                        BS_AUTORADIOBUTTON  ,
                10,
                20,
                100,
                24,
                GROUP1,
                (HMENU)IDC_MAIN_BUTTON_1,
                GetModuleHandle(NULL),
                0);

            hWndButton2=CreateWindowExW(
                0,
                L"BUTTON",
                L"Option 2",
                        WS_TABSTOP  |
                        WS_VISIBLE  |
                        WS_CHILD    |
                        BS_NOTIFY   |
                        BS_AUTORADIOBUTTON  ,
                10,
                45,
                100,
                24,
                GROUP1,
                (HMENU)IDC_MAIN_BUTTON_2,
                GetModuleHandle(NULL),
                0);

            hWndButton3=CreateWindowExW(
                0,
                L"BUTTON",
                L"Option 3",
                        WS_TABSTOP  |
                        WS_VISIBLE  |
                        WS_CHILD    |
                        WS_GROUP    |
                        BS_NOTIFY   |
                        BS_AUTORADIOBUTTON  ,
                10,
                20,
                100,
                24,
                GROUP2,
                (HMENU)IDC_MAIN_BUTTON_3,
                GetModuleHandle(NULL),
                0);

            hWndButton4=CreateWindowExW(
                0,
                L"BUTTON",
                L"Option 4",
                        WS_TABSTOP  |
                        WS_VISIBLE  |
                        WS_CHILD    |
                        BS_NOTIFY   |
                        BS_AUTORADIOBUTTON  ,
                10,
                45,
                100,
                24,
                GROUP2,
                (HMENU)IDC_MAIN_BUTTON_4,
                GetModuleHandle(NULL),
                0);

        }
        break;
        case WM_NOTIFY:
            switch(LOWORD(wParam))
            {
                case IDC_MAIN_BUTTON_1:
                case IDC_MAIN_BUTTON_2:
                case IDC_MAIN_BUTTON_3:
                case IDC_MAIN_BUTTON_4:
                    {
                        Button_Proc(wParam,lParam);
                    }
                    break;
            }
            break;
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case IDC_MAIN_BUTTON_1:
                case IDC_MAIN_BUTTON_2:
                case IDC_MAIN_BUTTON_3:
                case IDC_MAIN_BUTTON_4:
                    {
                        Button_Proc(wParam,lParam);
                    }
                    break;
            }
            break;
        case WM_DESTROY:
        {
            RemoveWindowSubclass(GROUP1, (SUBCLASSPROC) MyWndProc, 0);
            RemoveWindowSubclass(GROUP2, (SUBCLASSPROC) MyWndProc, 0);
            PostQuitMessage(0);
            return 0;
        }
        break;
    }

    return DefWindowProcW(hWnd,msg,wParam,lParam);
}


void Button_Proc (WPARAM wParam, LPARAM lParam) {
    switch (HIWORD(wParam))
    {
        case BN_CLICKED:
        {
            cerr << "Button clicked\n";
        }
        break;
        case BN_DBLCLK:
        {
            cerr << "Button Double clicked\n";
        }
        break;
        case BN_KILLFOCUS:
        {
            cerr << "Button Lost Focus\n";
        }
        break;
        case BN_SETFOCUS:
        {
            cerr << "Button Set Focus\n";
        }
        break;
        //                case BCN_HOTITEMCHANGE:     // Controls Version 6.
        //                case BCN_DROPDOWN:          // Controls Version 6.
        //                case NM_CUSTOMDRAW:         // Controls Version 6.
        //                case WM_CTLCOLORBTN:        // Investigation Required.
    }
//    //http://msdn.microsoft.com/en-us/library/windows/desktop/bb849167(v=vs.85).aspx
//    if ( Button_GetCheck((HWND) lParam) == BST_UNCHECKED) {
//        Button_SetCheck( (HWND) lParam, BST_CHECKED);
//    } else {
//        Button_SetCheck( (HWND) lParam, BST_UNCHECKED);
//    }
}

LRESULT CALLBACK MyWndProc    (HWND hWnd,
                               UINT msg,
                               WPARAM wParam,
                               LPARAM lParam,
                               UINT_PTR uIdSubclass,
                               DWORD_PTR dwRefData) {
//    cerr << "Subclass Proc Called\n";
    switch (msg) {
        case WM_COMMAND: {
            switch(LOWORD(wParam)) {
                case IDC_MAIN_BUTTON_1:
                case IDC_MAIN_BUTTON_2:
                case IDC_MAIN_BUTTON_3:
                case IDC_MAIN_BUTTON_4: {
                    Button_Proc(wParam,lParam);
                }
                break;
            }
        }
        break;
    }
    return DefSubclassProc(hWnd, msg, wParam, lParam);
}
EN

回答 1

Stack Overflow用户

发布于 2015-07-20 10:31:21

如果要删除控件的黑色背景,可以尝试EnableThemeDialogTexture()

第二种方法(来自在WinXP中正确绘制主题对话框):

代码语言:javascript
复制
// WM_INITDIALOG
RECT rc;
GetWindowRect(hWnd,&rc);
HDC hDC=GetDC(hWnd);
HDC hDCMem=CreateCompatibleDC(hDC);
HBITMAP hBmp=CreateCompatibleBitmap(hDC,rc.right-rc.left,rc.bottom-rc.top);
HBITMAP hBmpOld=(HBITMAP)SelectObject(hDCMem,hBmp);
SendMessage(hWnd,WM_PRINTCLIENT,(WPARAM)hDCMem,(LPARAM)(PRF_ERASEBKGND|PRF_CLIENT|PRF_NONCLIENT));
hBrush=CreatePatternBrush(hBmp); // HBRUSH hBrush is global
SelectObject(hDCMem,hBmpOld);
DeleteObject(hBmp);
DeleteDC(hDCMem);
ReleaseDC(hWnd,hDC);

//WM_CTLCOLORSTATIC
RECT rc;
SetBkMode((HDC)wParam,TRANSPARENT);
GetWindowRect((HWND)lParam,&rc);
MapWindowPoints(NULL,hWnd,(LPPOINT)&rc,2);
SetBrushOrgEx((HDC)(wParam),-rc.left,-rc.top,NULL);
return (LRESULT)hBrush;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10974346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档