如何在应用程序状态条中加入Bitmap位图

翻译|其它|编辑:郝浩|2006-07-31 13:53:00.000|阅读 1622 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>


摘要 MFC应用程序中的状态条可以很方便的显示应用程序的状态,有时需要用Bitmap位图显示程序状态,但是MFC的CStatusBar类只直接支持显示文本,并不支持图形。本文以实例说明了如何在状态条中加入Bitmap位图。本文内容适用于Microsoft Visual C++ 1.0/2.0/2.1/2.2/4.0/4.1所包含的Microsoft Foundation Classes(MFC)

  以下将详细说明如何在状态条的第一个方块中显示Bitmap位图。

  1. 首先在图形编辑器中生成一个位图,或从外部文件中加载一个位图资源到应用程序中,并标识其为IDB_BITMAP1。

  2. 在状态条中加入一个新的方块。

  在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,

  };

  3. 从CstatuBar派生一个新类CbitmapStatusBar,并且用这个新类取代CmainFrame中的CstatuBar

  //Mainfrm.h

  //CstatusBar m_wndStatusBar;


  CbitmapStatusBar m_wndStatuBar;

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

  //BitmapStatusBar.h

  class CMyStatusBar:public CStatusBar {...

     #if_MFC_VER 〈0x400

      virtual void DoPaint(CDC*pDC);

    #else

     virtual void DrawItem(LPDRAWITEMSTRUCT 1pDrawItemStruct);

    #endif

  ...}

  //BitmapStatusBar.cpp

  #if_MFC_VER〈0x400

  void CBitampStatusBar::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 1pDrawItemStruct)

  {

     switch(1pDrawItemStruct-〉itemID)

      {

         case 1:

         //从资源中选择位图

         CBitmap pBitmap;

         //加载位图,使用Import从文件加载资源,可以不受调色板限制

        pBitmap.LoadBitmap(IDB_BITMAP1);

        //将状态条(StatusBar)附加到一个CDC对象

        CDC dc,SourceDC;

        dc.Attach(1pDrawItemStruct-〉hDC);

        //得到pane的大小和坐标


        CRect rect(&1pDrawItemStruct-〉rcItem);

        //将当前位图放入兼容CDC


        SourceDC.CreateCompatibleDC(NULL);//生成兼容的CDC

        CBitmap*pOldBitmap=SourceDC.SelectObject(&pBitmap);//选择位图

        dc.BitBlt(rect].left,rect.Width(),rect.Height(),

        &SourceDC,0,0,SRCCOPY);//BitBlt

        SourceDC.SelectObject(pOldBitmap);//删除CDC中所选择的位图

        pBitmap.DeleteObject();//删除位图

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

       dc.Detach();

       return;

     }

  CStatusBar::DrawItem(1pDrawItemStruct);

  }

  #endif

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

  //Mainfrm.cpp

  int CMainFrame::OnCreate(LPCREATESTRUCT 1pCreateStruct)

  {...

  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

  ...}

  编译、链接后,运行时在状态条中就出现选定的位图。
 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP