Edit控件中字体、颜色、的局部改变及背景的改变

http://hi.baidu.com/%D0%A1%C2%DF%BC%AD/blog/item/0a988d3965f1112cb9998f38.html

 

=以下来自CSDN、vckbase、百度空间、百度知道=

利用CFontDialog和CColorDialog两个类创建两个对话框,使选择的字体大小、类型和字体的颜色应用到EDIT中


CFontDialog fontDlg;
if (fontDlg.DoModal() == IDOK)
{
// Delete the font object.
this->m_fontTest.DeleteObject();

LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT)); // zero out structure
fontDlg.GetCurrentFont(&lf); // 获得所选字体信息
VERIFY(this->m_fontTest.CreateFontIndirect(&lf));// create the font

// 改变Edit的字体
CEdit*pEdt=(CEdit*)GetDlgItem(IDC_EDIT);
pEdt->SetFont(&this->m_fontTest);

==============================================
if(pWnd->GetDlgCtrlID()==IDC_EDIT1)
{
pDC->SetTextColor(RGB(255,0,0));

}//

===============================================

当然涉及到字就要用到CFont 这个类。查了一下MSDN,有CreateFont, CreateFontIndirect,CreatePointFont

,CreatePointFontIndirect四个函数。

第一种用到CreateFont函数,其中的几个参数MSDN上都介绍的很详细。

cHeight是字体的高度。
cWidth是字体的宽度。
cEscapement是字体的倾斜角。
cOrientation是字体的倾斜角。
cWeight是字体的粗细。
bItalic是字体是否斜体。
bUnderline是字体是否有下划线。
bStrikeOut是字体是否有删除线。
iCharSet是字体使用的字符集。
iOutPrecision是指定如何选择合适的字体。
iClipPrecision是用来确定裁剪的精度。
iQuality是怎么样跟选择的字体相符合。
iPitchAndFamily是间距标志和属性标志。
pszFaceName是字体的名称。

pEdit=(CEdit   *)GetDlgItem(IDC_EDIT1);

CFont   m_Font;

m_Font.CreateFont

(0,0,0,0,100,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_

SWISS,"Arial");

pEdit->SetFont(&m_Font);

m_Font.DeleteObject();

还有一种是用到了 LOGFONT这个类。

LOGFONT只是把CreateFont的一些参数封装为一个类罢了。

pEdit=(CEdit   *)GetDlgItem(IDC_EDIT1);

CFont   m_Font;
LOGFONT fd;

fd.lfWeight=FW_LIGHT;
fd.lfItalic=true;
wsprintf(fd.lfFaceName,_T("%d"),_T("宋体"));

m_Font.CreateFontIndirect(&fs);
pEdit->SetFont(&m_Font);
GetDlgItem(IDC_STATIC)->SetFont(&m_Font);
m_Font.DeleteObject();

========================================================

如何在EDITBOX控件中使用背景位图
作者:zhoudb

下载本文源代码

在VC中,标准的WINDOWS控件如TREEVIEW,EDITBOX,COMBOBOX和LISTBOX等控件都不支持选择背景位图的属性,所以如果 要使这些标准控件达到这种效果,必须有些非常规的方法。本文介绍一个CEDIT类如何实现背景位图,并且可以更换背景的例子。可能实现的方法还有其它种, 如果有兴趣可以大家探讨。


本文程序运行效果图

下面介绍CMYEDITCTRL类几个关键变量和函数。

第一步在该类中增加几个变量;

public:
 CBitmap m_bmp;
protected:
 CBrush m_brHollow;
 CBitmap *m_pbmCurrent;

第二步 重载部分函数:

afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnChange();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);

各个函数的具体作用:

2.1 OnChange();
如果没有这个函数,你敲几个字符如 ABCDEDFG,然后删除两个FG,但是EDITBOX并未更新。添加这个函数主要是这个原因。

void CMyEditCtrl::OnChange() 
{
 Invalidate(); ///强制进行更新
}

2.2 OnLButtonUp();
也类似,是你鼠标选择时候的刷新问题,如果你有兴趣,可以先把它注释掉,看看BUG是怎么出现的。

void CMyEditCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
{
 Invalidate(); ///强制进行更新
 CEdit::OnLButtonUp(nFlags, point);
}

2.3 CtlColor(CDC* pDC, UINT nCtlColor)
一般的文字的默认背底是白色的,这儿选择了透明的形式,所以底图可以显示。

HBRUSH CMyEditCtrl::CtlColor(CDC* pDC, UINT nCtlColor) 
{
 pDC->SetBkMode(TRANSPARENT); ///选择透明背景模式
 pDC->SetTextColor(RGB(0xff,0xff,0xff)); ///设置文字颜色为白色
 return m_brHollow;
}

2.4 OnEraseBkgnd(CDC* pDC)
主要把选好的背景位图显示出来。

BOOL CMyEditCtrl::OnEraseBkgnd(CDC* pDC) 
{
 BITMAP bm;
 m_bmp.GetBitmap(&bm);
 m_pbmCurrent = &m_bmp;
 CDC dcMem;
 dcMem.CreateCompatibleDC(pDC);
 CBitmap* pOldBitmap = dcMem.SelectObject(m_pbmCurrent);  ///选择位图
 pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcMem,0,0,SRCCOPY);  ///画出位图
 dcMem.SelectObject(pOldBitmap);
    return TRUE; 
}

