在状态栏中加入BitMap

    技术2022-05-11  129

    在一个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.cppCMainFrame::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...}


    最新回复(0)