如何给 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++ 中的对话框增加位图背景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 反弹式后门代码
- 下一篇: oracle 11g 从rman全备中恢