自定义工具栏和状态栏的方法如下:
定义一个新类派生子CToolBar,然后在该类中加入需要融入的新控件等,并设计相关构建子控件方法.
简要实现代码如下:
class CTBar : public CToolBar
{
public:
CComboBox m_comBox;
BOOL CreateComBox(int index);
};
BOOL CTBar::CreateComBox(int index)
{
if(m_comBox.GetSafeHwnd())
return FALSE;
CToolBarCtrl& tb = GetToolBarCtrl();
TBBUTTON btn;
CRect rect;
btn.fsStyle = TBSTYLE_SEP;
tb.InsertButton(index,&btn);//插入空位
tb.InsertButton(index,&btn);
//tb.InsertButton(index,&btn);
SetButtonInfo(index,ID_SEPARATOR,TBBS_SEPARATOR,100);
SetButtonInfo(index+1,IDC_TBAR,TBBS_SEPARATOR,5);//中间下拉列表框
//SetButtonInfo(index+2,ID_SEPARATOR,TBBS_SEPARATOR,20);
GetItemRect(index,&rect); //获取到了长度 100
rect.top = 0; //设置高度
rect.bottom = rect.top + 100;
if(!m_comBox.Create(CBS_DROPDOWN | WS_VISIBLE | WS_TABSTOP, rect, this, IDC_TBAR))
return FALSE;
m_comBox.SetItemHeight(-1,15);
return TRUE;
}
然后在MainFrame的OnCreate事件函数中,在创建工具栏后加入调用过程
m_wndToolBar.CreateComBox(0);//最左边创建下拉列表框
m_wndToolBar.m_comBox.AddString("item1");
m_wndToolBar.m_comBox.AddString("item2");
m_wndToolBar.m_comBox.AddString("item3");
m_wndToolBar.m_comBox.AddString("item4");
状态栏类推
class CSBar : public CStatusBar
{
public:
CProgressCtrl m_process;
int m_nProcessPan;
BOOL CreateProcessCtrl(int index);
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnSize(UINT nType, int cx, int cy);
};
BOOL CSBar::CreateProcessCtrl(int index){
if(m_process.GetSafeHwnd())
return FALSE;
SetPaneInfo(index,GetItemID(index),SBPS_NORMAL,150);
CRect rect(0,0,0,1);//创建一个隐藏的矩形区,然后在OnSize中动态的修改它的大小
if(!m_process.Create(WS_CHILD | WS_VISIBLE,rect,this,IDC_INDICATOR_PROGRESS))
return FALSE;
m_nProcessPan = index;
return TRUE;
}
BEGIN_MESSAGE_MAP(CSBar, CStatusBar)
ON_WM_SIZE()
END_MESSAGE_MAP()
void CSBar::OnSize(UINT nType, int cx, int cy)
{
CStatusBar::OnSize(nType, cx, cy);
if(!m_process.GetSafeHwnd()) return;
CRect rect;
GetItemRect(m_nProcessPan,&rect);
m_process.MoveWindow(rect);
}
调用过程:
m_wndStatusBar.CreateProcessCtrl(1);//第二个窗格创建进度条
m_wndStatusBar.m_process.SetRange(0,200);
m_wndStatusBar.m_process.SetPos(50);
m_wndStatusBar.SetPaneInfo(2,ID_SEPARATOR,SBPS_NORMAL,110);
SetTimer(1,1000,NULL);//状态栏时钟功能
void CMainFrame::OnTimer(UINT nIDEvent)
{
if(nIDEvent == 1){
CTime time = CTime::GetCurrentTime();
m_wndStatusBar.SetPaneText(2,time.Format("%Y-%m-%d %H:%M:%S"));
}
CFrameWnd::OnTimer(nIDEvent);
}