如何获取使用 BTNS_AUTOSIZE 样式创建的工具栏按钮的实际大小?
How to get the actual size of the toolbar button created with BTNS_AUTOSIZE style?
我创建了一个具有以下样式的工具栏:
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 returns 零大小。
int GetBtnSize(int Idx) const
{
TBBUTTONINFO tbbi = { sizeof(tbbi), TBIF_SIZE | TBIF_BYINDEX };
GetButtonInfo(Idx, &tbbi);
return tbbi.cx;
}
我哪里做错了,我怎么知道按钮的实际大小?
部分答案:
使用 CToolBarCtrl::GetItemRect
找到工具栏按钮的矩形。
CToolBarCtrl::GetButtonInfo
(MFC封装TB_GETBUTTONINFO
)也应该return按钮的宽度,根据文档,我不知道为什么没有。
如果工具栏是使用 TBSTYLE_WRAPABLE
样式创建的,并且工具栏按钮具有 BTNS_AUTOSIZE
标志,则 GetButtonInfo
将 return 为 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[=10=]Open[=10=]Save[=10=][=10=]");
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;
}
我创建了一个具有以下样式的工具栏:
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 returns 零大小。
int GetBtnSize(int Idx) const
{
TBBUTTONINFO tbbi = { sizeof(tbbi), TBIF_SIZE | TBIF_BYINDEX };
GetButtonInfo(Idx, &tbbi);
return tbbi.cx;
}
我哪里做错了,我怎么知道按钮的实际大小?
部分答案:
使用 CToolBarCtrl::GetItemRect
找到工具栏按钮的矩形。
CToolBarCtrl::GetButtonInfo
(MFC封装TB_GETBUTTONINFO
)也应该return按钮的宽度,根据文档,我不知道为什么没有。
如果工具栏是使用 TBSTYLE_WRAPABLE
样式创建的,并且工具栏按钮具有 BTNS_AUTOSIZE
标志,则 GetButtonInfo
将 return 为 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[=10=]Open[=10=]Save[=10=][=10=]");
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;
}