关于编辑框的透明背景

wshdnss 2010-07-19 09:51:44
遇到一个很棘手的问题,怎么样能将编辑框的背景设置为透明,使得编辑框中显示的是对话框的背景图片。
哪位牛人能够给个思路啊!谢谢大家了啊!
...全文
1122 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyx100 2011-02-04
  • 打赏
  • 举报
回复
上面的消息要手动添加
  • 打赏
  • 举报
回复
如果仅仅是为整个窗体客户区铺背景的话,直接在CMyEdit::CtlColor方法中返回一个画刷就行了。

CEdit是控件,所以药用反射消息ON_CTLCOLOR_REFLECT
wshdnss 2010-07-23
  • 打赏
  • 举报
回复
关键是这个画刷填充的编辑框区域得和对话框的背景图完全衔接,以便取得编辑框透明的效果!
也就是说画刷里面的位图最好能够使对话框的背景位图中编辑框所覆盖的那一部分。
wshdnss 2010-07-22
  • 打赏
  • 举报
回复
有个很严重的问题,要显示对话框的背景,那么编辑框不能单纯的将对话框的背景图拉伸压缩后贴上,而需要截取大小正好匹配编辑框的那一部分位图贴上,哪位仁兄知道如何实现这个功能啊?
先谢谢大家了!
wshdnss 2010-07-22
  • 打赏
  • 举报
回复
改了一下代码,能编译和运行了,但是没有任何效果。。。。。。。
跪求解答!
BOOL CMyEdit::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CBitmap * pBitmap =&m_bmp ;//父窗口的背景位图
RECT cRect;
GetClientRect(&cRect);//子窗口需刷新的区域
POINT rp;
//rp.x=0;
//rp.y=0;
//pDC->SetBrushOrg(rp);//如果是位图刷子,则还需要调整画布的刷子原点偏移确保无缝
CBrush pbrush;
pbrush.CreatePatternBrush(pBitmap);
pDC->FillRect( &cRect, &pbrush);
DeleteObject(pbrush);

return TRUE;
}
wshdnss 2010-07-22
  • 打赏
  • 举报
回复
我貌似试过,也不行,待会再去试下。
还有就是那个返回空画刷的办法是行不通的。

我在CMyEdit派生类的构造函数里面创建空画刷,然后在CTLCOLOR()里面返回这个空画刷,但是编辑框的背景居然是黑色的。。。。。。。
  • 打赏
  • 举报
回复
CBitmap pBitmap =m_bmp ;//父窗口的背景位图
是否应该是CBitmap* pBitmap = &m_bmp ;

CObject的拷贝构造函数是非公有的,所以其子类都不能进行赋值操作。
wshdnss 2010-07-22
  • 打赏
  • 举报
回复
我写了一段代码来实现23楼的方法。
这是派生类中的背景重画函数
BOOL CMyEdit::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CBitmap pBitmap =m_bmp ;//父窗口的背景位图


RECT cRect;
GetClientRect(&cRect);//子窗口需刷新的区域

POINT rp;
rp.x=5;
rp.y=5;

pDC->SetBrushOrg(rp);//如果是位图刷子,则还需要调整画布的刷子原点偏移确保无缝
CBrush * pbrush;

pbrush->CreatePatternBrush(&pBitmap);


pDC->FillRect( &cRect, pbrush);

DeleteObject(pbrush);

/* pDC->SetBurshOrg(rp );*///还原画布的刷子偏移

return TRUE;
}

这是派生类的CTLCOLOR()函数:
HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: Change any attributes of the DC here


// TODO: Return a non-NULL brush if the parent's handler should not be called
pDC->SetBkMode(TRANSPARENT);
//pDC->SetTextColor(RGB(0,0,0));
m_brHollow.CreateStockObject(HOLLOW_BRUSH);
return m_brHollow;

}



这是调用类对象的对话框的初始化:
BOOL CtoumingDlg::OnInitDialog()
{
CDialog::OnInitDialog();

.................................若干代码

m_MyEdit.m_brHollow.CreateStockObject(HOLLOW_BRUSH);
m_MyEdit.m_bmp.LoadBitmap(IDB_BITMAP1);

}

error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject'
c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h(553) : see declaration of 'CObject::CObject'
c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h(524) : see declaration of 'CObject'
This diagnostic occurred in the compiler generated function 'CGdiObject::CGdiObject(const CGdiObject &)'

