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
...}
編譯、鏈接後,運行時在狀態條中就出現選定的位圖。