您的位置:首页 > 其它

在状态栏中加入BitMap

2000-12-10 13:51 169 查看
在一个AppWizard应用的状态条中加入一个新的方块,在Mainfrm.cpp中加入下列语句

//Mainfrm.cpp

static UINT indicators[] =
{
    ID_SEPARATOR, // status line indicator
    ID_INDICATOR_BITMAP,    // BITMAP状态条
    ID_INDICATOR_CAPS,
    ID_INDICATOR_NUM,
    ID_INDICATOR_SCRL,
};

从CStatusBar派生一个新类(例如CBitmapStatusBar),并且用这个新类取代CMainFrame中的CStatusBar(Mainfrm.h)

//Mainfrm.h

//CStatusBar m_wndStatusBar;
CBitmapStatusBar m_wndStatusBar;

在新类的.h和.cpp中加入下面两个函数的声明和定义

//BitmapStatusBar.h

class CMyStatusBar : public CStatusBar {...
    #if _MFC_VER < 0x400
        virtual void DoPaint(CDC* pDC);
    #else
        virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
    #endif
     ...}

//BitmapStatusBar.cpp

#if _MFC_VER < 0x400
    void CBitmapStatusBar::DoPaint(CDC* pDC)
    {
        CRect rect;
        GetItemRect(1, &rect); //得到pane的大小
        pDC->ExcludeClipRect(&rect); //创建新的裁剪区域
        CStatusBar::DoPaint(pDC); //描绘状态条(status bar)的其余部分

        CRgn paneRgn;
        paneRgn.CreateRectRgnIndirect(rect);
        pDC->SelectClipRgn(&paneRgn); //选择裁剪区域

        CBitmap pBitmap;
        //加载位图,使用Import从文件加载资源,可以不受调色板限制
        pBitmap.LoadBitmap(IDB_BITMAP1);

        //将当前位图放入兼容CDC
        CDC SourceDC;
        SourceDC.CreateCompatibleDC(NULL);//生成兼容的CDC
        CBitmap* pOldBitmap = SourceDC.SelectObject(&pBitmap);//选择位图
        pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
                   &SourceDC, 0, 0, SRCCOPY);//BitBlt
        SourceDC.SelectObject(pOldBitmap);//删除CDC中所选择的位图
        pBitmap.DeleteObject();//删除位图
    }
#else
    void CBitmapStatusBar::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
        switch(lpDrawItemStruct->itemID)
        {
        case 1:
            //从资源中选择位图
            CBitmap pBitmap;
            //加载位图,使用Import从文件加载资源,可以不受调色板限制
            pBitmap.LoadBitmap(IDB_BITMAP1);

            //将状态条(StatusBar)附加到一个CDC对象
            CDC dc,SourceDC;
            dc.Attach(lpDrawItemStruct->hDC);

            //得到pane的大小和坐标
            CRect rect(&lpDrawItemStruct->rcItem);

            //将当前位图放入兼容CDC
            SourceDC.CreateCompatibleDC(NULL);//生成兼容的CDC
            CBitmap* pOldBitmap = SourceDC.SelectObject(&pBitmap);//选择位图
            dc.BitBlt(rect].left, rect.top, rect.Width(), rect.Height(),
                     &SourceDC, 0, 0, SRCCOPY);//BitBlt
            SourceDC.SelectObject(pOldBitmap);//删除CDC中所选择的位图
            pBitmap.DeleteObject();//删除位图

            //将状态条(StatusBar)与CDC对象分离,否则hDC将会在CDC废弃时被删除
            dc.Detach();

            return;
        }
        CStatusBar::DrawItem(lpDrawItemStruct);
    }
#endif

在Mainfrm.cpp的CMainFrame::OnCreate()中加入下面的代码

//Mainfrm.cpp

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){...
    if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))){
    TRACE0("Failed to create status bar/n");
    return -1;      // fail to create
    }
   //加入下列代码
   #if _MFC_VER >= 0x400
      UINT nID, nStyle;
      int cxWidth;

      m_wndStatusBar.GetPaneInfo(1, nID, nStyle, cxWidth);
      m_wndStatusBar.SetPaneInfo(1, nID, nStyle | SBT_OWNERDRAW, cxWidth);
   #endif
...}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc import null class