但是最终报错。。。。
不知道是什么原因。。。





  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wltg2001 的回复:]
我试验的结果,响应WM_CTLCOLOR消息,用pDC->SetBkMode(TRANSPARENT);的方法不行。
[/Quote]

这句是设置文字背景,文字本身是有背景的。1L的方法关键在于返回的那个空画刷!
你们在好好看看吧:)
wshdnss 2010-07-20
  • 打赏
  • 举报
回复
23楼的办法貌似可以试一下!明天试下再说!在这里谢谢大家关心了啊!
jin_yan 2010-07-20
  • 打赏
  • 举报
回复
只能模拟透明,要做到真透明是很困难的:http://blog.sina.com.cn/s/blog_4c3538470100ezhu.html
hankcs 2010-07-20
  • 打赏
  • 举报
回复
在messagemap里面添加映射
dvlinker 2010-07-20
  • 打赏
  • 举报
回复
好贴,得顶一个~
Eleven 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 wshdnss 的回复:]
我用的是VS2005,怎么样手动添加消息呢?具体在哪里操作?
[/Quote]
照着向导加
wshdnss 2010-07-20
  • 打赏
  • 举报
回复
我用的是VS2005,怎么样手动添加消息呢?具体在哪里操作?
wshdnss 2010-07-20
  • 打赏
  • 举报
回复
10楼很明白我的意思。。。。。。。
hankcs 2010-07-20
  • 打赏
  • 举报
回复
上面的消息要手动添加
wshdnss 2010-07-20
  • 打赏
  • 举报
回复
非常感谢部长的帮助!当然还有其他几位哥们!

有个问题。。。
我在我派生类里面的消息栏怎么找不着=WM_CTLCOLOR消息。。。
还有EN_CHANGE消息也没有。。。。
yanganglove 2010-07-20
  • 打赏
  • 举报
回复
关于CEdit控件的透明
作者:monsoon

---前几天和风在这里讨论关于CEdit控件的透明问题。主要的目的就是要做一个有图形背景的Edit控件,经过一番努,终于做出了一个还算象样的Edit控件。
做一个透明的Edit控件的主要问题是字符的输出,在Edit里输出的刷新有几个时机,一个是在接收到键盘或鼠标消息的时候 ,还有就是在接收到WM_PAINT消息。刷新的时候也不是全部重画,所以想通过在继承的Edit类中处理WM_PAINT消息是行不通的。但是Edit控件自己总是知道怎么去刷新,因此只要给控件发消息,让其自己来刷新就可以了。通过使用spy++的得知需要刷新有几个时机,一个是按键的时候,内容变化,另一个是选择变化的时候,前者Edit控件会接收到GetCtlCode和KeyUp 消息,后者会接收到GetCtlCode和CaptureChange消息或KeyUp消息,因此在GetCtlCode里调用ReDrawWindow来强迫Edit刷新 整个控件。在ReDrawWindow中通过使用参数RDW_ERASE可以使控件重画背景,即调用OnEraseBkgnd(CDC* pDC),在该函数中重 画背景。比较特殊的情况是按住鼠标左键并来回拖动鼠标的时候,这时候选择要改变,接收的消息是MouseMove,为了正 确响应也要处理该消息,但是在每一个MouseMove中都刷新显示的开销太大,而且不可避免地有闪烁感,因此只有在鼠标左 键按下的时候才刷新显示。
大概的代码如下,主要是继承了一个CEdit的对象CTpEdit,使用的时候可以动态创建,或者采用SubClass的方法。我用的是后者。
class CTESTDLG : public CDialog
{
......
//声明一个CTpEdit的成员变量
private:
CTpEdit m_tpedit;
};

//在OnInitDialog中Subclass对话框模板中的Edit控件
BOOL CTESTDLG::OnInitDialog()
{
CDialog::OnInitDialog();
m_tpedit.SubclassDlgItem(IDC_EDIT,this);
return TRUE;
}

//在OnCtlColor中设置背景的透明,要改变Edit控件字体的颜色也在这里

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

if((nCtlColor == CTLCOLOR_EDIT) && (pWnd->GetDlgCtrlID()==IDC_EDIT))
{
pDC->SetBkMode(TRANSPARENT); //设置背景透明,这样,输出字符的时候就
//是所谓的空心字,而不是有白的底色
pDC->SetTextColor(RGB(255,0,0)); //改变字体的颜色
return HBRUSH(GetStockObject(HOLLOW_BRUSH));
}

