VS2010解决对话框设置背景图片和文字重叠问题

内容:MFC基于对话框的项目设置背景图片以及解决设置对话框背景之后导致文字重叠(叠影)问题。

简介:

被严密封装的MFC应用程序界面开发是一个很大的问题。先从简单的对话框背景设置来说。

可以设置BITMAP图像或者其他格式的图片做为背景。

MFC内置了CImage类来加载和使用各种类型的图片。

简单使用方式如下:在Rect大小的区域用Image来绘制背景。(也可以使用bkImage.BitBlt();bkImage.StretchBlt()等函数来绘制Rect区域)。

CRect rect;
GetClientRect(rect);
CPaintDC dc(this);
CImage bkImage;
bkImage.Load(_T("res//bg.jpg"));
bkImage.Draw(dc, rect);
bkImage.Destroy();

绘制可以放在OnPaint()(WM_PAINT消息函数)或者OnEraseBkgnd(CDC *pDC)(WM_ERASEBKGND消息函数)中。

其中又遇到两个问题,

第一个问题是在对话框中的每个控件都包含一个自己的背景色,导致出现了下面的问题。


产生原因:

每个控件默认带一个自己的背景色。

解决方法:

将其默认的背景色设置为透明即可。

在WM_CTLCOLOR消息对应的消息处理函数OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)中

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

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

	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
        //通过控件ID的形式进行选择性设置背景为透明。
        if(IDC_LOGOUT==pWnd->GetDlgCtrlID()
		|| IDCANCEL==pWnd->GetDlgCtrlID()
		|| IDC_STTCTREE==pWnd->GetDlgCtrlID()
		|| IDC_COURSEDMODELLIST==pWnd->GetDlgCtrlID()
		|| IDC_STTCTREE==pWnd->GetDlgCtrlID()
		|| IDC_COURSESMODELLIST==pWnd->GetDlgCtrlID()
		|| IDC_COURSEANATLIST==pWnd->GetDlgCtrlID()
		|| IDC_COURSESOUNDLIST==pWnd->GetDlgCtrlID()
		|| IDC_CURCOURSE==pWnd->GetDlgCtrlID())
	{
		pDC->SetBkColor(RGB(255,255,255));
		pDC->SetBkMode(TRANSPARENT);
		return (HBRUSH)::GetStockObject(NULL_BRUSH);
	}
        //批量进行设置
        //switch(nCtlColor)
	//{
	//	case CTLCOLOR_STATIC: //对所有静态文本控件的设置
 //            {
	//			 pDC->SetBkMode(TRANSPARENT);//设置背景为透明           
	//			 pDC->SetTextColor(RGB(255,0,0)); //设置字体颜色
	//			 return HBRUSH(GetStockObject(NULL_BRUSH)); // 必须
	//		 }
	//	case CTLCOLOR_DLG: //对所有静态文本控件的设置
	//		{
	//			pDC->SetBkMode(TRANSPARENT); 
	//			return hbr; //返回画刷句柄
	//		} 
	//	default:
	//		pDC->SetBkMode(TRANSPARENT);
	//		return CDialog::OnCtlColor(pDC,pWnd, nCtlColor);
	//}
	//pDC->SetBkMode(TRANSPARENT);
	//return (HBRUSH)::GetStockObject(NULL_BRUSH);
	return hbr;
}
pDC->SetBkMode(TRANSPARENT);

然后返回NULL_BRUSH即可。


第二个问题时出现文字重影问题。

绘制完之后会出现字体的重影问题,即文字在更新时旧有的文字没有被清除。如下图:

产生原因:

咱无

解决方法:

对包含该文字的控件在更新文字之前,

先调用ShowWindow(SW_HIDE);

然后等更新文字到控件之后。

再调用ShowWindow(SW_SHOW);

即可解决。

由于我是通过变量关联的控件所以

直接使用

mCurCourseShow.ShowWindow(SW_HIDE);
mCurCourseShow.SetWindowText(selStr);//selStr为要更新的字符串
mCurCourseShow.ShowWindow(SW_SHOW);

//也可以直接使用
((CEdit *)(GetDlgItem(IDC_EDIT)))->ShowWindow(SW_HIDE);

((CEdit *)(GetDlgItem(IDC_EDIT)))->SetWindowText(str);

((CEdit *)(GetDlgItem(IDC_EDIT)))->ShowWindow(SW_SHOW);

如上重影现象消失

出现字体重影的原因希望各位指点。


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在使用 Masonry 布局的时候,图片的高度不一致可能导致瀑布流重叠问题解决这个问题的方法是通过给每个元素设置宽度,并根据图片的原始大小设置元素的高度。 具体实现步骤如下: 1. 获取所有图片元素的原始大小。 可以通过创建一个 Image 对象,使用其 onload 事件在图片加载完成后获取图片的原始大小。 ```javascript var img = new Image(); img.onload = function() { console.log('图片原始大小:' + this.width + 'x' + this.height); }; img.src = 'http://example.com/image.jpg'; ``` 2. 计算每个元素的高度。 在获取到图片的原始大小之后,可以根据元素的宽度和图片的宽高比计算出元素的高度。 ```javascript var elementWidth = 200; // 元素宽度 var imageWidth = img.width; var imageHeight = img.height; var elementHeight = imageHeight / imageWidth * elementWidth; ``` 3. 设置每个元素的高度。 通过遍历所有元素,设置其高度即可。 ```javascript var elements = document.querySelectorAll('.item'); for (var i = 0; i < elements.length; i++) { elements[i].style.height = elementHeight + 'px'; } ``` 以上是一种简单的解决方案,但可能存在一些问题,例如: - 如果图片加载较慢,会导致布局变化时出现闪烁。 - 如果图片的宽高比很大,会导致元素的高度很高,影响布局效果。 为了解决这些问题,可以使用一些插件或库来实现瀑布流布局,例如: - Isotope:一个功能强大的瀑布流布局库,支持过渡效果和筛选功能。 - Packery:一个基于 Draggabilly 的瀑布流布局库,支持动态布局和拖拽功能。 - Waterfall:一个轻量级的瀑布流布局插件,支持自适应和懒加载功能。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值