现在用代码动态创建了一个工具条,里面包含各种控件,如Progress,Edit等,现在我想给这个工具条加上一个背景,请问应该如何实现?

解决方案 »

  1.   

    />>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    // \ Avitoolbar.h (C) 2002.1.10 
    // \ 增强型工具栏类:
    // \ 1、添加按钮文字
    // \ 2、添加工具栏位图纹理
    // \ 3、重画工具栏把手
    // \ 4、添加视频播放
    //                                                 
    //                                                   
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    #ifndef _AVITOOLBAR_H__
    #define _AVITOOLBAR_H__/////////////////////////////////////////////////////////////////////////////
    // CAviToolbar windowclass CAviToolbar : public CToolBar
    {
    public:
    CAviToolbar();public:
    CReBar  m_wndReBar; //定义ReBar
    CAnimateCtrl avi; //定义多媒体动画
    COLORREF m_clrShadow; //定义颜色
    COLORREF m_clrNormal; //定义颜色
    COLORREF m_clrHilite; //定义颜色
    public:
    BOOL LoadBMPImage( LPCTSTR sBMPFile, CBitmap& bitmap, CPalette *pPal );
    void LoadBackImage ();
    void SetBackImage ();// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CAviToolbar)
    //}}AFX_VIRTUAL// Implementation
    public:
    CString m_bmpName;
    BOOL m_bBackgroundImage;
    void SetTooltext();
    virtual ~CAviToolbar();
    void DrawGripper(CDC & dc) const; // Generated message map functions
    protected:
    CBitmap m_bmpBack;
    protected:
    //{{AFX_MSG(CAviToolbar)
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnNcPaint();
    afx_msg void OnSetskin();
    afx_msg void OnSysColorChange();
    //}}AFX_MSG DECLARE_MESSAGE_MAP()
    };/////////////////////////////////////////////////////////////////////////////#endif // AviToolbar.cpp : implementation file
    //#include "stdafx.h"
    #include "DTASvm.h"
    #include "AviToolbar.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
      

  2.   

    /////////////////////////////////////////////////////////////////////////////
    // CAviToolbarCAviToolbar::CAviToolbar()
    {
    m_clrHilite = ::GetSysColor(COLOR_BTNHIGHLIGHT);//RGB(222,230,255);
    m_clrNormal = RGB(212,208,200);//::GetSysColor(COLOR_BTNFACE);
    m_clrShadow = ::GetSysColor(COLOR_MENUTEXT);//RGB(64,0,128);//
    m_bBackgroundImage=TRUE;
    m_bmpName="";
    }CAviToolbar::~CAviToolbar()
    {
    }
    BEGIN_MESSAGE_MAP(CAviToolbar, CToolBar)
    //{{AFX_MSG_MAP(CAviToolbar)
    ON_WM_CREATE()
    ON_WM_SIZE()
    ON_WM_NCPAINT()
    ON_COMMAND(IDM_SETSKIN, OnSetskin)
    ON_WM_SYSCOLORCHANGE()
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CAviToolbar message handlersint CAviToolbar::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CToolBar::OnCreate(lpCreateStruct) == -1)
    return -1;  //创建AVI并自动播放
    avi.Create(ACS_AUTOPLAY |WS_CHILD | WS_VISIBLE,CRect(0,0,0,0),this,ID_MYAVI);
    avi.Open(IDR_AVI1); //打开AVI                     
    avi.Play(0,-1,-1); //从第一帧开始循环播放

    return 0;
    }
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    // 重置工具栏大小 移动视频位置,使之紧靠工具栏右侧.void CAviToolbar::OnSize(UINT nType, int cx, int cy) 
    {
    CToolBar::OnSize(nType, cx, cy);

    //SetHeight(22); //设置工具栏高度
    CRect toolbarclient;
    GetClientRect(&toolbarclient); //得到工具栏坐标
    toolbarclient.left = toolbarclient.right-40;
    //toolbarclient.OffsetRect(1,0); //调整矩形位置
    avi.MoveWindow(toolbarclient.left,3,toolbarclient.right,45);  //移动AVI
    }
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    // 重画工具栏
    void CAviToolbar::OnNcPaint() 
    {
    CControlBar::EraseNonClient();
    CWindowDC dc(this);

    CRect pRect;
    CRect pOver;
    GetClientRect( &pRect );
    pOver = pRect;
    pOver.right = pOver.left + 3;
    pOver.OffsetRect(2,0); CBrush brFill(m_clrNormal);
    dc.FillRect(pOver,&brFill);
    InvalidateRect( &pRect, TRUE );
    DrawGripper(dc);
    // Do not call CToolBar::OnNcPaint() for painting messages
    }//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    // 给工具栏添加工具栏把手
    void CAviToolbar::DrawGripper(CDC & dc) const
    {
    CRect rcGripper;
    GetWindowRect(rcGripper);
    ScreenToClient(rcGripper);
    rcGripper.OffsetRect(-rcGripper.left, -rcGripper.top);


    // Gripper at left
    rcGripper.DeflateRect(3, 3);
    //rcGripper.left -= 0;
    rcGripper.top += 1;
    rcGripper.right = rcGripper.left;
    rcGripper.bottom -= 44; for(int i=1;i<=23;i++)
    {
    dc.Draw3dRect(rcGripper, m_clrHilite, m_clrShadow );

    rcGripper.OffsetRect(3, 0);
    dc.Draw3dRect(rcGripper, m_clrHilite, m_clrShadow);
    rcGripper.OffsetRect(-3, 2);
    }
    }void CAviToolbar::SetTooltext()
    {
    //+++++++++++++++++++++++++++设置工具栏文字++++++++++++++++++++++++++++++++++++++++++
    for(int i = 0; i < CToolBar::GetCount(); i++)
    {
    UINT id = CToolBar::GetItemID(i);
    CString s;
    if(!s.LoadString(id)) continue;
    int j = s.Find(_T('\n'));
    if(j < 0) continue;
    s = s.Right(s.GetLength() - j - 1);
    CToolBar::SetButtonText(i,s); 
    //CJToolBar::SetButtonDropDown(IDR_POPUP);
    }
    // Adjust sizes to include text
    CRect rect;
    CToolBar::GetItemRect(0,&rect);
    CToolBar::SetSizes(rect.Size(),CSize(32,31));
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    }BOOL CAviToolbar::LoadBMPImage( LPCTSTR sBMPFile, CBitmap& bitmap, CPalette *pPal )
    {
    CFile file;
    if( !file.Open( sBMPFile, CFile::modeRead) )
    return FALSE; BITMAPFILEHEADER bmfHeader; // Read file header
    if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
    return FALSE; // File type should be 'BM'
    if (bmfHeader.bfType != ((WORD) ('M' << 8) | 'B'))
    return FALSE; // Get length of the remainder of the file and allocate memory
    DWORD nPackedDIBLen = file.GetLength() - sizeof(BITMAPFILEHEADER);
    HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED, nPackedDIBLen);
    if (hDIB == 0)
    return FALSE; // Read the remainder of the bitmap file.
    if (file.ReadHuge((LPSTR)hDIB, nPackedDIBLen) != nPackedDIBLen )
    {
    ::GlobalFree(hDIB);
    return FALSE;
    }
    BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;
    BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ; // If bmiHeader.biClrUsed is zero we have to infer the number
    // of colors from the number of bits used to specify it.
    int nColors = bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 
    1 << bmiHeader.biBitCount; LPVOID lpDIBBits;
    if( bmInfo.bmiHeader.biBitCount > 8 )
    lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) + 
    ((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
    else
    lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors); // Create the logical palette
    if( pPal != NULL )
    {
    // Create the palette
    if( nColors <= 256 )
    {
    UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
    LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize]; pLP->palVersion = 0x300;
    pLP->palNumEntries = nColors; for( int i=0; i < nColors; i++)
    {
    pLP->palPalEntry[i].peRed = bmInfo.bmiColors[i].rgbRed;
    pLP->palPalEntry[i].peGreen = bmInfo.bmiColors[i].rgbGreen;
    pLP->palPalEntry[i].peBlue = bmInfo.bmiColors[i].rgbBlue;
    pLP->palPalEntry[i].peFlags = 0;
    } pPal->CreatePalette( pLP ); delete[] pLP;
    }
    } CClientDC dc(NULL);
    CPalette* pOldPalette = NULL;
    if( pPal )
    {
    pOldPalette = dc.SelectPalette( pPal, FALSE );
    dc.RealizePalette();
    } HBITMAP hBmp = CreateDIBitmap( dc.m_hDC, // handle to device context 
    &bmiHeader, // pointer to bitmap size and format data 
    CBM_INIT, // initialization flag 
    lpDIBBits, // pointer to initialization data 
    &bmInfo, // pointer to bitmap color-format data 
    DIB_RGB_COLORS); // color-data usage  bitmap.Detach();
    bitmap.Attach( hBmp ); if( pOldPalette )
    dc.SelectPalette( pOldPalette, FALSE ); ::GlobalFree(hDIB);
    return TRUE;
    }void CAviToolbar::SetBackImage ()
    {
    CReBarCtrl& rc = m_wndReBar.GetReBarCtrl (); for (UINT i = 0; i < rc.GetBandCount(); i++)
    {
    REBARBANDINFO info;
    memset (&info, 0, sizeof (REBARBANDINFO));
    info.cbSize = sizeof (info);
    info.fMask = RBBIM_BACKGROUND;
    info.hbmBack = m_bBackgroundImage ? (HBITMAP)m_bmpBack : NULL;
    rc.SetBandInfo (i, &info); CRect rectBand;
    rc.GetRect (i, rectBand); rc.InvalidateRect (rectBand);
    rc.UpdateWindow (); info.fMask = RBBIM_CHILD;
    rc.GetBandInfo (i, &info); if (info.hwndChild != NULL)
    {
    ::InvalidateRect (info.hwndChild, NULL, TRUE);
    ::UpdateWindow (info.hwndChild);
    }
    }
    }void CAviToolbar::LoadBackImage ()
    {
    if(m_bmpName.GetLength()>0)
    LoadBMPImage(m_bmpName,m_bmpBack,NULL);
    else
    LoadBMPImage("res\\back.bmp",m_bmpBack,NULL);
    }void CAviToolbar::OnSetskin() 
    {
    // TODO: Add your command handler code here}void CAviToolbar::OnSysColorChange() 
    {
    CToolBar::OnSysColorChange();

    LoadBackImage ();
    SetBackImage ();

    }
    漫漫看把!
      

  3.   

    To: lhua_1225(lh) 
    首先很感谢你的帮忙。
    有一些问题想向你请教:
    我现在动态创建了一个工具条。现在想加上背景。我大致看了一下你提供的原码。
    就我理解,用到的相关函数为:
    LoadBMPImage、SetBackImage、LoadBackImage。我现在创建了一个工具条类CMyBar,派生自CToolbar,并加上上述三个函数和相关的属性,
    然后生成一个对象m_wndPropBar并用Create函数创建。
    然后依次调用LoadBackImage()和SetBackImage(),但并没有实现加上背景。
    我跟踪了一下,发现在执行CReBarCtrl& rc = m_wndReBar.GetReBarCtrl()后
    用rc.GetBandCount()得到的返回值是0,我对CReBar没有任何概念,你能给解释一下吗?我的工具条有好几个部分组成:有Button、Progress、Static等,但没有SEPARATOR
    GetBandCount()得到的是什么,在MSDN中说是The number of bands assigned to the control. 这是什么意思。我的工具条现在可以正常显示。