为对话框设计美观的工具栏 (Add toolbar for CDialog)

作者:Wupei  |  发表时间:  |  所属分类:VC

本文介绍,在CDialog下工具栏的实现和优化

美化工具栏示例

1. 为CDialog添加工具栏

2. 使toolbar以多行显示

3. 为toolbar添加提示信息(TipText)

4. VC6下显示包含多彩色图片的工具栏

 

一. 为CDialog添加工具栏

首先需要建立相应的TOOLBAR资源

将工具栏按钮摆放好,将相应的提示信息(TipText)写入,最好也将相应事件先生成好

在OnInitDialog()函数内添加代码:

//工具条(其中CBRS_LEFT属性是为了工具栏多行显示而添加)
m_ToolBar.CreateEx(this, TBSTYLE_FLAT,  
	WS_CHILD|WS_VISIBLE|CBRS_SIZE_FIXED|CBRS_LEFT|CBRS_TOOLTIPS|CBRS_FLYBY,
	CRect(0,0,0,0));
m_ToolBar.LoadToolBar(IDR_TOOLBAR);	//获取资源
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

ps: 如果不要多行显示需要,更改相应的属性

 

二. 使CDialog多行显示

注意如果要工具栏多行显示,需要加入CBRS_LEFT属性

实现代码:

//其中TBBS_WRAPPED为换行属性
m_ToolBar.SetButtonInfo(0,ID_BUTTON_1,TBBS_BUTTON,0); 
m_ToolBar.SetButtonInfo(1,ID_BUTTON_2,TBBS_BUTTON|TBBS_WRAPPED,1); //换行

m_ToolBar.SetButtonInfo(2,ID_BUTTON_3,TBBS_BUTTON,2); 
m_ToolBar.SetButtonInfo(3,ID_BUTTON_4,TBBS_BUTTON|TBBS_WRAPPED,3); //换行

m_ToolBar.SetButtonInfo(4,ID_BUTTON_5,TBBS_BUTTON,4);
m_ToolBar.SetButtonInfo(5,ID_BUTTON_6,TBBS_BUTTON, 5);

 

三. 为toolbar添加提示信息(TipText)

添加事件声明和消息映射

//添加事件声明(最好写在AFX_MSG宏外,否则可能出现编译错误)
afx_msg BOOL OnToolTipText(UINT nID, NMHDR* pNMHDR, LRESULT* pResult);

//添加消息映射(最好写在AFX_MSG_MAP宏外,否则可能出现编译错误)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW,0,0xFFFF,OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA,0,0xFFFF,OnToolTipText)

添加事件实现

BOOL CToolBarDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
{
    ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);

    // if there is a top level routing frame then let it handle the message
    if (GetRoutingFrame() != NULL) return FALSE;

    // to be thorough we will need to handle UNICODE versions of the message also !!
    TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
    TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
    TCHAR szFullText[512];
    CString strTipText;
    UINT nID = pNMHDR->idFrom;

    if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) ||
        pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND))
    {
        // idFrom is actually the HWND of the tool 
        nID = ::GetDlgCtrlID((HWND)nID);
    }

    if (nID != 0) // will be zero on a separator
    {
        AfxLoadString(nID, szFullText);
        strTipText=szFullText;

#ifndef _UNICODE
        if (pNMHDR->code == TTN_NEEDTEXTA)
        {
            lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText));
        }
        else
        {
            _mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
        }
#else
        if (pNMHDR->code == TTN_NEEDTEXTA)
        {
            _wcstombsz(pTTTA->szText, strTipText,sizeof(pTTTA->szText));
        }
        else
        {
            lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText));
        }
#endif

        *pResult = 0;

        // bring the tooltip window above other popup windows
        ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0,
            SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);
        
        return TRUE;
    }

    return FALSE;
}

 

四. VC6下显示包含多彩色图片的工具栏

VC6下只支持256色的工具栏图片,要想使用多彩色工具栏图片,如下所示

1. 先将相应的bmp图片导入VC6中,形成图片资源文件

2. 添加代码

//相应成员变量
CImageList m_ilToolBar;
CBitmap bm;
//IDB_BITMAP为图片资源ID

///////////////////////////////////////
//实现代码
HBITMAP hbm = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
	MAKEINTRESOURCE(IDB_BITMAP),
	IMAGE_BITMAP, //按位图格式
	0,0, // cx,cy
	LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS );
bm.Attach(hbm);
m_ilToolBar.Create(20,20,ILC_COLOR24, 4, 4);
m_ilToolBar.Add(&bm,(CBitmap*)NULL);

//////////////////////////////////////
//将图片选入toolbar即可
m_ToolBar.GetToolBarCtrl().SetImageList(&m_ilToolBar);

 

完成,这样就在对话框上不错的效果的工具栏了,试试吧

Trackback from your site.

请在这里留言: