VS和MFC编程入门之48字体和文本输出文本输出Word下载.docx
- 文档编号:18391787
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:8
- 大小:27.68KB
VS和MFC编程入门之48字体和文本输出文本输出Word下载.docx
《VS和MFC编程入门之48字体和文本输出文本输出Word下载.docx》由会员分享,可在线阅读,更多相关《VS和MFC编程入门之48字体和文本输出文本输出Word下载.docx(8页珍藏版)》请在冰豆网上搜索。
//字符基线以下的高度
LONGtmInternalLeading;
//由tmHeight成员指定的字符高度顶部的空间
LONGtmExternalLeading;
//行间距
LONGtmAveCharWidth;
//字符的平均宽度
LONGtmMaxCharWidth;
//字符的最大宽度
LONGtmWeight;
//字符的粗度
LONGtmOverhang;
//合成字体间附加的宽度
LONGtmDigitizedAspectX;
//为输出设备设计的x轴尺寸
LONGtmDigitizedAspectY;
//为输出设备设计的y轴尺寸
TCHARtmFirstChar;
//字体中第一个字符值
TCHARtmLastChar;
//字体中最后一个字符值
TCHARtmDefaultChar;
//替换字体中没有的字符
TCHARtmBreakChar;
//作为分隔符的字符
BYTEtmItalic;
//非0则表示字体为斜体
BYTEtmUnderlined;
//非0则表示字体有下划线
BYTEtmStruckOut;
//非0则表示字符带有删除线
BYTEtmPitchAndFamily;
//字体间距和字体族
BYTEtmCharSet;
//字符集
}TEXTMETRIC,*PTEXTMETRIC;
2、格式化文本
格式化文本一般包括两种,一种是确定文本行中后续文本的位置,另一种是确定换行时下一行文本的位置。
确定后续文本的位置
一般我们可以先获取当前字符串的宽度,根据此宽度确定文本行中后续文本的位置。
当前字符串的宽度可以通过API函数GetTextExtentPoint32获得。
GetTextExtentPoint32函数的原型如下:
BOOLGetTextExtentPoint32(__inHDChdc,__inLPCTSTRlpString,__inintc,__outLPSIZElpSize);
参数lpString为指向文本字符串缓存的指针,此字符串不是必须以结束符结尾的,因为参数c指定了长度;
参数c为lpString指向的字符串的长度;
参数lpSize为指向SIZE结构体变量的指针,此SIZE结构体变量用于接收字符串的宽度和高度信息。
SIZE结构体定义如下:
typedefstructtagSIZE{
LONGcx;
//宽度
LONGcy;
//高度
}SIZE,*PSIZE;
已知本字符串的起始水平坐标和宽度,两者相加即是后续文本的起始坐标。
确定换行时下一行文本的位置
由GetTextMetrics函数获取了当前字体的信息并存入TEXTMETRIC结构体后,通过计算当前文本行的垂直坐标、当前字体的高度和行间距之和,就可以得到换行时下一行的垂直坐标。
3、执行文本输出操作
最后,通过API函数TextOut执行文本输出操作。
TextOut函数的原型如下:
BOOLTextOut(__inHDChdc,__inintnXStart,__inintnYStart,__inLPCTSTRlpString,__inintcbString);
参数nXStart为起始点x坐标;
参数nYStart为起始点y坐标;
参数lpString为要输出的文本字符串;
参数cbString为字符串中要输出的字符的数量。
当然也可以使用设备上下文类CDC的成员函数TextOut来输出,CDC:
:
TextOut函数的两种重载形式如下:
virtualBOOLTextOut(intx,inty,LPCTSTRlpszString,intnCount);
BOOLTextOut(intx,inty,constCString&
str);
参数x指定文本起始点的x坐标;
参数y指定文本起始点的y坐标;
参数lpszString为要输出的文本字符串;
参数nCount指定字符串中的字节个数;
参数str为包含要输出的字符的CString对象。
字体和文本输出的应用实例
鸡啄米下面给大家演示一个简单的关于字体和文本输出的实例。
功能就是实现两个字符串分别在水平方向和垂直方向上定时滚动。
实现步骤如下:
1、创建一个基于对话框的MFC工程,名字设置为“Example48”。
2、在自动生成的对话框模板IDD_EXAMPLE48_DIALOG中,删除“TODO:
Placedialogcontrolshere.”静态文本框。
3、在Example48Dlg.h文件中为CExample48类添加成员变量:
intm_nTextX;
//水平滚动文本的起始点的x坐标
intm_nTextY;
//垂直滚动文本的起始点的y坐标
CFontm_newFont;
//新字体
CFont*m_pOldFont;
//选择新字体之前的字体
4、在CExample48Dlg类的构造函数中,初始化新添加的成员变量:
CExample48Dlg:
CExample48Dlg(CWnd*pParent/*=NULL*/)
:
CDialogEx(CExample48Dlg:
IDD,pParent)
{
m_hIcon=AfxGetApp()->
LoadIcon(IDR_MAINFRAME);
m_nTextX=260;
m_nTextY=10;
m_pOldFont=NULL;
}
5、在CExample48Dlg对话框初始化函数中,创建新的字体,并开启定时器:
BOOLCExample48Dlg:
OnInitDialog()
CDialogEx:
OnInitDialog();
//Add"
About..."
menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&
0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<
0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
BOOLbNameValid;
CStringstrAboutMenu;
bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if(!
strAboutMenu.IsEmpty())
pSysMenu->
AppendMenu(MF_SEPARATOR);
AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'
smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);
//Setbigicon
SetIcon(m_hIcon,FALSE);
//Setsmallicon
//TODO:
Addextrainitializationhere
//创建一种新的字体(18点,隶书)
m_newFont.CreatePointFont(180,_T("
隶书"
));
//设置定时器,定时时间为200ms
SetTimer(1,200,NULL);
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
6、修改CExample48Dlg:
OnPaint()函数,如果窗口没有最小化就在指定的位置输出文本,即在OnPaint函数中if(IsIconic())对应的else大括号内添加相应代码。
OnPaint()函数修改如下:
voidCExample48Dlg:
OnPaint()
if(IsIconic())
CPaintDCdc(this);
//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,reinterpret_cast<
WPARAM>
(dc.GetSafeHdc()),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&
rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
else
//设置m_newFont对象的字体为当前字体,并将之前的字体指针保存到m_pOldFont
m_pOldFont=(CFont*)dc.SelectObject(&
m_newFont);
//设置
dc.SetBkMode(TRANSPARENT);
//设置背景为透明!
//设置文本颜色为红色
dc.SetTextColor(RGB(255,0,0));
//在指定位置输出文本
dc.TextOut(m_nTextX,10,_T("
欢迎来到鸡啄米!
"
//设置文本颜色为绿色
dc.SetTextColor(RGB(0,255,0));
dc.TextOut(10,m_nTextY,_T("
谢谢关注"
//恢复以前的字体
dc.SelectObject(m_pOldFont);
OnPaint();
7、在ClassView类视图中找到CExample48Dlg,右键点Properties,显示出其属性页,在属性页工具栏上点击Messages按钮,找到WM_TIMER消息,添加消息响应函数CExample48Dlg:
OnTimer(UINT_PTRnIDEvent),并在此函数中修改两个文本输出的坐标位置。
OnTimer(UINT_PTRnIDEvent)
Addyourmessagehandlercodehereand/orcalldefault
LOGFONTlogFont;
//获取m_newFont字体的LOGFONT结构
m_newFont.GetLogFont(&
logFont);
//将m_nTextX的值减5
m_nTextX-=5;
//如果m_nTextX小于10,则文本“欢迎来到鸡啄米”回到起始位置
if(m_nTextX<
10)
//将m_nTextY的值加一个字符高度
m_nTextY+=abs(logFont.lfHeight);
//如果m_nTextY大于260,则文本“谢谢关注”回到起始位置
if(m_nTextY>
260)
//使窗口客户区无效,之后就会重绘
Invalidate();
OnTimer(nIDEvent);
到这一步,两个文本就可以分别在水平和垂直方向滚动了。
鸡啄米再简单解释下这个过程:
程序刚启动时,会调用OnPaint函数,在初始位置绘出两个文本,然后每次到了定时器的定时时间后,会执行OnTimer函数,修改两个文本的坐标值,并通过Invalidate使窗口重绘,又会重新调用OnPaint函数绘制两个文本。
这样通过定时修改坐标值就实现了两个文本的滚动效果。
8、运行程序,最终的效果如下图:
好了,本节就讲到这里了,最后的实例大家可以自己丰富下它的功能,看看效果。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VS MFC 编程 入门 48 字体 和文 输出 文本