VC 如何获取一个控件内的字体

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC 如何获取一个控件内的字体相关的知识,希望对你有一定的参考价值。

我在对话框上放了一个RichText控件,在打开字体对话框的时候,能自动获取该控件的字体,并显示!我该如何做呢?

呵呵,你的问题我前一阵子都遇到过。你是不是要在一个Dialog里放一个RichEdit和一个Button,点击这个Button弹出CFontDialog对话框?这样的话你可以在这个Button的单击事件里这样写,基本上跟“风火石”的差不多。
void CMyClass::OnButtonFont()

CHARFORMAT cf;
LOGFONT lf;
memset(&cf, 0, sizeof(CHARFORMAT));
memset(&lf, 0, sizeof(LOGFONT));
myRichEdit.GetDefaultCharFormat(cf);
//得到相关字体属性
BOOL bIsBold = cf.dwEffects & CFE_BOLD;
BOOL bIsItalic = cf.dwEffects & CFE_ITALIC;
BOOL bIsUnderline = cf.dwEffects & CFE_UNDERLINE;
BOOL bIsStrickout = cf.dwEffects & CFE_STRIKEOUT;
//设置属性
lf.lfCharSet = cf.bCharSet;
lf.lfHeight = cf.yHeight/15;
lf.lfPitchAndFamily = cf.bPitchAndFamily;
lf.lfItalic = bIsItalic;
lf.lfWeight = (bIsBold ? FW_BOLD : FW_NORMAL);
lf.lfUnderline = bIsUnderline;
lf.lfStrikeOut = bIsStrickout;
strcpy(lf.lfFaceName, cf.szFaceName);

CFontDialog dlg(&lf);
dlg.m_cf.rgbColors = cf.crTextColor;
//以上就是自动获得RichEdit字体属性,并且打开字体对话框时照此初始化
if (dlg.DoModal() == IDOK)

//获得所选的字体属性,如字体、颜色、大小等
dlg.GetCharFormat(cf);

//设置输入框内所有字符的字体,包括已经输入的和将要输入的字符
myRichEdit.SetDefaultCharFormat(cf);
//如果要为选中的内容或者将要输入的内容设置字体,就参考“风火石”的答案

参考技术A void CMyRichEdit::OnSelectfont()

// TODO: Add your command handler code here
CHARFORMAT cf;
LOGFONT lf;
memset(&cf, 0, sizeof(CHARFORMAT));
memset(&lf, 0, sizeof(LOGFONT));
//判断是否选择了内容
BOOL m_bSelect = (GetSelectionType() != SEL_EMPTY) ? TRUE : FALSE;
if (m_bSelect)

GetSelectionCharFormat(cf);

else

GetDefaultCharFormat(cf);

//得到相关字体属性
BOOL bIsBold = cf.dwEffects & CFE_BOLD;
BOOL bIsItalic = cf.dwEffects & CFE_ITALIC;
BOOL bIsUnderline = cf.dwEffects & CFE_UNDERLINE;
BOOL bIsStrickout = cf.dwEffects & CFE_STRIKEOUT;
//设置属性
lf.lfCharSet = cf.bCharSet;
lf.lfHeight = cf.yHeight/15;
lf.lfPitchAndFamily = cf.bPitchAndFamily;
lf.lfItalic = bIsItalic;
lf.lfWeight = (bIsBold ? FW_BOLD : FW_NORMAL);
lf.lfUnderline = bIsUnderline;
lf.lfStrikeOut = bIsStrickout;
sprintf(lf.lfFaceName, cf.szFaceName);

CFontDialog dlg(&lf);
dlg.m_cf.rgbColors = cf.crTextColor;
if (dlg.DoModal() == IDOK)

dlg.GetCharFormat(cf);//获得所选字体的属性
if (m_bSelect)
SetSelectionCharFormat(cf); //为选定的内容设定所选字体
else
SetWordCharFormat(cf); //为将要输入的内容设定字体

参考技术B 你这个问题,我上次在 慧都控件网的技术文档里看到过,现在记不起了,你自己找找吧,这里是地址: http://www.evget.com/zh-CN/Info/List.aspx?key=47 而且最近他们还在搞免费的技术培训活动,你可以去看看,呵呵,免费的在线技术培训,地址是: 参考技术C VC++里的(控件字体)是在背景窗体里设置的,在窗体里有(字体)选项按钮,非常方便实用。

如何改变mfc对话框中的控件中的字体大小

VC的对话框字体设置对所有控件都有效,不能单独地改变某个静态文本的字体。首先用CreateFont来建立一个字体对象,然后调用控件的SetFont。
例子:
1、改静态文体的ID,如:IDC_STATIC1
2、添加一个Edit控件,建立一个关联的控件m_editControl。
3、在OnInitDialog中添加如下代码:
CFont * f;
f = new CFont;
f->CreateFont(16, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_BOLD, // nWeight
TRUE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("Arial")); // lpszFac
m_editControl.SetFont(f);
m_editControl.SetWindowText("问专家");
GetDlgItem(IDC_STATIC1)->SetFont(f);
运行结果如下图所示,下载完整例子 CtrlFont.zip。

需要注意的是,这里使用的是CFont指针,而不是普通的CFont局部变量,如果把程序改成下面这样:
CFont f;
f.CreateFont(16, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_BOLD, // nWeight
TRUE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("Arial"));
m_editControl.SetFont(&f);
m_editControl.SetWindowText("问专家");
GetDlgItem(IDC_STATIC1)->SetFont(&f);
运行后就得不到想要的效果了,因为OnInitDialog函数执行完毕,CFont f就会被清除。必须保证SetFont设置的字体对象在对话框关闭前一直有效。所以通常是使用指针或类成员的方式来保存所建立的字体对象。
非MFC程序,首先用CreateFont来建立一个字体句柄,然后再用SendMessage发给控件WM_SETFONT消息,将建立的字体句柄赋值过去,就可以了。