说明:其中代码有些部分简化了,有些部分还可以优化。对于底图的选择,在这里我选择是与我EDITBOX一样大小的底图,如果两者不一样大小,需要修改部分OnEraseBkgnd(CDC* pDC)代码。
基本上这个类的功能就这样实现了。
如果有兴趣和我一起探讨这个问题,可以发信到zdibin2000@sohu.com

 

 

 

 

sss:XP下面可以么?不行,看看吧
(发表于2002-7-23 9:31:00)

wwb8081:不能实现,有问题!
(发表于2002-7-24 15:47:00)

devouer:其实不用这么麻烦,只要在CTLCOLOR返回的刷子是一个位图模式刷子就可以了。
(发表于2002-7-24 15:49:00)

victor:It's no use in xp system
(发表于2002-8-2 15:52:00)

OpenGL:不错,把MSDN例子里的黄色背景的Edit Control改成以位图为背景的。不过您在发表前应该说明参考的文献,否则就有抄袭之嫌了。
(发表于2002-11-17 11:09:00)

yxj:为什么在XP底下不行呢?XP底下该怎么作?
(发表于2003-4-1 18:29:00)

aiying:如果下面放一副位图的话,背景闪烁的很厉害,怎么处理?
清高手赐教
(发表于2003-5-21 17:52:00)

zzm_china:我使用create在对话框动态创建的edit后,同样的方法却无法正确显示背景图,现象是位图被edit默认背景颜色覆盖了,请大家给我好的建议
(发表于2003-6-13 11:08:00)

zygjkl:偶在装有VC++的机器上运行正常,在没有装VC++的机器上运行不正常!郁闷的很!请问有何良策??? 偶觉得问题出在SetBkMode(TRANSPARENT)上,但不知怎么解决???
(发表于2005-6-15 16:55:00)

晶晶:如果问题出在SetBkMode(TRANSPARENT)上,你这样试试:
::SetBkMode(pDC->GetSafeHdc(),TRANSPARENT);
但我才应该是MFC库的问题。因为VC开发的程序会大量使用mfc**.dll
(发表于2005-6-23 14:53:00)

zygjkl:特别要感谢上边这位大侠!!! 要是有空余时间,还是希望更多的“好心人”能探讨下面问题:
我用vc 6.0工具 “Depends”查出的所有*.dll 拷贝到目标机上,用::SetBkMode(pDC->GetSafeHdc(),TRANSPARENT);试了还是不行啊!
我在Windows xp 下,用vc++ 7 做了一个测试(和上面介绍的方法一样)。运行很正常,效果也很好! 可是放Windows2000下,EDITBOX控件却显示白条, 覆盖了背景位图。好象pDC->SetBkMode(TRANSPARENT)失去了作用。 很奇怪! 不知为什么? 也不知怎么解决? 特请赐教!!!但是,不用位图作背景,而是用SetBackColor()来设置一种背景色却可以,奇怪的很???

说明:windows2000Pro 安装了vc6.0的可以,windows2000Server 安装了vc6.0的不可以;
       windowsXp 没有安装vc的也不可以;
       windows2003 没有安装vc的也不可以;
注意:"不可以" 是指 "EDITBOX控件显示白条",能够正常运行!

(发表于2005-6-29 10:25:00)

zygjkl:特别要感谢上边这位大侠!!! 要是有空余时间,还是希望更多的“好心人”能探讨下面问题:
我用vc 6.0工具 “Depends”查出的所有*.dll 拷贝到目标机上,用::SetBkMode(pDC->GetSafeHdc(),TRANSPARENT);试了还是不行啊!
我在Windows xp 下,用vc++ 7 做了一个测试(和上面介绍的方法一样)。运行很正常,效果也很好! 可是放Windows2000下,EDITBOX控件却显示白条, 覆盖了背景位图。好象pDC->SetBkMode(TRANSPARENT)失去了作用。 很奇怪! 不知为什么? 也不知怎么解决? 特请赐教!!!但是,不用位图作背景,而是用SetBackColor()来设置一种背景色却可以,奇怪的很???

说明:windows2000Pro 安装了vc6.0的可以,windows2000Server 安装了vc6.0的不可以;
       windowsXp 没有安装vc的也不可以;
       windows2003 没有安装vc的也不可以;
注意:"不可以" 是指 "EDITBOX控件显示白条",能够正常运行!

(发表于2005-6-29 10:25:00)

风之:各位仁兄,小弟偶识这个技术,下了一个zip。
经过一夜专研,小有收获:)
  在VC6.0+winxp下,程序运行时确实 "EDITBOX控件显示白条",但只要把EDITBOX控件的属性MultiLine选定,一切OK!另外,尚未发现LButtonUp消息在此环境下有何Bug。
  希望与大家交流!
(发表于2005-8-14 1:07:00)

dengting:有白条是因为没有调用CtrlColor,跟什么DLL没关系,MFC不存在这么麻烦的问题.
(发表于2007-9-19 16:47:00)

dengting:跟MultiLine没关系
确认控件的父窗体的CtrlColor没有被禁止掉。
(发表于2007-9-19 16:48:00)

=========================================

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值