2

私はWin32 APIをゆっくりと学んでおり、これに困惑しています:

空白のコントロール

「Classic Look」と「Windows 7 Aero Glass」の両方の外観で Windows 7 で実行すると、すべて問題なく、コントロールに Aero の外観があり、その外観では正常に見えます。これを XP マシンで「クラシック ルック」で実行すると、すべて問題ないように見えますが、「Windows XP テーマ」で XP で実行すると、上記の結果が得られます。

http://msdn.microsoft.com/en-us/library/bb773175%28VS.85%29.aspxの Visual Styles に関する Microsoft のガイドラインに従って、3 つのことを行う必要がありました。

1. ComCtl32.lib にリンクし、InitCommonControls を呼び出します。

これを確認して、リンカー設定にcomctl32を追加しました。

2. XML マニフェスト形式のソース ツリーに、YourApp.exe.manifest という名前のファイルを追加します。

チェック、これをしました。私は使用していたバージョンを持っていましたが、安全のために、彼らのサイトで提案されているバージョンを試してみました. (はい、アプリケーションの名前を付けることを知っています....)

3. 次のように、アプリケーションのリソース ファイルにマニフェストを追加します。

チェック、これをしました。彼らが提案する指定された行をrcファイルに追加しました。

したがって、すべての条件下で、Windows XP スタイルのテーマを除いてすべてが機能します。

私が残っていると考えている唯一のことは、どういうわけか私はWM_PAINTメッセージに応答していないということですが、それをデフォルトのウィンドウプロシージャに渡して、ウィンドウがその点でそのことをできるようにしています。(それが機能していないかどうかはわかりませんでした。他の場所では機能しません。)

この投稿と同様の投稿を見たところ、InitCommonControlsEx を使用するように言われましたが、それも役に立ちませんでした。

私は困惑しています。

#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);
}
4

1 に答える 1