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)代码。
基本上这个类的功能就这样实现了。
如果有兴趣和我一起探讨这个问题,可以发信到[email protected]
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)
=========================================