CToolbar的bug?

shangxingu 2009-04-21 10:19:42
我在开发一个CAD软件时,遇到一个奇怪的问题。
我想实现如下布局的Toolbar。
图层 | 线型 | 线宽。
其中图层,线型,线宽是三个combox。

代码如下:

EntityPropBar.h文件

#define IDC_TB_ENTITY_FIRST 40010
#define IDC_TB_ENTITY_LAST 40049

class CEntityPropBar : public CToolBar
{
// Construction
public:
CEntityPropBar();

// Attributes
public:
CComboBox m_cbxLWeight;
CComboBox m_cbxLType;
CComboBox m_cbxColor;
// Operations
public:
void LoadControls();

// Implementation
public:
virtual ~CEntityPropBar();
};


EntityPropBar.cpp文件

void CEntityPropBar::LoadControls()
{
UINT buttons[] =
{
IDC_TB_ENTITY_FIRST, //(位置0) 图层ComboBox
ID_SEPARATOR,
IDC_TB_ENTITY_FIRST+1, //(位置2) 线型ComboBox
ID_SEPARATOR,
IDC_TB_ENTITY_FIRST+2, //(位置4) 线宽ComboBox
//IDC_TB_ENTITY_LAST,//如果改成ID_SEPARATOR不行
/*
按照常理5个button就够了,可是这样子的结果是toolbar显示为一条线,高度为0.
所以我的解决办法是再加一个IDC_TB_ENTITY_LAST,但是这样toolbar上就多了一个button,很难看*/
};


SetButtons(buttons, sizeof(buttons)/sizeof(UINT));
const int nDropHeight = 100;

CRect rect;
// 创建图层combobox
SetButtonInfo(0, IDC_TB_ENTITY_FIRST, TBBS_SEPARATOR, 140);
GetItemRect(0, &rect);
rect.bottom += nDropHeight;
if (!m_cbxColor.Create(CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP|WS_VSCROLL|CBS_HASSTRINGS,
rect, this, IDC_TB_ENTITY_FIRST))
{
TRACE0("Failed to create combo-box\n");
return;
}
m_cbxColor.AddString("ByLayer");
m_cbxColor.AddString("ByBlock");
m_cbxColor.AddString("红色");
m_cbxColor.AddString("黄色");

//创建线型combobox
SetButtonInfo(2, IDC_TB_ENTITY_FIRST+1, TBBS_SEPARATOR, 160);
GetItemRect(2, &rect);
rect.bottom += nDropHeight;
if (!m_cbxLType.Create(CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP|WS_VSCROLL|CBS_HASSTRINGS,
rect, this, IDC_TB_ENTITY_FIRST+1))
{
TRACE("Failed to create combo-box\n");
return;
}
m_cbxLType.AddString("ByLayer");
m_cbxLType.AddString("ByBlock");
m_cbxLType.AddString("Continuous");

//创建线宽combobox
SetButtonInfo(4, IDC_TB_ENTITY_FIRST+2, TBBS_SEPARATOR, 160);
GetItemRect(4, &rect);
rect.bottom += nDropHeight;
if (!m_cbxLWeight.Create(CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP|WS_VSCROLL|CBS_HASSTRINGS,
rect, this, IDC_TB_ENTITY_FIRST+2))
{
TRACE("Failed to create combo-box\n");
return;
}
m_cbxLWeight.AddString("ByLayer");
m_cbxLWeight.AddString("ByBlock");
m_cbxLWeight.AddString("默认");

//SetButtonInfo(5, ID_SEPARATOR, TBBS_SEPARATOR, 6);不行
}


MainFrm.cpp文件


int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
...
if (!m_wndEntityPropBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
{
TRACE0("Failed to create entity properties toolbar\n");
return -1;
}
m_wndEntityPropBar.LoadControls();
m_wndEntityPropBar.SetWindowText("对象属性");

...

// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndEntityPropBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
DockControlBar(&m_wndEntityPropBar);

return 0;
}

见上面代码的一段注释。本来我是想在toolbar上有5个button。可是结果toolbar显示为一条线。高度为0。我试验了好几次。
要么去掉一个线宽ComboBox。要么再增加一个空白button。总之两个ComboBox是正常的。三个就显示不了。不知道为什么?
我本来还想,既然要6个button,那我就用6个button,把最后一个button设为分割线,如下:
SetButtonInfo(2, IDC_TB_ENTITY_FIRST+1, TBBS_SEPARATOR, 160);
也不行。我很郁闷,各位帮帮忙.
...全文
76 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xsc2001 2009-05-01
  • 打赏
  • 举报
回复
完全依CAD?功能都实现了吗?
hwl2788 2009-05-01
  • 打赏
  • 举报
回复
shangxingu 2009-04-21
  • 打赏
  • 举报
回复
不好意思,倒数第二行错了。

SetButtonInfo(5, ID_SEPARATOR, TBBS_SEPARATOR, 6);

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