ITPub博客

首页 > 应用开发 > IT综合 > 在状态栏中加入BitMap (转)

在状态栏中加入BitMap (转)

原创 IT综合 作者:worldblog 时间:2007-12-02 15:18:37 0 删除 编辑
在状态栏中加入BitMap (转)[@more@]
  1. 在一个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,
};

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

//Mainfrm.h

//CStatusBar m_wndStatusBar;
CBitmapStatusBar m_wndStatusBar;

  1. 在新类的.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

  1. 在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 barn");
  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
...}


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-987406/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    6241
  • 访问量
    2410920