关于带下拉菜单的TOOLBAR按钮
网上经常会搜到跟这个内容差不多的帖子:
http://wenku.baidu.com/view/6bda2a630b1c59eef8c7b4fd.html
大意是说,要设置按钮风格,建立消息响应,在响应函数里弹出一个cmenu……等等。
我的代码是这样的:
// mainframe声明
class CMainFrame : public CFrameWnd
{
private:
CToolBar m_ToolBar;
CMenu m_AIMenu;
protected: // 仅从序列化创建
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)
// 属性
public:
// 操作
public:
void CreateToolBar();
// 重写
public:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
// 实现
public:
virtual ~CMainFrame();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected: // 控件条嵌入成员
CStatusBar m_wndStatusBar;
// 生成的消息映射函数
protected:
afx_msg void OnAIClicked();
afx_msg void OnCDClicked();
afx_msg void OnUpdateUI(CCmdUI *pCmdUI);
afx_msg void OnToolBarButtonDown(NMHDR* pnmh, LRESULT* plRes);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
DECLARE_MESSAGE_MAP()
};
// 消息映射
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
ON_UPDATE_COMMAND_UI( ID_BUTTON_AI, OnUpdateUI )
ON_UPDATE_COMMAND_UI( ID_BUTTON_CD, OnUpdateUI )
ON_COMMAND(ID_BUTTON_CD, OnCDClicked)
ON_COMMAND(ID_BUTTON_AI, OnAIClicked)
ON_NOTIFY(TBN_DROPDOWN, IDR_TOOLBAR, OnToolBarButtonDown)
END_MESSAGE_MAP()
// OnCreate
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndStatusBar.Create(this))
{
TRACE0("未能创建状态栏\n");
return -1; // 未能创建
}
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
this->CreateToolBar();
return 0;
}
// CreateToolBar
void CMainFrame::CreateToolBar()
{
this->m_ToolBar.Create(this);
this->m_ToolBar.LoadToolBar(IDR_TOOLBAR);
// make it possiable to let the tool bar contain drop-down menu
m_ToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
m_ToolBar.GetToolBarCtrl().SendMessage(TB_SETEXTENDEDSTYLE, 0, (LPARAM)TBSTYLE_EX_DRAWDDARROWS);
// set button ID_3D_VIEW_ZSTEST to be a drop-down-menu button
DWORD dwStyle= m_ToolBar.GetButtonStyle(m_ToolBar.CommandToIndex(ID_BUTTON_AI));
dwStyle |= TBSTYLE_DROPDOWN;
m_ToolBar.SetButtonStyle(m_ToolBar.CommandToIndex(ID_BUTTON_AI), dwStyle);
return;
}
void CMainFrame::OnUpdateUI(CCmdUI *pCmdUI)
{
pCmdUI->Enable(IDR_TOOLBAR);
m_ToolBar.GetToolBarCtrl().EnableButton(ID_BUTTON_AI,true);
m_ToolBar.GetToolBarCtrl().EnableButton(ID_BUTTON_CD,true);
return;
}
void CMainFrame::OnToolBarButtonDown(NMHDR* pnmh, LRESULT* plRes)
{
LPNMTOOLBAR pnmtb = reinterpret_cast<LPNMTOOLBAR>(pnmh);
CWnd *pWnd;
UINT nID;
::AfxMessageBox(_T("C3DFrameDlg::On3DFrameToolBarDropDown"),0);
switch (pnmtb->iItem)
{
case IDR_TOOLBAR:
pWnd = &m_ToolBar;
nID = IDR_MENU_AI;
break;
default:
return;
}
::AfxMessageBox(_T("after switch"),0);
CMenu TestMenu;
TestMenu.LoadMenu(nID);
CMenu* pPopup = TestMenu.GetSubMenu(0);
ASSERT( pPopup);
CRect rc;
pWnd->SendMessage(TB_GETRECT,pnmtb->iItem,(LPARAM)&rc);
pWnd->ClientToScreen(&rc);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
rc.left,rc.bottom,this,&rc);
return ;
}
void CMainFrame::OnCDClicked()
{
::AfxMessageBox(_T("CD"),0);
return ;
}
void CMainFrame::OnAIClicked()
{
::AfxMessageBox(_T("AI"),0);
return ;
}
基本上是网上照搬的了,可是为什么我做出来的按钮那个黑色的向下箭头点不动呢???那个黑色的箭头一直处于普通按钮鼠标放上去才会成为的那种状态,高亮。求拯救啊,折腾3天了……我发誓我回家肯定好好看书啊!!!
而且创建toolbar的地方那句sendmessage是要闹哪样啊???