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.cppstatic UINT indicators[]={ID_SEPARATOR,//status line indicatorID_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.hclass CMyStatusBar:public CStatusBar {...#if_MFC_VER $#@60;0x400virtual void DoPaint(CDC*pDC);#elsevirtual void DrawItem(LPDRAWITEMSTRUCT 1pDrawItemStruct);#endif...}//BitmapStatusBar.cpp#if_MFC_VER$#@60;0x400void 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);//将当前位图放入兼容CDCCDC SourceDC;SourceDC.CreateCompatibleDC(NULL);//生成兼容的CDCCBitmap*pOldBitmap=SourceDC.SelectObject(&pBitmap);//选择位图pDC-$#@62;BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&SourceDC,0,0,SRCCOPY);//BitBltSourceDC.SelectObject(pOldBitmap);//删除CDC中所选择的位图pBitmap.DeleteObject();//删除位图}#elsevoid 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);//将当前位图放入兼容CDCSourceDC.CreateCompatibleDC(NULL);//生成兼容的CDCCBitmap*pOldBitmap=SourceDC.SelectObject(&pBitmap);//选择位图dc.BitBlt(rect].left,rect.Width(),rect.Height(),&SourceDC,0,0,SRCCOPY);//BitBltSourceDC.SelectObject(pOldBitmap);//删除CDC中所选择的位图pBitmap.DeleteObject();//删除位图//将状态条(StatusBar)与CDC对象分离,否则hDC将会在CDC废弃时被删除dc.Detach();return;}CStatusBar::DrawItem(1pDrawItemStruct);}#endif5. 在Mainfrm.cpp的CMainFrame::OnCreate()函数中加入下面的代码//Mainfrm.cppint 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$#@62;=0x400UINT nID,nStyle;int cxWidth;m_wndStatusBar.GetPaneInfo(1,nID,nStyle,cxWidth);m_wndStatusBar.SetPaneInfo(1,nID,nStyle|SBT_OWNERDRAW,cxWidth);#endif...} 编译、链接后,运行时在状态条中就出现选定的位图。作者:洪涛 张芝霞