📄 vcc35.htm
字号:
<html>
<head>
<title>c++系列</title>
<meta content="text/html; charset=gb2312" http-equiv=Content-Type>
</head>
<p align="center"><script src="../../1.js"></script></a>
<body bgcolor="#ffffff" leftmargin="5" topmargin="1" marginheight="5" marginwidth="5">
<div align=center>
<table border=0 cellpadding=0 cellspacing=0 width=680 align="center">
<tbody>
<tr>
<td width=200 height="59">
</tr>
</tbody>
</table>
<table border=1 bordercolordark=#ffffff bordercolorlight=#ffffff cellpadding=0
cellspacing=0 width=685 align="center" height="70">
<tbody>
<tr>
<td bgcolor=#F9D23C height=14>
<div align=center class=H1> <b><strong><font face="宋体" size="-1"><span class="unnamed1">如何在应用程序状态条中加入Bitmap位图</span></font></strong></b></font></div>
</td>
</tr>
<tr valign=top>
<td class=H1 height=212>
<p align="center"><font color="#FF0000"><strong><font face="宋体" size="-1"> <br>
</font></span></font>
</font></span></font></strong></font></p>
<p> <strong><font face="宋体">摘要<br>
MFC应用程序中的状态条可以很方便的显示应用程序的状态,有时需要用Bitmap位图显示程序状态,但是MFC的CStatusBar类只直接支持显示文本,并不支持图形。本文以实例说明了如何在状态条中加入Bitmap位图。本文内容适用于Microsoft
Visual C++ 1.0/2.0/2.1/2.2/4.0/4.1所包含的Microsoft Foundation Classes(MFC)<br>
<br>
以下将详细说明如何在状态条的第一个方块中显示Bitmap位图。<br>
<br>
1. 首先在图形编辑器中生成一个位图,或从外部文件中加载一个位图资源到应用程序中,并标识其为IDB_BITMAP1。<br>
<br>
2. 在状态条中加入一个新的方块。<br>
<br>
在Mainfrm.cpp中加入下列语句<br>
<br>
//Mainfrm.cpp<br>
<br>
static UINT indicators[]=<br>
<br>
{<br>
<br>
ID_SEPARATOR,//status line indicator<br>
<br>
ID_INDICATOR_BITMAP, //BITMAP状态条<br>
<br>
ID_INDICATOR_CAPS,<br>
<br>
ID_INDICATOR_NUM,<br>
<br>
ID_INDICATOR_SCRL,<br>
<br>
};<br>
<br>
3. 从CstatuBar派生一个新类CbitmapStatusBar,并且用这个新类取代CmainFrame中的CstatuBar<br>
<br>
//Mainfrm.h<br>
<br>
//CstatusBar m_wndStatusBar;<br>
<br>
CbitmapStatusBar m_wndStatuBar;<br>
<br>
4. 在新类的.h和.cpp中加入下面两个函数的声明和定义<br>
<br>
//BitmapStatusBar.h<br>
<br>
class CMyStatusBar:public CStatusBar {...<br>
<br>
#if_MFC_VER ?x400<br>
<br>
virtual void DoPaint(CDC*pDC);<br>
<br>
#else<br>
<br>
virtual void DrawItem(LPDRAWITEMSTRUCT 1pDrawItemStruct);<br>
<br>
#endif<br>
<br>
...}<br>
<br>
//BitmapStatusBar.cpp<br>
<br>
#if_MFC_VER?x400<br>
<br>
void CBitampStatusBar::DoPaint(CDC*pDC)<br>
<br>
{<br>
<br>
CRect rect;<br>
<br>
GetItemRect(1,&rect);//得到pane的大小<br>
<br>
pDC->ExcludeClipRect(&rect);//创建新的裁剪区域<br>
<br>
CStatusBar::DoPaint(pDC);//描绘状态条(status bar)的其余部分<br>
<br>
CRgn paneRgn;<br>
<br>
paneRgn.CreateRectRgnIndirect(rect);<br>
<br>
pDC->SelectClipRgn(&paneRgn);//选择裁剪区域<br>
<br>
CBitmap pBitmap;<br>
<br>
//加载位图,使用Import从文件加载资源,可以不受调色板限制<br>
<br>
pBitmap.LoadBitmap(IDB_BITMAP1);<br>
<br>
//将当前位图放入兼容CDC<br>
<br>
CDC SourceDC;<br>
<br>
SourceDC.CreateCompatibleDC(NULL);//生成兼容的CDC<br>
<br>
CBitmap*pOldBitmap=SourceDC.SelectObject(&pBitmap);//选择位图<br>
<br>
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),<br>
<br>
&SourceDC,0,0,SRCCOPY);//BitBlt<br>
<br>
SourceDC.SelectObject(pOldBitmap);//删除CDC中所选择的位图<br>
<br>
pBitmap.DeleteObject();//删除位图<br>
<br>
}<br>
<br>
#else<br>
<br>
void CBitmapStatusBar::DrawItem(LPDRAWITEMSTRUCT 1pDrawItemStruct)<br>
<br>
{<br>
<br>
switch(1pDrawItemStruct->itemID)<br>
<br>
{<br>
<br>
case 1:<br>
<br>
//从资源中选择位图<br>
<br>
CBitmap pBitmap;<br>
<br>
//加载位图,使用Import从文件加载资源,可以不受调色板限制<br>
<br>
pBitmap.LoadBitmap(IDB_BITMAP1);<br>
<br>
//将状态条(StatusBar)附加到一个CDC对象<br>
<br>
CDC dc,SourceDC;<br>
<br>
dc.Attach(1pDrawItemStruct->hDC);<br>
<br>
//得到pane的大小和坐标<br>
<br>
CRect rect(&1pDrawItemStruct->rcItem);<br>
<br>
//将当前位图放入兼容CDC<br>
<br>
SourceDC.CreateCompatibleDC(NULL);//生成兼容的CDC<br>
<br>
CBitmap*pOldBitmap=SourceDC.SelectObject(&pBitmap);//选择位图<br>
<br>
dc.BitBlt(rect].left,rect.Width(),rect.Height(),<br>
<br>
&SourceDC,0,0,SRCCOPY);//BitBlt<br>
<br>
SourceDC.SelectObject(pOldBitmap);//删除CDC中所选择的位图<br>
<br>
pBitmap.DeleteObject();//删除位图<br>
<br>
//将状态条(StatusBar)与CDC对象分离,否则hDC将会在CDC废弃时被删除<br>
<br>
dc.Detach();<br>
<br>
return;<br>
<br>
}<br>
<br>
CStatusBar::DrawItem(1pDrawItemStruct);<br>
<br>
}<br>
<br>
#endif<br>
<br>
5. 在Mainfrm.cpp的CMainFrame::OnCreate()函数中加入下面的代码<br>
<br>
//Mainfrm.cpp<br>
<br>
int CMainFrame::OnCreate(LPCREATESTRUCT 1pCreateStruct)<br>
<br>
{...<br>
<br>
if(!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))<br>
<br>
{<br>
<br>
TRACE0(“Failed to create status bar\n”);<br>
<br>
return-1;//fail to create<br>
<br>
}<br>
<br>
//加入下列代码<br>
<br>
#if_MFC_VER>=0x400<br>
<br>
UINT nID,nStyle;<br>
<br>
int cxWidth;<br>
<br>
m_wndStatusBar.GetPaneInfo(1,nID,nStyle,cxWidth);<br>
<br>
m_wndStatusBar.SetPaneInfo(1,nID,nStyle|SBT_OWNERDRAW,cxWidth);<br>
<br>
#endif<br>
<br>
...}<br>
<br>
编译、链接后,运行时在状态条中就出现选定的位图。 </font></strong></span></font></span></span></span></p>
<p> <strong> 洪涛
张芝霞·popcool开发专区</font></strong> </span></font></span></span></span>
<p align="center"> <font
color=#ffa000><b></b></font></span><font
color=#ffa000><b><br>
</td>
</tr>
</tbody>
</table>
</div>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -