3

ツールバーのパディングをゼロに設定しようとしていますが、TB_SETPADDINGメッセージは水平パディングにのみ影響し、垂直パディングには影響しません。

ボタンの境界線を強調するために、配色を赤と緑に設定しました。これが出力です。

ここに画像の説明を入力

なぜこれが起こっているのか誰かが私に説明できますか?

これは完全なコードです:

#include <windows.h> 
#include <stdlib.h>
#include <CommCtrl.h>
#pragma comment(lib, "comctl32.lib")

#define IDB_PRINT 40000

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE instance;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    instance = 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(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));  
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW); 
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1); 
    wcex.lpszMenuName   = NULL; 
    wcex.lpszClassName  = L"Example"; 
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

    RegisterClassEx(&wcex);

    HWND hWnd = CreateWindow(L"Example", L"", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
        500, 500, NULL, NULL, hInstance, NULL);

    // Initialize common controls.
    INITCOMMONCONTROLSEX icex;
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    icex.dwICC   = ICC_COOL_CLASSES | ICC_BAR_CLASSES;
    InitCommonControlsEx(&icex);

    // create toolbar
    HWND hToolbar = CreateWindowExW(WS_EX_TOOLWINDOW | TBSTYLE_EX_HIDECLIPPEDBUTTONS, TOOLBARCLASSNAME, NULL, CCS_NODIVIDER | WS_CHILD | WS_VISIBLE | CCS_ADJUSTABLE | TBSTYLE_ALTDRAG | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS,
        0, 0, 0, 0, hWnd, (HMENU)0, instance, NULL);

    SendMessage(hToolbar, TB_SETMAXTEXTROWS, 0, 0);

    // create image list
    HIMAGELIST hImageList = ImageList_Create(20,20, ILC_COLORDDB, 4, 0);
    ImageList_Add(hImageList, LoadBitmap(instance, MAKEINTRESOURCEW(IDB_PRINT)), NULL);
    ImageList_Add(hImageList, LoadBitmap(instance, MAKEINTRESOURCEW(IDB_PRINT)), NULL);

    // set the image list
    SendMessage(hToolbar, TB_SETIMAGELIST, (WPARAM)0, (LPARAM)hImageList);
    SendMessage(hToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);

    // create button
    TBBUTTON tbb[1] = 
    { 
        {0, 0, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0}, 0, (INT_PTR)L"Print"},
    };

    // add button to the toolbar
    SendMessage(hToolbar, (UINT)TB_ADDBUTTONS, 1, (LPARAM)&tbb);
    SendMessage(hToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(20, 20));
    SendMessage(hToolbar, TB_AUTOSIZE, 0, 0);
    DWORD res = SendMessage(hToolbar, TB_SETPADDING, 0, MAKELPARAM(0, 0));

    // set color scheme to red and green
    COLORSCHEME cs;
    cs.dwSize = sizeof(cs);
    cs.clrBtnShadow = RGB(255, 0, 0);
    cs.clrBtnHighlight = RGB(0, 255, 0);
    SendMessage(hToolbar, TB_SETCOLORSCHEME, 0, (LPARAM)&cs);

    // set the padding size to zero
    SendMessage(hToolbar, TB_SETPADDING, 0, MAKELPARAM(0, 0));

    // show the toolbar
    ShowWindow(hToolbar, SW_SHOW);

    // show the main window
    ShowWindow(hWnd, nCmdShow);

    MSG msg;

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);  
        DispatchMessage(&msg); 
    }

    return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_CREATE: 
            return 0;

        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
}

=== 編集 ===

これは私のリソースファイルにあるものです:

#define IDB_PRINT 40000
IDB_PRINT BITMAP "print.bmp"

これはprint.bmpファイルです:
ここに画像の説明を入力

4

1 に答える 1

2

問題はボタンのサイズではなく、ツールバー ウィンドウのサイズだと思います。

スタイルを呼び出しCreateWindowExて含めるとCCS_NORESIZE、ツールバー ウィンドウの既定のサイズ変更動作が無効になります。MSDNが言うように

ここに画像の説明を入力

これは、ツールバーが rebar コントロールによってホストされている場合にMSDN が推奨する手法です。

鉄筋

必要に応じてツールバーのサイズと位置を「手動で」変更しなければならないのは明らかに面倒ですが、ウィンドウを作成して目的の効果を得ることができます。たとえば、作成時に固定の幅と高さを指定します (そしてCCS_NORESIZEスタイルを適用します) 。

// create toolbar
HWND hToolbar = CreateWindowExW(WS_EX_TOOLWINDOW | TBSTYLE_EX_HIDECLIPPEDBUTTONS, TOOLBARCLASSNAME, NULL, 
    CCS_NORESIZE | CCS_NODIVIDER | WS_CHILD | WS_VISIBLE | CCS_ADJUSTABLE | TBSTYLE_ALTDRAG | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS,
    0, 0, 500, 21, hWnd, (HMENU)0, instance, NULL);

これは元の例のような拡大されたスクリーンショットですが、上記の変更があります (1px y オフセットに対応するために高さが 21 に設定されています)。

ここに画像の説明を入力

ツールバー ボタンを正確に 20x20 にし、ボタンの上部のパディングを削除するには、CCS_NOPARENTALIGNスタイルを使用して、ウィンドウの原点を負の y 値に設定し、それに応じて高さを拡張することもできます。

たとえば、このコード

// create toolbar
HWND hToolbar = CreateWindowExW(WS_EX_TOOLWINDOW | TBSTYLE_EX_HIDECLIPPEDBUTTONS, TOOLBARCLASSNAME, NULL, 
    CCS_NORESIZE | CCS_NOPARENTALIGN | CCS_NODIVIDER | WS_CHILD | WS_VISIBLE | CCS_ADJUSTABLE | TBSTYLE_ALTDRAG | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS,
    0, -2, 500, 22, hWnd, (HMENU)0, instance, NULL);

この結果を生成します

tbb2

于 2013-06-15T14:57:54.000 に答える