在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);
}