cHeight是字体的高度。
cWidth是字体的宽度。
cEscapement是字体的倾斜角。
cOrientation是字体的倾斜角。
cWeight是字体的粗细。
bItalic是字体是否斜体。
bUnderline是字体是否有下划线。
bStrikeOut是字体是否有删除线。
iCharSet是字体使用的字符集。
iOutPrecision是指定如何选择合适的字体。
iClipPrecision是用来确定裁剪的精度。
iQuality是怎么样跟选择的字体相符合。
iPitchAndFamily是间距标志和属性标志。
pszFaceName是字体的名称。
CreateFont()函数的MSDN翻译
函数功能:该函数创建一种有特殊性的逻辑字体,此逻辑字体可以在后面被任何设备选择。
函数原型:HFONT CreateFont(int nHeight,
int nWidth,
int nEscapement,
int nOrientation,
int fnWeight,
DWORD fdwltalic,
DWORD fdwUnderline,
DWORD fdwStrikeOut,
DWORD fdwCharSet,
DWORD fdwOutputPrecision,
DWORD fdwClipPrecision,
DWORD fdwQuality,
DWORD fdwPitchAndFamily,
LPCTSTR lpszFace);
参数:
nHeight:指定字体的字符单元或字符的逻辑单位高度,字符的高度值(也被称为em高度)是指字符单元高度值减去内部标头值。字体映射器以如下方式解释nHeight指定的值,各值含义为:
>0:字体映射器转换这个值以设备单位,并和已有字体的单元高度相匹配。
0:字体映射器转换在选择匹配时用一个缺省的高度值。
<0:字体映射器转换这个值到设备单位,并将它的绝对值和已有字体的字符高度相匹配。
比较所有的高度,字体映射器选择不超过要求大小的最大字体。
此映射当字体第一次被使用时发生。
对于MM_TEXT映射方式,可以用下面的公式为一种指定了点大小的字体确定高度:
nHeight=-MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY),72)
nWidth:指定所要求字体的字符的逻辑单位的平均宽度。如果此值为0,字体映射器选择一个closest match值,closest match值是由比较当前设备的特征系数与可使用字体的数字化特征系数之差的绝对值而确定的。
nEscapement:指定移位向量和设备X轴之间的一个角度,以十分之一度为单位。移位向量平行于正文行的基线。
Windows NT:当图形设备设置为GM_ADVANCED时,可以不依赖字符串的字符的定位角而指定字符串的移位角。
当图形模式被设置为GM_COMPATIBLE时,nEscapement同时指定移位角和定位角,可以设置nEscapement和nOrientation为相同的值。
Windows 95:nEscapement同时指定移位角和定位角,可设置nEscapement和nOrientation为相同的值。
nOrientation:指定每个字符的基线和设备X轴之间的角度。
FnWeight:在0到1000之间指定字体的权值,如400表示标准体,700表示黑(粗)体,如果此值为0,则使用缺省的权值。
为方便定义,可使用如下值:
FW_DONTCARE:0;FW_THIN;100;FW_EXTRALIGHT;200;FW_ULTRALIGHT;200;FW_LIGHT;300;
FW_NORMAL:400;FW_REGULAR;400;FW_MEDIUM;500;FW_SEMIBOLD;600;FW_DEMIBOLD;600;
FW_BOLD:700;FW_EXTRABOLD;800;FW_ULTRABOLD;800;FW_HEAVY;900;FW_BLACK;900。
fdwItalic:如果设置为TRUE则指定斜体。
fdwUnderline:如果设置为TRUE,则指定加下划线的字全。
fdwStrikeOut:如果设置为TRUE,则strikeout指定字体。
fdwCharSet:指定字符集,下列值是预定义的:
ANSI_CHARSET; BALTIC_CHARSET; CHINESEBIG5_CHARSET; DEFAULT_CHARSET;
EASTEUROPE_CHARSET; GB2312_CHARSET; GREEK_CHARSET; HANGUL_CHARSET; MAC_CHARSET; OEM_CHARSET; RUSSIAN_CHARSET; SHIFTJIS_CHARSET;
SYMBOL_CHARSET; TURKISH_CHARSET。
韩国Windows:JOHAB_CHARSET;
中东地区Windows:HEBREW_CHARSSET; ARABIC_CHARSET
泰国Windows:THAI_CHARSET
OEM_CHARSET指定的字符集与操作系统有关。
可以使用DEFAULT_CHARSET值来允许字体的名字和大小来充分描述逻辑字体。如果指定的字体名不存在,任何字符集的字体都可以替代指定的字体,所以应该小心地用DEFAULT_CHARSET来避免不期望的结果出现。
操作系统中存在其他字符集的字体。如果一个应用程序用一种未知字符集的字体,则应用程序不会试图去翻译或解释用那种字体写出来的字符串。
在字体映射过程中此参数很重要。为确保获得一致的结果,指定一个特殊的字符集。如果在lpszFace参数中指定了一个字体名,确定fdwCharSet值与由lpszFace指定的字体字符集是否匹配。
fdwOutputPrecision:指定输出精度,输出精度义输出与要求的字体高度、宽度、字符定位、移位、字符间距和字符类型的匹配程序,它可取下列值之一:
OUT_CHARACTER_PRECIS;未用。
OUT_DEFAULT_PRECIS:指定缺省的字体映射器状态。
OUT_DEVICE_PRECIS:指示字体映射器在当系统里有多种字体使用同一个字体使用同一个名字时选择一种设备字体。
OUT_OUTLINE_PRCIS:在Windows NT中此值指示字体映射器从TrueType和其他基于边框的字体中选择。
OUT_RASTER_PRECIS:指示字体映射器在当系统里有多种字体使用同一个名字时选择一种光栅字体。
OUT_STRING_PRECIS:此值没有被字全映射器使用,但是当扫描字体被列举时作为返回值。
OUT_STROKE_PRECIS:在Windows NT中此值没有被字体映射器使用,但是当TrueType字体、其他基于边框的字体和向量字体被列举时,作为返回值。
Windows 95:此值没有被字体映射器使用,但是当TrueType字体或向量字体被列举时,作为返回值。
OUT_TT_ONLY_PRECIS:指示字体映射器仅从TrueType字体中选择,如果系统中没有安装TrueType字体,则字体映射返回缺省状态。、
OUT_TT_PRECIS:指示字体映射器在当系统里有多种同名的字体时选择一种TrueType字体。
当操作系统含有多种与指定名字同名的字体时,应用程序可以使用OUT_DEVICE_PRECIS,OUT_RASTER_PRECIS和OUT_TT_PRECIS值来控制字体映射器如何选择一种字体,例如,如果操作系统含有名字Symbol的光栅和TrueType两种字体,指定OUT_TT_PRECIS使字体映射器选择TrueType方式。指定OUT_TT_ONLY_PRECIS使字体映射器选择一种TrueType字体,尽管这会给TrueType字体换一个名字。
fdwClipPrecision;指定裁剪精度,裁剪精度定义如何裁剪部分超出裁剪区的字符,它可取一个或多个下列值:
CLIP_DEFAULT_PRECIS:指定缺省裁剪状态。CLIP_CHARACTER_PRECIS:未用。
CLIP_STROKE_PRECIS:未被字体映射器使用,但是当光栅字体、向量字体或TrueType字体被列举时作为返回值。在Windows环境下,为保证兼容性,当列举字体时这个值总被返回。
CLIP_MASK:未用。CLIP_EMBEDDED:要使用嵌入式只读字体必须使用此标志。
CLIP_LH_ANGLES:当此值被使用时,所有字体的旋转依赖于坐标系统的定位是朝左的还是朝右的。
如果未使用此值,设备字体总是逆时针方向旋转,但其他字体的旋转依赖于坐标系统的定向。要得到更多关于坐标系统定向的信息,参见参数orientation。
CLIP_TT_ALWAYS:未用。
fdwQuality:指向输出质量,输出质量定义GDI如何仔细地将逻辑字体属性与实际物理字体属性相匹配。它可取下列值之一:
DEFAULT_QUALITY:字体的外观不重要。
DRAFT_QUALITY:字体外观的重要性次于使用PROOF_QUALITY时,对GDI光栅字体,缩放比例是活动的,这意味着多种字体大小可供选择,但质量可能不高,如果有必要,粗体、斜体、下划线、strikeout字体可被综合起来使用。
PROOF_QUALITY:字符质量比精确匹配逻辑字体字体属性更重要。对GDI扫描字体,缩放比例是活动的,并选择最接近的大小。尽管当使用PROOF_QUALITY时,选择字体大小并不完全匹配,但字体的质量很高,并没有外观上的变形。如果有必要,粗体、斜体、下划线、strikeout字体可被综合起来使用。
fdwPitchAndFamily:指定字体间距和字体族,低端二位指定字体的字符间距,它可取下列值之一:
DEFAULT_PITCH;FIXED_PITCH; VARIABLE_PITCH
高端四位指定字体族,可取下列值之一:
FF_DECORATIVE:新奇的字体,如老式英语(Old English)。FF_DONTCARE:不关心或不知道。
FF_MDERN:笔划宽度固定的字体,有或者无衬线。如Pica、Elite和Courier New。
FF_ROMAN:笔划宽度变动的字体,有衬线。如MS Serif。
FF_SCRIPT:设计成看上去象手写体的字体。如Script和Cursive。
FF_SWISS:笔划宽度变动的字体,无斜线。如MS Sans Serif。
参考技术A

在你界面的空白处按回车,就会出来

在这个里面就可以改字体了

参考技术B 在资源视图中选定对话框,按下回车,在弹出的属性对话框中设置字体,为宋体,9号等。

以上是关于VC 如何获取一个控件内的字体的主要内容,如果未能解决你的问题,请参考以下文章

如何获取控件句柄 vc

VC++生成OCX,如何获取其CLSID

vc6.0如何使用getwindowtext函数获取edit控件中的文本内容

Android如何获取TextView的控件宽度以及字体宽度

VC++6.0中如何获取combo box中的文本?

VC TAB控件子对话框如何使用主对话框的成员函数.