在狀態列中加入BitMap (轉)

worldblog發表於2007-12-02
在狀態列中加入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. 從CStatar派生一個新類(例如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->ClipRgn(&paneRgn); //選擇裁剪區域

  CBitmap pBitmap;
  //載入點陣圖,使用Import從載入資源,可以不受調色盤限制
  pBitmap.Loaitmap(IDB_BITMAP1);

  //將當前點陣圖放入相容CDC
  CDC DC;
  SourceDC.CreateCompatibleDC(NULL);//生成相容的CDC
  CBitmap* pOldBitmap = SourceDC.Select(&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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章