Как получить фактический размер кнопки панели инструментов, созданной в стиле BTNS_AUTOSIZE? - PullRequest
0 голосов
/ 01 января 2019

Я создал панель инструментов со следующими стилями:

DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS
                | CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NORESIZE
                | TBSTYLE_FLAT | TBSTYLE_LIST;

Затем я заполняю панель инструментов только текстовыми кнопками:

bool InsertButton(int Index, int CmdId, BYTE Style, BYTE State,
                  int TxtIdx, DWORD_PTR lParam)
{
    TBBUTTON tbb = { 0 };
    tbb.idCommand = CmdId;
    tbb.fsStyle = Style;    // == BTNS_AUTOSIZE | BTNS_DROPDOWN
    tbb.fsState = State;
    tbb.iBitmap = I_IMAGENONE;
    tbb.iString = TxtIdx;
    tbb.dwData = lParam;

    return (bool)CToolBarCtrl::InsertButton(Index, &tbb);
}

После заполнения панели инструментов я хочучтобы получить реальный размер его кнопок.Но GetButtonInfo возвращает нулевой размер.

int GetBtnSize(int Idx) const
{
    TBBUTTONINFO tbbi = { sizeof(tbbi), TBIF_SIZE | TBIF_BYINDEX };
    GetButtonInfo(Idx, &tbbi);
    return tbbi.cx;
}

Что я делаю не так и как узнать фактический размер кнопки?

1 Ответ

0 голосов
/ 02 января 2019

Частичный ответ:

Используйте CToolBarCtrl::GetItemRect, чтобы найти прямоугольник для кнопки панели инструментов.


CToolBarCtrl::GetButtonInfo (инкапсуляция MFC для TB_GETBUTTONINFO) также должна возвращать кнопкуширина, основываясь на документации, я не знаю, почему это не так.

Если панель инструментов создана в стиле TBSTYLE_WRAPABLE, а кнопка на панели инструментов имеет флаг BTNS_AUTOSIZE, то GetButtonInfo вернетправильное значение для TBBUTTONINFO::cx.Пример:

BOOL CMyDialog::OnInitDialog()
{
    CDialog::OnInitDialog();
    toolbar.Create(WS_CHILD | WS_VISIBLE | TBSTYLE_WRAPABLE, CRect(0, 0, 0, 0), this, 100);
    toolbar.SendMessage(TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
    toolbar.AddStrings(L"New\0Open\0Save\0\0");

    TBBUTTON tbb[2] = {
         { 0, 1000, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0}, 0, 0},
         { 0, 1001, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0}, 0, 1},
    };
    toolbar.AddButtons(_countof(tbb), tbb);
    toolbar.AutoSize();

    TBBUTTONINFO tbbi = { sizeof(tbbi), TBIF_BYINDEX | TBIF_SIZE };
    toolbar.GetButtonInfo(0, &tbbi);
    TRACE("tbbi.cx = %d", tbbi.cx);
    return TRUE;
}
...