现在的位置: 首页 > 综合 > 正文

[VC]基于对话框程序,自定义工具栏(支持真彩色图标,可添加文字)

2012年12月18日 ⁄ 综合 ⁄ 共 5129字 ⁄ 字号 评论关闭

动机:传统的VC工具栏只支持16色的图标,且不能添加文字。

要点:CToolBarCtrl类的使用。先引用MSDN上的话(翻译水平比较菜,见谅!)

            使用CToolBarCtrl类,一般遵从以下几个步骤:
           1.构造一个CToolBarCtrl对象。
            2.调用Create函数创建Windows工具条通用控件并与CToolBarCtrl对象相关联。
           3.确定工具条上的按钮如何显示:
               (1)使用位图图像。调用AddBitmap向工具条添加按钮位图
              (2)使用图像列表里面显示的图像。调用SetImageList函数、SetHotImageList函数、SetDisabledImageList函数指定图像列表
              (3)作用字符串标签。调用AddString和(或)AddStrings函数为工具栏添加字符串
           4.调用AddButtons函数为工具条添加按钮结构
           5.如果需要为不是CFrameWnd的拥有窗口添加工具提示,需要在工具条拥有窗口中传递TTN_NEEDTEXT消息,该消息在CToolBarCtrl: Handling Tool Tip Notifications中有所描述。

步骤:1.将要作为工具栏图标的位图或图标导入到VC资源管理器中。

            2.在C***Dlg类为添加两个成员变量:CImageList m_ImageList,CToolBarCtrl m_ToolBar

           3.在OnInitDialog()函数中添加如下代码:

/***************************************创建工具栏********************************************/
CBitmap bm;
UINT Resource[3]={IDB_BITMAP1,IDB_BITMAP2,IDB_BITMAP3};          //位图ID数组
int i;

m_ImageList.Create(32,32,ILC_COLOR24|ILC_MASK,0,0);                  //创建Image List
m_ToolBar.Create(TBSTYLE_FLAT | CCS_TOP | WS_CHILD | WS_VISIBLE | WS_BORDER | CCS_ADJUSTABLE,CRect(0,0,0,0),this,IDR_TOOLBAR);                    //创建Toolbar Control
m_ToolBar.SetBitmapSize(CSize(32,32));

for(i=0;i<3;i++)
{
   bm.LoadBitmap(Resource[i]);
   m_ImageList.Add(&bm,(CBitmap *)NULL);
   bm.Detach();
}

m_ToolBar.SetImageList(&m_ImageList);

TBBUTTON Buttons[3];                                                      //定义TBBUTTON结构体数组
CString str;

for(i=0;i<3;i++)
{
   str.LoadString(IDS_FILE+i);                                                //IDS_FILE是在String Table中添加的String
   Buttons[i].iString=m_ToolBar.AddStrings(str);
   Buttons[i].dwData=0;
   Buttons[i].fsState=TBSTATE_ENABLED;
   Buttons[i].fsStyle=TBSTYLE_BUTTON;
   Buttons[i].iBitmap=i;
   Buttons[i].idCommand=IDS_FILE+i;                                   //按钮命令响应
}
m_ToolBar.AddButtons(3,Buttons);
m_ToolBar.AutoSize();

m_ToolBar.ShowWindow(SW_SHOW);
/***************************************创建工具栏********************************************/

             3.最终效果如图:效果图

 

注解:TBBUTTON是定义工具条按钮的结构体,声明如下:

typedef struct _TBBUTTON {
int iBitmap;// zero-based index of button image
int idCommand;  // command to be sent when button pressed
BYTE fsState;     // button state--see below
BYTE fsStyle;     // button style--see below
DWORD dwData;     // application-defined value
int iString;// zero-based index of button label string
} TBBUTTON;
调用AddButtons函数向工具栏添加按钮。函数原型如下:

BOOL AddButtons( int nNumButtons, LPTBBUTTON lpButtons );

 

其中nNumButtons是要添加的按钮数目,lpButtons是指向TBBUTTON结构体的指针。

 

转自:http://hi.baidu.com/ewook/blog/item/933ecf3d529496c09f3d62fe.html

 

顺着楼上的思路写了下,效果还不错,不过还有点不完美就是工具栏缺少提示,一般工具栏当鼠标指针指向工具栏的时候都会

有个详细的提示的,于是又搜了下,还真找到了,那就是:

 

方法1

1.           创建的TBSTYLE_TOOLTIPS类型CToolBarCtrl

2.           添加消息映射

BEGIN_MESSAGE_MAP(CCurveGraphDlg, CDialog)

       //{{AFX_MSG_MAP(CCurveGraphDlg)

       //}}AFX_MSG_MAP

       ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT,   0,   0xffff,   OnToolTipText)  

END_MESSAGE_MAP()

3.           添加消息响应函数

afx_msg BOOL   OnToolTipText(UINT,   NMHDR*   pNMHDR,   LRESULT*   pResult);

4.           函数代码如下:

BOOL CXXX::OnToolTipText(UINT,NMHDR* pNMHDR,LRESULT*   pResult)  

{  

  ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW);  

   

  //   UNICODE消息  

  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为工具条的HWND                 

         nID = ::GetDlgCtrlID((HWND)nID);  

  }  

   

  if(nID != 0)   //不为分隔符  

  {  

         //AfxLoadString(nID,   szFullText);  

         //strTipText=szFullText;  

         strTipText.LoadString(nID);  

         strTipText = strTipText.Mid(strTipText.Find('/n',0)+1);  

        

#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;    

         //使工具条提示窗口在最上面  

         ::SetWindowPos(pNMHDR->hwndFrom,HWND_TOP,0,0,0,0,

                SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER);    

         return   TRUE;  

  }  

    return   TRUE;  

}  

 

方法2

1.        重载OnNotify虚函数

代码如下:

BOOL CXXXDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)

{

       // TODO: Add your specialized code here and/or call the base class

       TOOLTIPTEXT*  ptt;

       ptt = (TOOLTIPTEXT*)lParam;

 

       CString Tip;

       switch(ptt->hdr.code)

       {

       case TTN_NEEDTEXT:

              switch(ptt->hdr.idFrom)

              {

              case ID_CURVE_OPEN:// ID_CURVE_OPEN为按钮ID

                     Tip.LoadString(ID_CURVE_OPEN);

                     break;

              }

        strcpy(ptt->szText,Tip);

        break;

       }

 

       return CDialog::OnNotify(wParam, lParam, pResult);

}

出自:http://blog.csdn.net/zmaojun/archive/2009/03/20/4006637.aspx

将楼上二位的方法一结合就比较完美了,请看下面的效果图:

CToolBarCtrl效果图

CToolBarCtrl提示

抱歉!评论已关闭.