您的位置:首页 > 其它

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

2010-09-21 19:40 746 查看
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)

=========================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: