HarmonyHu 多思不如养志,多言不如守静,多才不如蓄德

MFC 自定义简单的工具栏类

2009-04-28

本文最初是2009-04-28发表于CSDN,当时正在用MFC乐此不疲地写各种Windows的小应用。如今出来工作很多年了,几乎很少用到MFC的东西,而且在移动互联网时代的到来,MFC也跟着落伍了。再来回看当时做的事情,真是微不足道,人果真要把时间花在那些亘久不变的事物上。

本以为很简单的东西,居然 查了半天资料,才勉强完成这个工具栏类,也懒得去再优化.为了方便以后查阅,就写在博客里吧.

//CToolBarCtrlEx.h  
#pragma once  
class CToolBarCtrlEx : public CToolBarCtrl{  
public:    
    CToolTipCtrl m_Tip;  
    CImageList m_ImageList;  
  
public:  
    void CToolBarCtrlEx::CreateEx(
            CWnd *pParentWnd,
            int numButton,
            UINT *res,  //res表示bitmap资源序列
            UINT *str,  //str表示字符串资源序列,以它作为各个按钮的ID
            CSize size=CSize(32,32), //size表bitmap图像大小
            int pixel=ILC_COLOR24    //pixel表示bitmap图像像素,如ILC_COLOR24  
    );
};  

#include "stdafx.h"  
#include"CToolBarCtrlEx.h"  
  
void CToolBarCtrlEx::CreateEx(
        CWnd *pParentWnd,
        int numButton, 
        UINT *res, 
        UINT *str,
        CSize size,
        int pixel
        )  
{  
    //初始化ImageList  
    CBitmap bm;  
    m_ImageList.Create(size.cx,size.cy,pixel|ILC_MASK,0,0);  
    for(int i=0;i<numButton;i++){          
        bm.LoadBitmap(res[i]);  
        m_ImageList.Add(&bm,(CBitmap *)NULL);  
        bm.Detach();  
    }  
    //设置工具条  
    Create(TBSTYLE_FLAT |CCS_TOP| WS_CHILD | WS_VISIBLE|WS_BORDER | CCS_ADJUSTABLE|CBRS_TOOLTIPS,
           CRect(0,0,0,0),
           pParentWnd,
           NULL
           );  
    SetBitmapSize(size);  
    m_Tip.Create(pParentWnd);  
    TBBUTTON * Buttons=new TBBUTTON[numButton];  
    CRect toolRect;  
    CString temp;  
    for(int i=0;i<numButton;i++){  
        Buttons[i].iString=AddStrings("");  
        Buttons[i].dwData=0;  
        Buttons[i].fsState=TBSTATE_ENABLED ;  
        Buttons[i].fsStyle=TBSTYLE_BUTTON;  
        Buttons[i].iBitmap=i;  
        Buttons[i].idCommand=str[i];  
    }  
    SetImageList(&m_ImageList);  
    AddButtons(numButton,Buttons);  
    delete [] Buttons;  
  
    //位置摆放  
    GetWindowRect(&toolRect);  
    //改变主窗口大小  
    CRect parentRect;  
    pParentWnd->GetWindowRect(&parentRect);  
    parentRect.bottom+=toolRect.Height()+30;  
    pParentWnd->MoveWindow(&parentRect,FALSE);  
  
    //改变子窗口位置  
    CWnd * pwndChild=pParentWnd->GetWindow(GW_CHILD);  
    CRect rcChild;  
    while(pwndChild){  
        if(pwndChild!=this){
            pwndChild->GetWindowRect(&rcChild);  
            pParentWnd->ScreenToClient(rcChild);    
            rcChild.top+=toolRect.Height()+30;  
            rcChild.bottom+=toolRect.Height()+30;  
            pwndChild->MoveWindow(&rcChild,FALSE);  
        }
        pwndChild=pwndChild->GetNextWindow();  
    }  
  
    for(int i=0;i<numButton;i++){  
        temp.LoadString(str[i]);  
        GetItemRect(i,&toolRect);  
        m_Tip.AddTool(this,temp,&toolRect,res[i]);  
    }  
    SetToolTips(&m_Tip);  
    AutoSize();  
    ShowWindow(SW_SHOW);  
} 

Similar Posts

Content