⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 如何在状态条中(cstatusbar .htm

📁 VC的一些技巧性文档
💻 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>  &nbsp;&nbsp;&nbsp; ID_SEPARATOR, // status line indicator<br>  &nbsp;&nbsp;&nbsp; ID_INDICATOR_BITMAP,&nbsp;&nbsp;&nbsp; // BITMAP状态条<br>  &nbsp;&nbsp;&nbsp; ID_INDICATOR_CAPS,<br>  &nbsp;&nbsp;&nbsp; ID_INDICATOR_NUM,<br>  &nbsp;&nbsp;&nbsp; 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>  &nbsp;&nbsp;&nbsp; #if _MFC_VER &lt; 0x400<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; virtual void DoPaint(CDC* pDC);<br>  &nbsp;&nbsp;&nbsp; #else<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; virtual void DrawItem(LPDRAWITEMSTRUCT   lpDrawItemStruct);<br>  &nbsp;&nbsp;&nbsp; #endif<br>  &nbsp;&nbsp;&nbsp;&nbsp; ...} </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 &lt; 0x400 <br>  &nbsp;&nbsp;&nbsp; void CBitmapStatusBar::DoPaint(CDC* pDC)<br>  &nbsp;&nbsp;&nbsp; {<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRect rect;<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetItemRect(1, &amp;rect); //得到pane的大小<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDC-&gt;ExcludeClipRect(&amp;rect); //创建新的裁剪区域<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CStatusBar::DoPaint(pDC); //描绘状态条(status   bar)的其余部分<br>  <br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRgn paneRgn;<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; paneRgn.CreateRectRgnIndirect(rect);<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDC-&gt;SelectClipRgn(&amp;paneRgn); //选择裁剪区域<br>  <br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CBitmap pBitmap;<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //加载位图,使用Import从文件加载资源,可以不受调色板限制<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pBitmap.LoadBitmap(IDB_BITMAP1);<br>  <br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将当前位图放入兼容CDC<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CDC SourceDC;<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SourceDC.CreateCompatibleDC(NULL);//生成兼容的CDC<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CBitmap* pOldBitmap =   SourceDC.SelectObject(&amp;pBitmap);//选择位图<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDC-&gt;BitBlt(rect.left, rect.top,   rect.Width(), rect.Height(),<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   &amp;SourceDC, 0, 0, SRCCOPY);//BitBlt<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SourceDC.SelectObject(pOldBitmap);//删除CDC中所选择的位图<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pBitmap.DeleteObject();//删除位图<br>  &nbsp;&nbsp;&nbsp; }<br>  #else<br>  &nbsp;&nbsp;&nbsp; void CBitmapStatusBar::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)<br>  &nbsp;&nbsp;&nbsp; {<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(lpDrawItemStruct-&gt;itemID)<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1:<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //从资源中选择位图<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CBitmap pBitmap;<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //加载位图,使用Import从文件加载资源,可以不受调色板限制<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   pBitmap.LoadBitmap(IDB_BITMAP1);<br>  <br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将状态条(StatusBar)附加到一个CDC对象<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CDC dc,SourceDC;<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   dc.Attach(lpDrawItemStruct-&gt;hDC);<br>  <br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //得到pane的大小和坐标<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRect   rect(&amp;lpDrawItemStruct-&gt;rcItem);<br>  <br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将当前位图放入兼容CDC<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   SourceDC.CreateCompatibleDC(NULL);//生成兼容的CDC<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CBitmap* pOldBitmap =   SourceDC.SelectObject(&amp;pBitmap);//选择位图<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc.BitBlt(rect<a  name="4">]</a>.left, rect.top, rect.Width(), rect.Height(),<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   &amp;SourceDC, 0, 0, SRCCOPY);//BitBlt<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   SourceDC.SelectObject(pOldBitmap);//删除CDC中所选择的位图<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   pBitmap.DeleteObject();//删除位图<br>  <br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将状态条(StatusBar)与CDC对象分离,否则hDC将会在CDC废弃时被删除<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dc.Detach();<br>  <br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CStatusBar::DrawItem(lpDrawItemStruct);<br>  &nbsp;&nbsp;&nbsp; }<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>  &nbsp;&nbsp;&nbsp; if (!m_wndStatusBar.Create(this) ||   !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))){<br>  &nbsp;&nbsp;&nbsp; TRACE0(&quot;Failed to create status bar\n&quot;);<br>  &nbsp;&nbsp;&nbsp; return -1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // fail to create<br>  &nbsp;&nbsp;&nbsp; }<br>  &nbsp;&nbsp; //加入下列代码<br>  &nbsp;&nbsp; #if _MFC_VER &gt;= 0x400<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UINT nID, nStyle;<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int cxWidth;<br>  <br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_wndStatusBar.GetPaneInfo(1, nID, nStyle, cxWidth);<br>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_wndStatusBar.SetPaneInfo(1, nID, nStyle | SBT_OWNERDRAW,   cxWidth);<br>  &nbsp;&nbsp; #endif<br>  ...}</font></p></blockquote></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -