在ToolBar中加其他控件
最近有網友提到這個問題,本來可以用dialogbar來解決,後來想了想如果一定要用ToolBar怎麼辦呢?所以就試了試。
1》。在要加其他控件的CToolBar上加一個按鈕,(資源編輯中),起名ID_COMBO_IN_TOOLBAR。
2》。在dialog頭文件中加一個CComboBox m_DlgCombo;//該控件的響應要自己寫,MFC幫不上忙。
2》。在OnInitDialog()中增加:
#define CTRL_WIDTH 76 //所加combobox的寬度。
BOOL CDlgHasToolBarDlg::OnInitDialog()
{
。。。
//爲dialog添加ToolBar:
// TODO: Add extra initialization here
// | CBRS_GRIPPER | CBRS_FLYBY | CBRS_SIZE_FIXED
if (!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
AfxMessageBox("Failed to create toolbar/n");
return -1; // fail to create
}
// 找到那個按鈕PlaceHolder,即ID_COMBO_IN_TOOLBAR。
int idx=0;
while(m_wndToolBar.GetItemID(idx) != ID_COMBO_IN_TOOLBAR) idx++;
// 把該按鈕改爲指定寬度的分隔符
m_wndToolBar.SetButtonInfo(idx,ID_COMBO_IN_TOOLBAR,TBBS_SEPARATOR,CTRL_WIDTH);
// 設置ComboBox尺寸
CRect rc;
m_wndToolBar.GetItemRect(idx,&rc);
rc.bottom += 200;//設置下拉表高度
// 事件響應應該這樣寫: ON_CBN_EDITCHANGE(ID_COMBO_IN_TOOLBAR, OnEditchangeCombo)
//在ToolBar中產生我們要的CComboBox
m_DlgCombo1.Create(WS_CHILD|WS_VISIBLE|CBS_AUTOHSCROLL|CBS_DROPDOWN|CBS_HASSTRINGS,
rc,&m_wndToolBar,
ID_COMBO_IN_TOOLBAR);// !!!!!
// 填充下拉表
m_DlgCombo1.ShowWindow(SW_SHOW);
m_DlgCombo1.AddString("xxxx");
m_DlgCombo1.AddString("yyyy");
m_DlgCombo1.AddString("zzzz");
m_DlgCombo1.SetCurSel(0);//E800->E8FF // reposQuery, rcClientNow);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
。。。
}
//通過以上的辦法就可以爲CDialog中的CToolBar增加其他的控件如CStatic。。。
另外提一下CBoolBar的ToolTip問題。要注意的是CBoolBar響應OnToolTipNotify()時給出的按鈕的ID號,不是窗口Handle:
BOOL CDlgHasToolBar::OnToolTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult )
{
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
UINT nID =pNMHDR->idFrom;
char txt[256];
if (pNMHDR->code==TTN_NEEDTEXT)
{
if(pTTT->uFlags & TTF_IDISHWND)
{// idFrom is actually the HWND of the tool
nID = ::GetDlgCtrlID((HWND)nID);//dlg上其他控件
}
if(nID)
{//ToolBar在這裏響應
sprintf(txt,"%d",nID);
pTTT->lpszText = txt;
return(TRUE);
}
}
return(FALSE);
}