您的位置:首页 > 其它

MFC为对话框添加背景图片

2014-10-29 22:39 218 查看
1、方法一:利用OnCtlColor函数(WM_CTLCOLOR消息)

(1)添加一个成员变量:CBrush m_bkBrush;

(2)在对话框的初始化函数OnInitDialog中添加如下内容:

BOOL CDlgBKDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

... ...

// TODO: 在此添加额外的初始化代码
// 载入位图
CBitmap oBitmap;
oBitmap.LoadBitmap(IDB_BITMAP_BK);
// 根据位图大小调整窗口大小
BITMAP bm;
oBitmap.GetBitmap(&bm);
MoveWindow(0, 0, bm.bmWidth, bm.bmHeight);
// 创建位图画刷
m_bkBrush.CreatePatternBrush(&oBitmap);

return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}


(3)添加WM_CTLCOLOR消息的响应函数OnCtlColor:

HBRUSH CDlgBKDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO:  在此更改 DC 的任何特性

return (HBRUSH)m_bkBrush;

// TODO:  如果默认的不是所需画笔,则返回另一个画笔
//return hbr;
}


(4)注:IDB_BITMAP_BK是导入的背景位图的资源ID。

2、方法二:在OnPaint函数中直接绘制背景

(1)声明两个成员变量:

<span style="white-space:pre">	</span>CBrush m_bkBrush;
BITMAP m_bm;


(2)在OnInitDialog函数中添加如下代码:

<span style="white-space:pre">	</span>// 载入位图
CBitmap oBitmap;
oBitmap.LoadBitmap(IDB_BITMAP_BK);
// 根据位图大小调整窗口大小
oBitmap.GetBitmap(&m_bm);
MoveWindow(0, 0, m_bm.bmWidth, m_bm.bmHeight);
// 创建位图画刷
m_bkBrush.CreatePatternBrush(&oBitmap);


(3)在OnPaint函数中添加如下代码:

void CDlgBKDlg::OnPaint()
{
if (IsIconic())
{
... ...
}
else
{
CPaintDC dc(this);

CBrush* pOldBrush = dc.SelectObject(&m_bkBrush);
dc.Rectangle(0, 0, m_bm.bmWidth, m_bm.bmHeight);
dc.SelectObject(pOldBrush);

CDialogEx::OnPaint();
}
}


3、以上两种方法其实差不多,都是窗口适应图片的大小,接下来介绍一种图片适应窗口大小的添加背景方法。

4、方法三:利用StretchBlt函数拉伸背景位图

(1)在OnPaint函数中添加以下代码:

void CDlgBKDlg::OnPaint()
{
if (IsIconic())
{
... ...
}
else
{
CPaintDC dc(this);

CBitmap oBitmap;
oBitmap.LoadBitmap(IDB_BITMAP_BK);

BITMAP bm;
oBitmap.GetBitmap(&bm);

CRect rcClient;
GetClientRect(&rcClient);

CDC dcMemory;
dcMemory.CreateCompatibleDC(&dc);
dcMemory.SelectObject(&oBitmap);

dc.StretchBlt(0, 0, rcClient.Width(), rcClient.Height(), &dcMemory, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);

CDialogEx::OnPaint();
}
}


(2)为了测试效果,可以将对话框的Border属性改为Resizing,另外在WM_SIZE消息的响应函数OnSize中添加一句:Invalidate();

void CDlgBKDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);

// TODO: 在此处添加消息处理程序代码
Invalidate();
}


5、效果:







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: