现在我要实现这样一个需求,在一个新建的工具栏里添加两个控件:一个是静态文本控件,一个是进度条控件。我想静态文本控件的长度是50,进度条控件是100。我是这样做的:1. 添加一个工具栏资源,里面加两个按钮:
ID_STATICTEXT_PLACE // 静态文本ID_PROGRESS_PLACE // 进度条控件在资源编辑器里编辑按钮长度为100,高度为20 (不知怎的,无论编辑哪一个,这两个按钮的长度和高度都是一样的)2.在CMainFrame类里添加三个变量: CToolBar m_oTherToolBar; // 新建工具栏 CStatic m_Text; // 静态文本
CProgressCtrl m_ProgressCtrl; // 进度条3.添加创建静态文本和进度条控件的两个函数:// 创建静态文本
BOOL CMainFrame::CreateText()
{
CRect rect;
#define TEXTWIDTH 50 //静态文本的宽度 //首先取得进度条在工具栏中的位置
int index=0;
while(m_oTherToolBar.GetItemID(index)!=ID_STATICTEXT_PLACE)
index++;
m_oTherToolBar.SetButtonInfo(index,ID_STATICTEXT_PLACE,TBBS_SEPARATOR,TEXTWIDTH);
m_oTherToolBar.GetItemRect(index,&rect); BOOL Ret = m_Text.Create(_T("就绪"),WS_CHILD|WS_VISIBLE|ES_LEFT,rect,&m_oTherToolBar,index); if(Ret)
return TRUE;
else
return FALSE;
}
// 创建进度条
BOOL CMainFrame::CreateProgressCtrl()
{
CRect rect;
#define PROGRESSWIDTH 100 //进度条的宽度 //首先取得进度条在工具栏中的位置
int index=0;
while(m_oTherToolBar.GetItemID(index)!=ID_PROGRESS_PLACE)
index++;
m_oTherToolBar.SetButtonInfo(index,ID_PROGRESS_PLACE,TBBS_SEPARATOR,PROGRESSWIDTH);
m_oTherToolBar.GetItemRect(index,&rect);
BOOL Ret = m_ProgressCtrl.Create(WS_CHILD|WS_VISIBLE|ES_LEFT
|ES_AUTOHSCROLL,rect,&m_oTherToolBar,index); m_ProgressCtrl.SetPos(40);
if(Ret)
return TRUE;
else
return FALSE;}
4.在CMainFrame::OnCreate函数分别调用这两个函数:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}// 创建新的工具栏
if (!m_oTherToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_oTherToolBar.LoadToolBar(IDR_TOOLBAR1))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}// 创建静态文本
CreateText(); // 创建进度条
CreateProgressCtrl();
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
} // TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); m_oTherToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar); DockControlBar(&m_oTherToolBar); return 0;
} 结果编译通过,但是运行起来什么效果也没有,为什么呢?
ID_STATICTEXT_PLACE // 静态文本ID_PROGRESS_PLACE // 进度条控件在资源编辑器里编辑按钮长度为100,高度为20 (不知怎的,无论编辑哪一个,这两个按钮的长度和高度都是一样的)2.在CMainFrame类里添加三个变量: CToolBar m_oTherToolBar; // 新建工具栏 CStatic m_Text; // 静态文本
CProgressCtrl m_ProgressCtrl; // 进度条3.添加创建静态文本和进度条控件的两个函数:// 创建静态文本
BOOL CMainFrame::CreateText()
{
CRect rect;
#define TEXTWIDTH 50 //静态文本的宽度 //首先取得进度条在工具栏中的位置
int index=0;
while(m_oTherToolBar.GetItemID(index)!=ID_STATICTEXT_PLACE)
index++;
m_oTherToolBar.SetButtonInfo(index,ID_STATICTEXT_PLACE,TBBS_SEPARATOR,TEXTWIDTH);
m_oTherToolBar.GetItemRect(index,&rect); BOOL Ret = m_Text.Create(_T("就绪"),WS_CHILD|WS_VISIBLE|ES_LEFT,rect,&m_oTherToolBar,index); if(Ret)
return TRUE;
else
return FALSE;
}
// 创建进度条
BOOL CMainFrame::CreateProgressCtrl()
{
CRect rect;
#define PROGRESSWIDTH 100 //进度条的宽度 //首先取得进度条在工具栏中的位置
int index=0;
while(m_oTherToolBar.GetItemID(index)!=ID_PROGRESS_PLACE)
index++;
m_oTherToolBar.SetButtonInfo(index,ID_PROGRESS_PLACE,TBBS_SEPARATOR,PROGRESSWIDTH);
m_oTherToolBar.GetItemRect(index,&rect);
BOOL Ret = m_ProgressCtrl.Create(WS_CHILD|WS_VISIBLE|ES_LEFT
|ES_AUTOHSCROLL,rect,&m_oTherToolBar,index); m_ProgressCtrl.SetPos(40);
if(Ret)
return TRUE;
else
return FALSE;}
4.在CMainFrame::OnCreate函数分别调用这两个函数:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}// 创建新的工具栏
if (!m_oTherToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_oTherToolBar.LoadToolBar(IDR_TOOLBAR1))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}// 创建静态文本
CreateText(); // 创建进度条
CreateProgressCtrl();
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
} // TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); m_oTherToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar); DockControlBar(&m_oTherToolBar); return 0;
} 结果编译通过,但是运行起来什么效果也没有,为什么呢?
工具栏不可以创建控件? 兄弟,这个可以的,我试过了,
// 创建静态文本
CreateText(); // 创建进度条
// CreateProgressCtrl(); // 这里注释掉
这样静态文本就出来了。
大虾,我是把控件创建在分割符上啊,不信你看我的代码:// 设置按钮信息,TBBS_SEPARATOR风格指定为分隔符
m_oTherToolBar.SetButtonInfo(index,ID_PROGRESS_PLACE,TBBS_SEPARATOR,PROGRESSWIDTH);
m_oTherToolBar.GetItemRect(index,&rect); // 创建控件
BOOL Ret = m_ProgressCtrl.Create(WS_CHILD ¦WS_VISIBLE ¦ES_LEFT
¦ES_AUTOHSCROLL,rect,&m_oTherToolBar,index);