2

hereで説明されているように、ボタンにスタイルを設定しないBTNS_SHOWTEXTと、ボタンのテキストには表示されませんが、マウスをボタンの上に置くと、テキストとともにツールチップが表示されます。

このコード サンプル テキストがボタンに表示され、ツールチップが表示されない理由がわかりません。

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

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 hWndToolbar = CreateWindowEx(0 , TOOLBARCLASSNAME, NULL, WS_CHILD | TBSTYLE_TOOLTIPS,
            0, 0, 0, 0, hWnd, (HMENU)0, instance, NULL);

    HIMAGELIST hImageList = ImageList_Create(16, 16, ILC_COLOR16 | ILC_MASK, 3, 0);

    SendMessage(hWndToolbar, TB_SETIMAGELIST, (WPARAM)0, (LPARAM)hImageList);
    SendMessage(hWndToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);

    TBBUTTON tbb[1] = 
    {
        { 0, 0, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0, (INT_PTR)L"New" },
    };

    SendMessage(hWndToolbar, (UINT) TB_ADDBUTTONS, 1, (LPARAM)&tbb);

    SendMessage(hWndToolbar, TB_AUTOSIZE, 0, 0);
    ShowWindow(hWndToolbar , 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);
    }
}
4

2 に答える 2

1

あなたのコードはほぼ正しいです.1行だけ欠けています:

SendMessage(hWndToolbar, TB_SETMAXTEXTROWS, 0, 0);

ツールバー ウィンドウの作成とそれを表示する場所の間のどこかに置くことができます。それは単なる初期化コードです。テスト目的で、TB_AUTOSIZEメッセージを送信する前に追加しました。

説明どおりに機能するようになりました。ツールバー ボタンにカーソルを合わせると、ボタン テキストを含むツールチップが表示されます。1 つだけ注意してください: ボタンのテキストは実際にはボタン自体に表示されません。

考えてみれば、そのようなことは理にかなっています。基本的に、文字列全体がボタン自体に既に表示されている場合、ツールチップにテキストを表示しても意味がありません。自動ツールチップが表示される唯一の方法は、ボタンのテキストが収まらない場合です。TB_SETMAXTEXTROWSメッセージを送信すると、テキストに使用できる最大行数を 0 に設定することで、テキストが収まらないことが保証されます。

これについては、MSDN のハウツー記事「ボタンのツールヒントを表示する方法」で詳しく説明されています。

于 2013-05-27T09:34:33.860 に答える