现在的位置: 首页 > 综合 > 正文

mfc实现以图片作为对话框的背景

2013年06月27日 ⁄ 综合 ⁄ 共 2008字 ⁄ 字号 评论关闭

 下载列表:

 程序下载

 源代码下载

1建立对话框类型mfc项目,不支持缩放,最大最小化,这样可以保证图片正常显示

2将准备好的图片添加到项目中去,ID设置为IDB_BACKGROUND

3在生成的Dialog派生类头文件中添加如下变量

protected:
	//对话框背景设置变量
	CBitmap bitmapBackground; 
	CBrush brushHollow;
	CSize sizeBitmap;

4在生成的Dialog派生类头文件中添加如下消息函数

//当窗口背景要被擦除时,此函数会被调用
afx_msg BOOL OnEraseBkgnd(CDC* pDC);

//框架调用此函数,通知窗口其将被消毁
afx_msg void OnDestroy();

//当子控件被绘制时,会调用此函数
afx_msg HBRUSH OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor);

5对应的在源文件中添加消息映射

ON_WM_ERASEBKGND()
ON_WM_DESTROY()
ON_WM_CTLCOLOR()

6在构造函数中创建空白画刷

CdialogDlg::CdialogDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CdialogDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	//创建空白画刷
	brushHollow.CreateStockObject(HOLLOW_BRUSH);
}

7在OnInitDialog函数中设置窗口大小(与图片大小就保持一致),加载背景图片,保存图片大小

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

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here

	//设置窗口位于屏幕中心,大小为485x299
	MoveWindow(0,0,485,299);

	//加载背景图片,保存图片的大小
	bitmapBackground.LoadBitmapW(IDB_BACKGROUND);
	BITMAP bitmapStruct;
	bitmapBackground.GetBitmap(&bitmapStruct);
	sizeBitmap=CSize(bitmapStruct.bmWidth,bitmapStruct.bmHeight);

	return TRUE;  // return TRUE  unless you set the focus to a control
}

8在OnEraseBkgnd中绘制背景

BOOL CdialogDlg::OnEraseBkgnd(CDC* pDC) {
	CDialog::OnEraseBkgnd(pDC);

	//画出背景图片
	CDC dc;
	dc.CreateCompatibleDC(pDC);
	
	CBitmap* pOldBitmap=dc.SelectObject(&bitmapBackground);
	CRect rtClient;
	GetClientRect(&rtClient);
	
	pDC->BitBlt(0,0,sizeBitmap.cx,sizeBitmap.cy,&dc,0,0,SRCCOPY);

	return TRUE;
}

9在OnDestroy函数中释放资源

void CdialogDlg::OnDestroy() {
	CDialog::OnDestroy();
        //释放资源
	bitmapBackground.DeleteObject();
	brushHollow.DeleteObject();
}

10在OnCtlColor中设置背景模式为透明,返回空白控件画刷,

     这样就它们就会直接出现在背景图片上

HBRUSH CdialogDlg::OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor) {
	//设置背景模式为透明
	pDC->SetBkMode(TRANSPARENT);

	//返回空白画刷
	return brushHollow;
}

备注:关于相关函数的详细说明,请参见mfc.项目类型不同,方法可能不同,请查阅相关资料进行更改.


以上内容属于个人理解,仅供参考,不保证正确. 如果发现错误或有建议请与我联系,谢谢.
email: linjieligc@qq.com
qq:914196158
程序设计交流群:250967270
Citius, Altius, Fortius

抱歉!评论已关闭.