mfc对话框设置背景位图,并防止位图失真

在Dialog对应的类的 .h头文件 里面添加消息处理函数,用于改变Dialog的背景:

afx_msg BOOL OnEraseBkgnd(CDC* pDC);


然后在.cpp实现文件里面添加实现代码:

BOOL CHGolfDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
//创建内存DC
CDC MemDC;
//CBitmap对象
CBitmap Bitmap, *pOldBitmap;
//BITMAP句柄
BITMAP bmp;
//加载位图
Bitmap.LoadBitmap(IDB_MAINBG);
//将位图资源与句柄绑定
Bitmap.GetObject(sizeof(BITMAP), &bmp);
int cx, cy;
cx = GetSystemMetrics(SM_CXSCREEN);
cy = GetSystemMetrics(SM_CYSCREEN);
//创建与内存兼容的DC
MemDC.CreateCompatibleDC(pDC);
//替换原位图
pOldBitmap = (CBitmap*)(MemDC.SelectObject(&Bitmap));
pDC->SetStretchBltMode(COLORONCOLOR); // 若不设置这个模式,图片会严重失真
pDC->StretchBlt(0, 0, cx, cy, &MemDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY); // 拉伸图片使其全屏

MemDC.SelectObject(pOldBitmap);
MemDC.DeleteDC();
return TRUE;
}


 

其中,IDB_MAINBG是背景位图。

需要特别注意的是这行代码

pDC->SetStretchBltMode(COLORONCOLOR); // 若不设置这个模式,图片会严重失真

你可以试着把它注释掉,会发现事不如意,图片失真得厉害,简直被毁容了。

原文地址:https://www.cnblogs.com/lingshaohu/p/2285920.html