return hbr;
}

//CTpEdit对象

class CTpEdit : public CEdit
{
public:
//m_mousedown用来记录鼠标左键是否按下
BOOL m_mousedown;
protected:
//响应如下的消息
//{{AFX_MSG(CTpEdit)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg UINT OnGetDlgCode();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

//CTpEdit的消息响应函数如下
//画背景图
BOOL CTpEdit::OnEraseBkgnd(CDC* pDC)
{
//得到Edit控件的外框,即背景区域
RECT updatarect;
GetClientRect(&updatarect);
//画背景,我画的是一个黄色的矩形
CBrush newBrush;
newBrush.CreateSolidBrush(RGB(255,255,200));
CBrush * oldBrush = pDC->SelectObject(&newBrush);
pDC->Rectangle(&updatarect);
pDC->SelectObject(oldBrush);
return TRUE;
}

//强迫Edit控件擦除背景,重写字符
UINT CTpEdit::OnGetDlgCode()
{ RedrawWindow(NULL, NULL,RDW_INVALIDATE | RDW_ERASE );
return CEdit::OnGetDlgCode();
}
//记录鼠标左键是否按下
void CTpEdit::OnLButtonDown(UINT nFlags, CPoint point)
{
m_mousedown = TRUE;
SetCapture();
CEdit::OnLButtonDown(nFlags, point);
}

void CTpEdit::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_mousedown)
ReleaseCapture();
m_mousedown = FALSE;
CEdit::OnLButtonUp(nFlags, point);
}

