3

私のプログラムでは、ステータス バー コントロールを作成し、新しいフォントを設定しました。私が抱えている問題は、XP Visual Styles マニフェスト (つまり、Common controls 6.0) を含めると、ステータス バーが新しいフォント サイズに合わせてサイズ変更されないことです。

例えば

hGiantFont = CreateFont(-48, 0, 0, 0, FW_NORMAL, FALSE, FALSE,      
   FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
   CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH |    
   FF_DONTCARE, L"MS Shell Dlg 2");

hStatusBar = CreateWindowEx ( 
   0, STATUSCLASSNAME, NULL, WS_CHILD | WS_VISIBLE, 
   0, 0, 0, 0, hWnd, (HMENU)666, hInst, NULL    
);      

SendMessage(hStatusBar, WM_SETFONT, (WPARAM)hGiantFont,  
   (LPARAM)MAKELONG(TRUE, 0));

SendMessage(hStatusBar, WM_SIZE, 0, 0);

最後の行を実行した後、何も起こりません! サイズは変更されません。ビジュアル スタイル マニフェストを含めなくても、問題なく動作することに注意してください。ICC_BAR_CLASSES を使用して InitCommonControls() と InitCommonControlsEX() の両方を試しましたが、役に立ちませんでした。

また、MoveWindow と SetWindowPos を使用してサイズを変更したり、ステータス バーを移動したりしてみました。ビジュアル スタイル マニフェストが含まれていると、ステータス バーは移動せず、特定のサイズと位置に固定されているように見えます。

これは ComCtl32.dll 6.0 のバグですか? または非常に迷惑な意図された機能。回避策は何ですか?

また、成功した結果で同じことを試みた人はいますか?

編集:

わかりました、プログラム全体を以下に含めることにしました。これにより、人々はそれを試して、私の意味を理解できるようになります。これは、いくつかの行が追加された、基本的な Win32 アプリです。上部の #pragma マニフェスト行をコメント アウトすると、期待どおりに機能し、マニフェスト行ではステータス バーのサイズが変更されないことがわかります。

// StupidStatusBar.cpp : Defines the entry point for the application.

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df'    language='*'\"") 

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <tchar.h>
#include <commctrl.h>
#pragma comment(lib, "comctl32.lib")

// Global Variables:
HINSTANCE hInst;                                    
wchar_t *szTitle = L"Stupid Status Bar";    
wchar_t *szWindowClass = L"StupidClass";    

// Forward declarations of functions included in this code module:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    INITCOMMONCONTROLSEX icex;

    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    icex.dwICC = ICC_WIN95_CLASSES;

    if(!InitCommonControlsEx(&icex))
    {
        MessageBox(NULL, L"Error initializing common controls", L"Error", MB_OK);
        return 1;
    }

    MyRegisterClass(hInstance);

    // Perform application initialization:
    if (!InitInstance (hInstance, nCmdShow))
        return FALSE;

    // Main message loop:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int) msg.wParam;
}   

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style      = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon      = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);

    return RegisterClassEx(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
      return FALSE;

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HWND hStatusBar;
    HFONT hGiantFont;

    switch (message)
    {
    case WM_CREATE:
        hGiantFont = CreateFont(-48, 0, 0, 0, FW_NORMAL, FALSE, FALSE,     FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
        CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"MS Shell Dlg 2");

        hStatusBar = CreateWindowEx ( 
            0, STATUSCLASSNAME, NULL, WS_CHILD | WS_VISIBLE, 
            0, 0, 0, 0, hWnd, (HMENU)666, hInst, NULL   
        );      
        SendMessage(hStatusBar, WM_SETFONT, (WPARAM)hGiantFont, (LPARAM)MAKELONG(TRUE, 0));
        SendMessage(hStatusBar, WM_SIZE, 0, 0);
        SetWindowText(hStatusBar, L"Testing Testing");
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
4

2 に答える 2

2

解決しました。ステータス バーのデフォルト プロシージャをオーバーライドし、その WM_SIZE ケースを 0 に戻す必要がありました。次に、メイン ウィンドウから MoveWindow を使用して手動でサイズを変更しました。

于 2012-10-24T15:12:18.827 に答える