【求助】控件设置透明后,背景变成黑色了。

zyj_604 2013-12-26 11:16:40
界面刚打开时,文本框背景色是白色的。

等鼠标经过文本框后,背景色成为黑色的了

但是静态文本框就可以。
实在想不出什么方法了,不知道有人遇到过么?




代码也相对简单,就是 OnCtlColor 和 OnEraseBkgnd 这两个函数


#include "stdafx.h"
#include "testbg.h"
#include "Test2.h"


// CTest2 对话框

IMPLEMENT_DYNAMIC(CTest2, CDialog)

CTest2::CTest2(CWnd* pParent /*=NULL*/)
: CDialog(CTest2::IDD, pParent)
{

}

CTest2::~CTest2()
{
}

void CTest2::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CTest2, CDialog)
ON_WM_ERASEBKGND()
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()


// CTest2 消息处理程序

BOOL CTest2::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

CBitmap m_BkGndBmp;
m_BkGndBmp.LoadBitmap(IDB_BITMAP1);
CRect rcClient;
GetClientRect(&rcClient);
BITMAP bm;
m_BkGndBmp.GetBitmap(&bm);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap *pOldBmp = memDC.SelectObject(&m_BkGndBmp);
pDC->StretchBlt(0,0,rcClient.Width(),rcClient.Height(),&memDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
memDC.SelectObject(pOldBmp);
memDC.DeleteDC();
return TRUE;
}

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

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

// TODO: 如果默认的不是所需画笔,则返回另一个画笔
if(nCtlColor == CTLCOLOR_BTN
|| nCtlColor == CTLCOLOR_STATIC
|| nCtlColor == CTLCOLOR_EDIT)
{
pDC->SetTextColor(RGB(0,255,255));
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(NULL_BRUSH);
}

pDC->SetTextColor(RGB(0,0,255));
pDC->SetBkMode(TRANSPARENT);
return hbr;
}

...全文
612 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
信阳毛尖 2013-12-31
  • 打赏
  • 举报
回复
引用 5 楼 zyj_604 的回复:
[quote=引用 3 楼 lsq19871207 的回复:] [quote=引用 2 楼 worldy 的回复:] 将控件所在位置的背景剪出来一块和控件一样大小的图片,贴到控件中
楼上说的对。 像static、radio等可以,但系统的edit是不能这样的。因为你的背景不是纯色的,即使是纯色的,貌似对于edit也不行,你必须对edit进行重绘。 你需要对edit也透明么??[/quote] 是的,我想让edit的背景色也统一起来,不知道怎么处理好点[/quote] 这个你必须自绘了,因为你的背景不是单色,而是一张图片 你得把edit所在位置区域的背景拷出来贴到edit当中去才行
zyj_604 2013-12-31
  • 打赏
  • 举报
回复
引用 3 楼 lsq19871207 的回复:
[quote=引用 2 楼 worldy 的回复:] 将控件所在位置的背景剪出来一块和控件一样大小的图片,贴到控件中
楼上说的对。 像static、radio等可以,但系统的edit是不能这样的。因为你的背景不是纯色的,即使是纯色的,貌似对于edit也不行,你必须对edit进行重绘。 你需要对edit也透明么??[/quote] 是的,我想让edit的背景色也统一起来,不知道怎么处理好点
worldy 2013-12-26
  • 打赏
  • 举报
回复
将控件所在位置的背景剪出来一块和控件一样大小的图片,贴到控件中
zyj_604 2013-12-26
  • 打赏
  • 举报
回复
如果做 OnCtlColor 中不绘 EDIT的背景,则背景一直是白色的 但是edit中有时会显示按钮的名字

if(nCtlColor == CTLCOLOR_BTN 
		|| nCtlColor == CTLCOLOR_STATIC)
	{
		pDC->SetTextColor(RGB(0,255,255));
		pDC->SetBkMode(TRANSPARENT);
		return (HBRUSH)GetStockObject(NULL_BRUSH); 
	}
	
	pDC->SetTextColor(RGB(0,0,255));
	pDC->SetBkMode(TRANSPARENT);
	return hbr;
schlafenhamster 2013-12-26
  • 打赏
  • 举报
回复
"对话框里控件的透明" 0分 http://download.csdn.net/detail/schlafenhamster/6541179 “一个不常见的 使 对话框 中 控件 透明的 方法。 通过 CreatePatternBrush 产生一个 背景画刷,对话框和 所有透明控件都使用这个 画刷,非常 简单 有效的 方法。”
信阳毛尖 2013-12-26
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
将控件所在位置的背景剪出来一块和控件一样大小的图片,贴到控件中
楼上说的对。 像static、radio等可以,但系统的edit是不能这样的。因为你的背景不是纯色的,即使是纯色的,貌似对于edit也不行,你必须对edit进行重绘。 你需要对edit也透明么??

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