//如果左键按下并且拖动鼠标就要刷新显示
void CTpEdit::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_mousedown)
RedrawWindow(NULL, NULL,RDW_INVALIDATE | RDW_ERASE );
CEdit::OnMouseMove(nFlags, point);
}
//初始化成员变量
CTpEdit::CTpEdit()
{
m_mousedown=FALSE;
}
wltg2001 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 visualeleven 的回复:]
WM_EARSEBKGND消息里贴背景图,在反射消息=WM_CTLCOLOR中设置背景色透明,WM_VSCROLL消息里强制刷新文本框区域。。。
[/Quote]
部长有没有考虑过,EDIT的图和对话框的图是不是搭配的问题呢?
pDC->StretchBlt(0, 0, rc.Width(), rc.Height(), &memDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY)
贴图恐怕不能整个的贴上去,可以先看一下EDIT的位置,得出EDIT的背景处于对话框背景的具体位置,然后贴出这矩形区的图应该可以。
加载更多回复(13)
项目名称:高仿QQ2013通讯DEMO-10.30更新 版本号:10.30 最新版本 下载内容: (C#)CC2013局域网通讯源码一份, 可引用至工具箱最新版CSkin.dll-10.30版本界面库一份。 界面库更新说明: CC2013-10.30 1.由于SkinForm名字太多人使用,界面库命名正式改为CSkin.dll,官网www.cskin.net。 2.SkinTabControl标签中添加菜单箭头,可点击展开菜单。 3.SkinTabControl添加标签关闭按钮。 4.修复部分中文乱码问题。 5.优化好友列表右键菜单。 6.将窗体自定义系统按钮改为集合模式,可添加无数个自定义系统按钮。自定义系统按钮事件中可以 e.参数 来判断。 7.增加360安全卫士-DEMO案例。 8.增加SkinAnimatorImg控件,用于支持位图动画的播放。如360的动态logo。 9.各种细节BUG优化。 CC2013-10.11 1.添加SkinTabControlEx,加入更加自定义的美化属性和动画效果。 2.添加SkinAnimator,通用动画控件。 3.添加Html编辑器控件 4.修复SkinButton图标和文本相对位置的BUG CC2013-9.26 1.优化好友列表CPU占用 2.好友列表加入好友登录平台属性:安卓 苹果 WEBQQ PC 3.优化标题绘制模式,新添标题绘制模式属性。 4.新添标题偏移度属性。 5.加入圆形进度条控件:ProgressIndicator。 CC2013-9.5.2 1.优化截图控件,截图工具栏加入新功能。 2.解决个人信息卡和天气窗体显示后不会消失的问题。 3.各种细节BUG优化。 CC2013-9.5.1 1.解决贴边左右隐藏的BUG。 2.解决窗体点击事件不能触发的问题。 3.优化SkinButton继承父容器背景色的代码。 4.解决SkinButton异常错误。 CC2013-9.3 1.好友列表右键菜单没反应问题。 2.新增美化控件SkinDatagridview。 3.密码软件盘回删不了文字问题。 4.双击窗体最大化,最大化后再双击恢复原大小,(win7)。 5.部分细节调优。 实现功能: 1.界面库中多达25个自定义换肤控件,让每个控件设设属性就能达到你想要的效果,支持图片换肤和色调绘制。 2.四边阴影,毛边效果,可以设置阴影宽度和阴影颜色,支持所有系统。 3.拥有密码键盘输入,防护更贴心。 4.8种圆角窗体模式供你选择,淋漓尽致,润滑如圆。 5.登录主界面后,有登陆提示窗,提示上次登录的城市和时间。 6.皮肤随心变:拖动任意一张图片至主界面,就可以改变皮肤。 7.皮肤色调获取:改变皮肤的同时,将计算图片色调,再将其运用到窗体背景色。 8.皮肤尾部渐变:上下左右方均可实现,渐变皮肤。 9.皮肤拖拉方向:可以选择皮肤在拉伸的时候,粘着哪一边拖拉。 10.GDI+界面重绘,处理消息机制,3种移动模式和拉伸是否启用只需要设置一个属性的事就可以解决。 11.界面渐变闪现和闪退:不再像平凡的突然出现,采用API渐变机制,渐渐出现和消失,win7系统下还有动态缩小至任务的效果。 12.完美好友列表,可添加上千好友,不卡不掉线,还可以拖动好友到其他分组。 13.好友悬浮至头像可以查看详细资料卡。 14.窗口可调渐变后透明度:让窗体看起来更像是Vista玻璃窗体风格。 15.聊天窗口可发送图片,大文件,表情,还有震动。 16.按钮控件背景色拥有继承窗体背景主色调的功能,让整体色调保持一致。 17.更是有和如出一辙的扣扣截图。仿真度也达到100%,完美修复所有已知BUG。 18.聊天窗口,可以调字体颜色和字体样式等多项功能。 20.SkinLabel与SkinButton控件字体与窗体标题可以根据背景色暗亮度自动调节字体为黑还是白。 21.MessageBox提示框的美化,并继承调用窗口的色调与背景,MessageBox可所谓已达到帅气的不能再帅气的境界了。 22.天气皮肤自动变,所有窗体根据当地天气自动决定皮肤背景,CC最帅气功能之一。 23.个人资料卡及聊天窗体拥有动态CC秀展示。 24.主界面拖动换肤的同时,所关联的子窗体皮肤也会跟着变。 25.多线程大文件传输功能,支持无上限大文件传输,有进度条显示进程度。 26.界面库已封装了大图取主色调,颜色判断暗亮等多项功能。 27.如果你觉得获取天气让你的登录太慢不想要的话,注释相关调用方法即可快速登录。 界面库交流群:306485590 本人QQ:345015918 注意: Demo版不包括更新,为方便用户查看和使用属性等方法,dll只轻微加密。想反编译的就不要尝试了,里面有上百个类,改错改到你哭。 介意购买正版,永久更新配源码。 看截图或者想购买商业版的用户请访问以下地址: http://www.51aspx.com/code/TotalLikeQQ2013 特权:购买商业版的用户,有权利享有最快的更新服务,第一时间将最新版本的dll源码送到你手上。 使本项目源码或本项目生成的DLL前请仔细阅读以下协议内容,如果你同意以下协议才能使用本项目所有的功能,否则如果你违反了以下协议,有可能陷入法律纠纷和赔偿,作者保留追究法律责任的权利。 1、你可以在开发的软件产品中使用和修改本项目的源码和DLL,但是请保留所有相关的版权信息。 2、不能将本项目源码与作者的其他项目整合作为一个单独的软件售卖给他人使用。 3、不能传播本项目的源码和DLL,包括上传到网上、拷贝给他人等方式。 4、以上协议暂时定制,由于还不完善,作者保留以后修改协议的权利。 时间:2013-7-5 作者: 乔克斯 请保留以上版权信息,否则作者将保留追究法律责任。

15,979

社区成员

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

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