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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

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

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

Visual C++ 是 Microsoft 至今最全面和最完善的程序開放產品之一,它提供了一組各種各樣的為適應幾乎每一種編程風格而設計的工具,在編程能力和方便性方面達到了空前的水平。

應用程序的界面設計占用了整個程序設計的很大一部分工作量,一個應用程序是否成功 , 界面的好壞有很大的影響,因此,現代的軟件設計特別強調界面設計,并且也做得很好,使用戶使用起來很容易,對話框就是 Windows 提供的界面元素的一個,它用來進行信息輸入,也可用來把程序的結果或中間結果告訴用戶。實際上,它是應用程序中使用最多的一種交互方式。

?
?

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

?
?

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

?
?


CBmpDialog 類的創建過程如下,首先在資源中設計一個對話框,然后創建一個管理該對話框的類,即 CBmpDialog ,基類為 CDialog ,通過類向導為其添加消息處理函數 OnCtlColor ( )和 OnEraseBkgnd ( ) ,并在其頭文件 BmpDialog.h 中添加以下內容:

# define BITMAP_TILE 0

# define BITMAP_CENTER 1

class CBmpDialog : public CDialog

{

public:

void SetBitmap (UINT ResID,int Type=BITMAP_TILE); // 該函

數裝入位圖并決定如何顯示,缺省放置方式為平鋪

private:

int mType; // 定義位圖放置方式變量

CBrush mHollowBrush; // 定義一個畫筆類

CBitmap mBitmap; // 定義一個位圖類

};

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

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

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

: CDialog (CBmpDialog::IDD, pParent)

{

mHollowBrush . CreateStockObject (HOLLOW_BRUSH);

}

2 、 CBmpDialog::OnCtlColor ( ) 函數,當對話框準備顯示一個控件時,調用此函數,它返回一個 HBRUSH ,用于繪制控件背景,對于靜態控件返回一個空畫筆,位圖將出現在控件的后面;對于其它控件,則采用 OnCtlColor ( ) 的默認值,并允許控件以普通方式繪制,此時,位圖不會出現在控件的后面。

HBRUSH CBmpDialog::OnCtlColor (CDC* pDC, CWnd* pWnd,

UINT nCtlColor)

{

if (mBitmap.GetSafeHandle ( ) !=NULL) // 返回的位圖句柄非空時

{

switch (nCtlColor)

{

case CTLCOLOR_STATIC: // 為靜態控件時,返回空畫筆

pDC->SetBkMode (TRANSPARENT);

return (HBRUSH) mHollowBrush.m_hObject;

break;

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

HBRUSH hbr = CDialog::OnCtlColor (pDC,

pWnd, nCtlColor);

return hbr ;

break;

}

}

else // 無位圖背景時

{

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

return hbr;

}

}

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

BOOL CBmpDialog::OnEraseBkgnd (CDC* pDC)

{

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

{

CDC MemDC;

BITMAP bm;

CRect Rect;

int x=0, y=0;

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

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

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

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

if (mType==BITMAP_CENTER) // 位圖置背景的中心

{

CDialog::OnEraseBkgnd(pDC); // 先重繪整個背景

x= (Rect.Width()-bm.bmWidth) /2; // 位圖左上角橫坐標

y= (Rect.Height()-bm.bmHeight) /2; // 位圖左上角縱坐標

pDC->BitBlt

(x, // 目標位圖橫坐標

y, // 目標位圖縱坐標

bm.bmWidth, // 要轉換的塊高度

bm.bmHeight, // 要轉換的塊寬度

&MemDC, // 圖形數據的源設備對象

0, // 源位圖橫坐標

0, // 源位圖縱坐標

SRCCOPY); // 轉換類型代碼, SRCCOPY 表示數據不經修改直接拷貝

}

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

內存 設備描述對象

return TRUE;

}

else // 無位圖時產生普通對話框

return CDialog::OnEraseBkgnd (pDC);

}

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

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

{

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

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

}

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

CBmpDialog dlg2;

dlg2.SetBitmap(IDB_CLOUDS,BITMAP_CENTER);

dlg2.DoModal();

即可產生一個位圖居于背景正中的對話框。

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。