日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

如何给 Visual C++ 中的对话框增加位图背景

發(fā)布時(shí)間:2025/3/15 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何给 Visual C++ 中的对话框增加位图背景 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?如何給 Visual C++ 中的對話框增加位圖背景

Visual C++ 是 Microsoft 至今最全面和最完善的程序開放產(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ì),并且也做得很好,使用戶使用起來很容易,對話框就是 Windows 提供的界面元素的一個(gè),它用來進(jìn)行信息輸入,也可用來把程序的結(jié)果或中間結(jié)果告訴用戶。實(shí)際上,它是應(yīng)用程序中使用最多的一種交互方式。

?
?

在 Visual C++ 中,對話框的背景通常是灰色的,文字是黑色的(這也是默認(rèn)值),見下圖。

?
?

但用戶可以通過使用位圖可以很容易地改變對話框的背景,這里,筆者編寫了一個(gè) CBmpDialog 類,將位圖引入到對話框的背景之中,改善了對話框的視覺效果。添加了位圖背景的對話框效果如以下兩圖所示。

?
?


CBmpDialog 類的創(chuàng)建過程如下,首先在資源中設(shè)計(jì)一個(gè)對話框,然后創(chuàng)建一個(gè)管理該對話框的類,即 CBmpDialog ,基類為 CDialog ,通過類向?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è)畫筆類

CBitmap mBitmap; // 定義一個(gè)位圖類

};

接下來在源程序 BmpDialog.cpp 加入下列代碼:

1 、構(gòu)造函數(shù) CBmpDialog::CBmpDialog ( ) ,該函數(shù)構(gòu)造了一個(gè) CbmpDialog 對象,并生成一個(gè)空畫筆,以便被類引用。

CBmpDialog::CBmpDialog (CWnd* pParent /*=NULL*/)

: CDialog (CBmpDialog::IDD, pParent)

{

mHollowBrush . CreateStockObject (HOLLOW_BRUSH);

}

2 、 CBmpDialog::OnCtlColor ( ) 函數(shù),當(dāng)對話框準(zhǔn)備顯示一個(gè)控件時(shí),調(diào)用此函數(shù),它返回一個(gè) HBRUSH ,用于繪制控件背景,對于靜態(tài)控件返回一個(gè)空畫筆,位圖將出現(xiàn)在控件的后面;對于其它控件,則采用 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í),返回空畫筆

pDC->SetBkMode (TRANSPARENT);

return (HBRUSH) mHollowBrush.m_hObject;

break;

default: // 對其它控件,采用缺省值

HBRUSH hbr = CDialog::OnCtlColor (pDC,

pWnd, nCtlColor);

return hbr ;

break;

}

}

else // 無位圖背景時(shí)

{

HBRUSH hbr = CDialog::OnCtlColor (pDC, pWnd, nCtlColor);

return hbr;

}

}

3 、 CBmpDialog::OnEraseBkgnd ( ) 函數(shù),當(dāng)對話框需要重繪時(shí),框架將調(diào)用此函數(shù), OnEraseBkgnd ( ) 顯示位圖的方式有兩種:如果位圖居中放置,就先調(diào)用基類的 OnEraseBkgnd ( ) ,重新繪制整個(gè)背景,然后把位圖顯示在對話框的中心位置;如果想以鋪瓦的方式排列位圖,就以對話框的左上角為起點(diǎn)進(jìn)行排列,直到填滿整個(gè)對話框。

BOOL CBmpDialog::OnEraseBkgnd (CDC* pDC)

{

if (mBitmap.m_hObject!=NULL) // 對象句柄非空

{

CDC MemDC;

BITMAP bm;

CRect Rect;

int x=0, y=0;

GetClientRect (&Rect); // 獲取客戶區(qū)大小

mBitmap.GetObject (sizeof (BITMAP),&bm); // 用位圖上的信息 填充 BITMAP 結(jié)構(gòu)的各個(gè)域

MemDC.CreateCompatibleDC (pDC); // 初始化內(nèi)存描述對象

CBitmap*pOldBitmap=MemDC.SelectObject (&mBitmap); // 定 義一個(gè) CBITMAP 類,并初始化為選入到設(shè)備描述對象的位圖

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è)備對象

0, // 源位圖橫坐標(biāo)

0, // 源位圖縱坐標(biāo)

SRCCOPY); // 轉(zhuǎn)換類型代碼, SRCCOPY 表示數(shù)據(jù)不經(jīng)修改直接拷貝

}

else // 位圖平鋪放置

{ // 從左上角開始依次排列位圖

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 ); // 將位圖對象選入

內(nèi)存 設(shè)備描述對象

return TRUE;

}

else // 無位圖時(shí)產(chǎn)生普通對話框

return CDialog::OnEraseBkgnd (pDC);

}

4 、 CBmpDialog::SetBitmap( ) 函數(shù),通過調(diào)用此函數(shù),裝入將在對話框中顯示的位圖,如果函數(shù)沒有調(diào)用,或者位圖不存在,就會(huì)產(chǎn)生普通的對話框。

void CBmpDialog::SetBitmap (UINT ResID, int Type)

{

mBitmap.LoadBitmap (ResID); // 裝入位圖對象

mType=Type; // 位圖放置方式

}

使用該類時(shí),首先必需將位圖資源加入到項(xiàng)目中,為其賦予一個(gè)資源號,然后聲明一個(gè) CBmpDialog 對象,接著調(diào)用 SetBitmap ( ) 函數(shù)對其進(jìn)行初始化。如下述語句:

CBmpDialog dlg2;

dlg2.SetBitmap(IDB_CLOUDS,BITMAP_CENTER);

dlg2.DoModal();

即可產(chǎn)生一個(gè)位圖居于背景正中的對話框。

總結(jié)

以上是生活随笔為你收集整理的如何给 Visual C++ 中的对话框增加位图背景的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。