如何在状态条中(CStatusbar Pane)加入Bitmap图 |
来自未知 作者佚名 |
以下的代码将演示如何在状态条的第一个方块中显示Bitmap图。Visual C++ 4.0 以后的MFC的CStatusBar使用状态窗口通用控制,所以代码与早期版本有所不同。 在一个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, }; 从CStatusBar派生一个新类(例如CBitmapStatusBar),并且用这个新类取代CMainFrame 中的CStatusBar(Mainfrm.h) //Mainfrm.h //CStatusBar m_wndStatusBar; CBitmapStatusBar m_wndStatusBar; 在新类的.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 在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 bar\n"); 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 ...} |
正文
如何在状态条中(CStatusbar Pane)加入Bitmap图2006-09-24 12:55:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/embed/18750.html
阅读(318) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论