📄 如何在状态条中(cstatusbar .htm
字号:
<html><body background="di2001.jpg"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>如何在状态条中</title><meta name="GENERATOR" content="Microsoft FrontPage 3.0"></head><body><p><strong>如何在状态条中(CStatusbar Pane)加入Bitmap图</strong></p><p><font color="#000000">以下的代码将演示如何在状态条的第一个方块中显示Bitmap图。Visual C++ 4.0以后的MFC的CStatusBar使用状态窗口通用控制,所以代码与早期版本有所不同。</font><ol> <li><font color="#000000">在一个AppWizard应用的状态条中加入一个新的方块,在Mainfrm.cpp中加入下列语句</font></li></ol><blockquote> <p><font color="#000080" size="2">//Mainfrm.cpp</font></p> <p><font color="#000080" size="2">static UINT indicators[] =<br> {<br> ID_SEPARATOR, // status line indicator<br> ID_INDICATOR_BITMAP, // BITMAP状态条<br> ID_INDICATOR_CAPS,<br> ID_INDICATOR_NUM,<br> ID_INDICATOR_SCRL,<br> };</font></p></blockquote><ol start="2"> <li><font color="#000000" size="3">从CStatusBar派生一个新类(例如CBitmapStatusBar),并且用这个新类取代CMainFrame中的CStatusBar(Mainfrm.h)</font></li></ol><blockquote> <p><font color="#000080" size="2">//Mainfrm.h</font></p> <p><font color="#000080" size="2">//CStatusBar m_wndStatusBar;<br> CBitmapStatusBar m_wndStatusBar;</font></p></blockquote><ol start="3"> <li><font color="#000000">在新类的.h和.cpp中加入下面两个函数的声明和定义</font></li></ol><blockquote> <p><font color="#000080" size="2">//BitmapStatusBar.h</font></p> <p><font color="#000080" size="2">class CMyStatusBar : public CStatusBar {...<br> #if _MFC_VER < 0x400<br> virtual void DoPaint(CDC* pDC);<br> #else<br> virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);<br> #endif<br> ...} </font></p></blockquote><blockquote> <p><font color="#000080" size="2">//BitmapStatusBar.cpp</font></p></blockquote><blockquote> <p><font color="#000080" size="2">#if _MFC_VER < 0x400 <br> void CBitmapStatusBar::DoPaint(CDC* pDC)<br> {<br> CRect rect;<br> GetItemRect(1, &rect); //得到pane的大小<br> pDC->ExcludeClipRect(&rect); //创建新的裁剪区域<br> CStatusBar::DoPaint(pDC); //描绘状态条(status bar)的其余部分<br> <br> CRgn paneRgn;<br> paneRgn.CreateRectRgnIndirect(rect);<br> pDC->SelectClipRgn(&paneRgn); //选择裁剪区域<br> <br> CBitmap pBitmap;<br> //加载位图,使用Import从文件加载资源,可以不受调色板限制<br> pBitmap.LoadBitmap(IDB_BITMAP1);<br> <br> //将当前位图放入兼容CDC<br> CDC SourceDC;<br> SourceDC.CreateCompatibleDC(NULL);//生成兼容的CDC<br> CBitmap* pOldBitmap = SourceDC.SelectObject(&pBitmap);//选择位图<br> pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),<br> &SourceDC, 0, 0, SRCCOPY);//BitBlt<br> SourceDC.SelectObject(pOldBitmap);//删除CDC中所选择的位图<br> pBitmap.DeleteObject();//删除位图<br> }<br> #else<br> void CBitmapStatusBar::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)<br> {<br> switch(lpDrawItemStruct->itemID)<br> {<br> case 1:<br> //从资源中选择位图<br> CBitmap pBitmap;<br> //加载位图,使用Import从文件加载资源,可以不受调色板限制<br> pBitmap.LoadBitmap(IDB_BITMAP1);<br> <br> //将状态条(StatusBar)附加到一个CDC对象<br> CDC dc,SourceDC;<br> dc.Attach(lpDrawItemStruct->hDC);<br> <br> //得到pane的大小和坐标<br> CRect rect(&lpDrawItemStruct->rcItem);<br> <br> //将当前位图放入兼容CDC<br> SourceDC.CreateCompatibleDC(NULL);//生成兼容的CDC<br> CBitmap* pOldBitmap = SourceDC.SelectObject(&pBitmap);//选择位图<br> dc.BitBlt(rect<a name="4">]</a>.left, rect.top, rect.Width(), rect.Height(),<br> &SourceDC, 0, 0, SRCCOPY);//BitBlt<br> SourceDC.SelectObject(pOldBitmap);//删除CDC中所选择的位图<br> pBitmap.DeleteObject();//删除位图<br> <br> //将状态条(StatusBar)与CDC对象分离,否则hDC将会在CDC废弃时被删除<br> dc.Detach();<br> <br> return;<br> }<br> CStatusBar::DrawItem(lpDrawItemStruct);<br> }<br> #endif</font></p></blockquote><ol> <li value="4"><font color="#000000">在Mainfrm.cpp</font><font color="#000000" size="2">的</font><font color="#000000" size="3">CMainFrame::OnCreate()</font><font color="#000000">中加入下面的代码</font></li></ol><blockquote> <p><font color="#000080" size="2">//Mainfrm.cpp</font></p> <p><font color="#000080" size="2">int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){...<br> if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))){<br> TRACE0("Failed to create status bar\n");<br> return -1; // fail to create<br> }<br> //加入下列代码<br> #if _MFC_VER >= 0x400<br> UINT nID, nStyle;<br> int cxWidth;<br> <br> m_wndStatusBar.GetPaneInfo(1, nID, nStyle, cxWidth);<br> m_wndStatusBar.SetPaneInfo(1, nID, nStyle | SBT_OWNERDRAW, cxWidth);<br> #endif<br> ...}</font></p></blockquote></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -