程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 如何在應用程序狀態條中加入Bitmap位圖

如何在應用程序狀態條中加入Bitmap位圖

編輯:vc教程

  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 $#@60;0x400

virtual void DoPaint(CDC*pDC);

#else

virtual void DrawItem(LPDRAWITEMSTRUCT 1pDrawItemStruct);

#endif

...}

//BitmapStatusBar.cpp

#if_MFC_VER$#@60;0x400

void CBitampStatusBar::DoPaint(CDC*pDC)

{

CRect rect;

GetItemRect(1,&rect);//得到pane的大小

pDC-$#@62;ExcludeClipRect(&rect);//創建新的裁剪區域

CStatusBar::DoPaint(pDC);//描繪狀態條(status bar)的其余部分

CRgn paneRgn;

paneRgn.CreateRectRgnIndirect(rect);

pDC-$#@62;SelectClipRgn(&paneRgn);//選擇裁剪區域

CBitmap pBitmap;

//加載位圖,使用Import從文件加載資源,可以不受調色板限制

pBitmap.LoadBi p(IDB_BITMAP1);

//將當前位圖放入兼容CDC

CDC SourceDC;

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

CBitmap*pOldBitmap=SourceDC.SelectObject(&pBitmap);//選擇位圖

pDC-$#@62;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-$#@62;itemID)

{

case 1:

//從資源中選擇位圖

CBitmap pBitmap;

//加載位圖,使用Import從文件加載資源,可以不受調色板限制

pBitmap.LoadBitmap(IDB_BITMAP1);

//將狀態條(StatusBar)附加到一個CDC對象

CDC dc,SourceDC;

dc.Attach(1pDrawItemStruct-$#@62;hDC);

//得到pane的大小和坐標

CRect rect(&1pDrawItemStruct-$#@62;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 ”);

return-1;//fail to create

}

//加入下列代碼

#if_MFC_VER$#@62;=0x400

UINT nID,nStyle;

int cxWidth;

m_wndStatusBar.GetPaneInfo(1,nID,nStyle,cxWidth);

m_wndStatusBar.SetPaneInfo(1,nID,nStyle|SBT_OWNERDRAW,cxWidth);

#endif

...}

  編譯、鏈接後,運行時在狀態條中就出現選定的位圖。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved