如何给 Visual C++ 中的对话框增加位图背景
?如何給 Visual C++ 中的對(duì)話框增加位圖背景
Visual C++ 是 Microsoft 至今最全面和最完善的程序開(kāi)放產(chǎn)品之一,它提供了一組各種各樣的為適應(yīng)幾乎每一種編程風(fēng)格而設(shè)計(jì)的工具,在編程能力和方便性方面達(dá)到了空前的水平。
應(yīng)用程序的界面設(shè)計(jì)占用了整個(gè)程序設(shè)計(jì)的很大一部分工作量,一個(gè)應(yīng)用程序是否成功 , 界面的好壞有很大的影響,因此,現(xiàn)代的軟件設(shè)計(jì)特別強(qiáng)調(diào)界面設(shè)計(jì),并且也做得很好,使用戶(hù)使用起來(lái)很容易,對(duì)話框就是 Windows 提供的界面元素的一個(gè),它用來(lái)進(jìn)行信息輸入,也可用來(lái)把程序的結(jié)果或中間結(jié)果告訴用戶(hù)。實(shí)際上,它是應(yīng)用程序中使用最多的一種交互方式。
| ? | |
| ? |
在 Visual C++ 中,對(duì)話框的背景通常是灰色的,文字是黑色的(這也是默認(rèn)值),見(jiàn)下圖。
| ? | |
| ? |
但用戶(hù)可以通過(guò)使用位圖可以很容易地改變對(duì)話框的背景,這里,筆者編寫(xiě)了一個(gè) CBmpDialog 類(lèi),將位圖引入到對(duì)話框的背景之中,改善了對(duì)話框的視覺(jué)效果。添加了位圖背景的對(duì)話框效果如以下兩圖所示。
| ? | |
| ? |
CBmpDialog 類(lèi)的創(chuàng)建過(guò)程如下,首先在資源中設(shè)計(jì)一個(gè)對(duì)話框,然后創(chuàng)建一個(gè)管理該對(duì)話框的類(lèi),即 CBmpDialog ,基類(lèi)為 CDialog ,通過(guò)類(lèi)向?qū)槠涮砑酉⑻幚砗瘮?shù) OnCtlColor ( )和 OnEraseBkgnd ( ) ,并在其頭文件 BmpDialog.h 中添加以下內(nèi)容:
# define BITMAP_TILE 0
# define BITMAP_CENTER 1
class CBmpDialog : public CDialog
{
public:
void SetBitmap (UINT ResID,int Type=BITMAP_TILE); // 該函
數(shù)裝入位圖并決定如何顯示,缺省放置方式為平鋪
private:
int mType; // 定義位圖放置方式變量
CBrush mHollowBrush; // 定義一個(gè)畫(huà)筆類(lèi)
CBitmap mBitmap; // 定義一個(gè)位圖類(lèi)
};
接下來(lái)在源程序 BmpDialog.cpp 加入下列代碼:
1 、構(gòu)造函數(shù) CBmpDialog::CBmpDialog ( ) ,該函數(shù)構(gòu)造了一個(gè) CbmpDialog 對(duì)象,并生成一個(gè)空畫(huà)筆,以便被類(lèi)引用。
CBmpDialog::CBmpDialog (CWnd* pParent /*=NULL*/)
: CDialog (CBmpDialog::IDD, pParent)
{
mHollowBrush . CreateStockObject (HOLLOW_BRUSH);
}
2 、 CBmpDialog::OnCtlColor ( ) 函數(shù),當(dāng)對(duì)話框準(zhǔn)備顯示一個(gè)控件時(shí),調(diào)用此函數(shù),它返回一個(gè) HBRUSH ,用于繪制控件背景,對(duì)于靜態(tài)控件返回一個(gè)空畫(huà)筆,位圖將出現(xiàn)在控件的后面;對(duì)于其它控件,則采用 OnCtlColor ( ) 的默認(rèn)值,并允許控件以普通方式繪制,此時(shí),位圖不會(huì)出現(xiàn)在控件的后面。
HBRUSH CBmpDialog::OnCtlColor (CDC* pDC, CWnd* pWnd,
UINT nCtlColor)
{
if (mBitmap.GetSafeHandle ( ) !=NULL) // 返回的位圖句柄非空時(shí)
{
switch (nCtlColor)
{
case CTLCOLOR_STATIC: // 為靜態(tài)控件時(shí),返回空畫(huà)筆
pDC->SetBkMode (TRANSPARENT);
return (HBRUSH) mHollowBrush.m_hObject;
break;
default: // 對(duì)其它控件,采用缺省值
HBRUSH hbr = CDialog::OnCtlColor (pDC,
pWnd, nCtlColor);
return hbr ;
break;
}
}
else // 無(wú)位圖背景時(shí)
{
HBRUSH hbr = CDialog::OnCtlColor (pDC, pWnd, nCtlColor);
return hbr;
}
}
3 、 CBmpDialog::OnEraseBkgnd ( ) 函數(shù),當(dāng)對(duì)話框需要重繪時(shí),框架將調(diào)用此函數(shù), OnEraseBkgnd ( ) 顯示位圖的方式有兩種:如果位圖居中放置,就先調(diào)用基類(lèi)的 OnEraseBkgnd ( ) ,重新繪制整個(gè)背景,然后把位圖顯示在對(duì)話框的中心位置;如果想以鋪瓦的方式排列位圖,就以對(duì)話框的左上角為起點(diǎn)進(jìn)行排列,直到填滿(mǎn)整個(gè)對(duì)話框。
BOOL CBmpDialog::OnEraseBkgnd (CDC* pDC)
{
if (mBitmap.m_hObject!=NULL) // 對(duì)象句柄非空
{
CDC MemDC;
BITMAP bm;
CRect Rect;
int x=0, y=0;
GetClientRect (&Rect); // 獲取客戶(hù)區(qū)大小
mBitmap.GetObject (sizeof (BITMAP),&bm); // 用位圖上的信息 填充 BITMAP 結(jié)構(gòu)的各個(gè)域
MemDC.CreateCompatibleDC (pDC); // 初始化內(nèi)存描述對(duì)象
CBitmap*pOldBitmap=MemDC.SelectObject (&mBitmap); // 定 義一個(gè) CBITMAP 類(lèi),并初始化為選入到設(shè)備描述對(duì)象的位圖
if (mType==BITMAP_CENTER) // 位圖置背景的中心
{
CDialog::OnEraseBkgnd(pDC); // 先重繪整個(gè)背景
x= (Rect.Width()-bm.bmWidth) /2; // 位圖左上角橫坐標(biāo)
y= (Rect.Height()-bm.bmHeight) /2; // 位圖左上角縱坐標(biāo)
pDC->BitBlt
(x, // 目標(biāo)位圖橫坐標(biāo)
y, // 目標(biāo)位圖縱坐標(biāo)
bm.bmWidth, // 要轉(zhuǎn)換的塊高度
bm.bmHeight, // 要轉(zhuǎn)換的塊寬度
&MemDC, // 圖形數(shù)據(jù)的源設(shè)備對(duì)象
0, // 源位圖橫坐標(biāo)
0, // 源位圖縱坐標(biāo)
SRCCOPY); // 轉(zhuǎn)換類(lèi)型代碼, SRCCOPY 表示數(shù)據(jù)不經(jīng)修改直接拷貝
}
else // 位圖平鋪放置
{ // 從左上角開(kāi)始依次排列位圖
while (y<Rect.Height ( ) )
{
while (x<Rect.Width ( ) )
{
pDC->BitBlt (x,y,bm.bmWidth,bm.bmHeight,
&MemDC,0,0,SRCCOPY );
x=x+bm.bmWidth;
}
x=0;
y=y+bm.bmHeight;
}
}
MemDC.SelectObject ( pOldBitmap ); // 將位圖對(duì)象選入
內(nèi)存 設(shè)備描述對(duì)象
return TRUE;
}
else // 無(wú)位圖時(shí)產(chǎn)生普通對(duì)話框
return CDialog::OnEraseBkgnd (pDC);
}
4 、 CBmpDialog::SetBitmap( ) 函數(shù),通過(guò)調(diào)用此函數(shù),裝入將在對(duì)話框中顯示的位圖,如果函數(shù)沒(méi)有調(diào)用,或者位圖不存在,就會(huì)產(chǎn)生普通的對(duì)話框。
void CBmpDialog::SetBitmap (UINT ResID, int Type)
{
mBitmap.LoadBitmap (ResID); // 裝入位圖對(duì)象
mType=Type; // 位圖放置方式
}
使用該類(lèi)時(shí),首先必需將位圖資源加入到項(xiàng)目中,為其賦予一個(gè)資源號(hào),然后聲明一個(gè) CBmpDialog 對(duì)象,接著調(diào)用 SetBitmap ( ) 函數(shù)對(duì)其進(jìn)行初始化。如下述語(yǔ)句:
CBmpDialog dlg2;
dlg2.SetBitmap(IDB_CLOUDS,BITMAP_CENTER);
dlg2.DoModal();
即可產(chǎn)生一個(gè)位圖居于背景正中的對(duì)話框。
總結(jié)
以上是生活随笔為你收集整理的如何给 Visual C++ 中的对话框增加位图背景的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 反弹式后门代码
- 下一篇: oracle 11g 从rman全备中恢