65.9K
CodeProject 正在变化。 阅读更多。
Home

向工具栏按钮添加下拉箭头

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.69/5 (19投票s)

1999年12月16日

viewsIcon

668553

downloadIcon

2241

演示如何使用新的工具栏样式向工具栏按钮添加下拉箭头。

  • 下载演示项目 - 28 Kb
  • Sample Image - toolbar_droparrow.gif

    如果你想添加像 Internet Explorer 中看到的下拉菜单,这很简单。这种方法适用于 Visual C++ 5 和 6,但是你可能需要了解 VC 6.0 中工具栏类别的增强功能。

    首先,在 CMainFrame::OnCreate() 中创建工具栏后,你需要调用以下内容

    DWORD dwExStyle = TBSTYLE_EX_DRAWDDARROWS;
    m_wndToolBar.GetToolBarCtrl().SendMessage(TB_SETEXTENDEDSTYLE, 0, (LPARAM)dwExStyle);
    

    这将启用你的工具栏以处理下拉箭头。接下来你需要做的是,实际将下拉箭头添加到你想要的按钮上。这将通过 SetButtonStyle() 方法完成

    DWORD dwStyle = m_wndToolBar.GetButtonStyle(m_wndToolBar.CommandToIndex(ID_FILE_OPEN));
    dwStyle |= TBSTYLE_DROPDOWN;
    m_wndToolBar.SetButtonStyle(m_wndToolBar.CommandToIndex(ID_FILE_OPEN), dwStyle);
    

    现在,你需要为下拉箭头添加一个消息处理程序,以及一个菜单到应用程序资源中。假设你已经知道如何创建菜单(如果不知道,点击资源选项卡,选择资源名称,例如:MyApp Resources,然后右键单击。选择插入,然后选择菜单,然后按“新建”按钮),并且假设我们的菜单的资源 ID 是 IDR_MENU1,将以下代码添加到 CMainFrame 的消息映射中

    BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
    	//{{AFX_MSG_MAP(CMainFrame)
    	...
    	ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnToolbarDropDown)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    

    将以下方法添加到 CMainFrame 的 .cpp 文件中

    void CMainFrame::OnToolbarDropDown(NMTOOLBAR* pnmtb, LRESULT *plr)
    {
    	CWnd *pWnd;
    	UINT nID;
    
    	// Switch on button command id's.
    	switch (pnmtb->iItem)
    	{
    	case ID_FILE_OPEN:
    		pWnd = &m_wndToolBar;
    		nID  = IDR_MENU1;
    		break;
    	default:
    		return;
    	}
    	
    	// load and display popup menu
    	CMenu menu;
    	menu.LoadMenu(nID);
    	CMenu* pPopup = menu.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);
    }
    

    然后在 CMainFrame 的 .h 文件中添加以下内容

    	//{{AFX_MSG(CMainFrame)
    	...
    	afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);
    	//}}AFX_MSG
    
    © . All rights reserved.