已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中国人自古就有自右至左、从上到下书写汉字的习惯。而当我们在自己所编写的应用程序中使用输出函数输出的总是自左至右的横排文字。有没有可能在我们的应用程序中实现竖写汉字的效果呢?笔者偶然发现了一种利用VC实现竖写汉字效果的方法,现在就把它介绍给大家。Windows系统内置了许多名称以“”开头的字集,这些字集有一个共同的特点,即其所包含的文字全都是平躺着的(字头朝左,字底朝右)。如果我们能将这些字逆时针旋转270度后再显示出来,就可以达到实现竖写汉字效果的目的了。要使文字发生旋转,我们只需创建一个逻辑字体并设定该逻辑字体的显示角度,再设定其字体名称为一个以“”开头的字集的名称即可。我们可以采用两种方式创建逻辑字体。其一,用CFont类的成员函数CreateFont直接创建逻辑字体。CreateFont的参数定义如下: BOOL CreateFont( int nHeight, /字体的高度 int nWidth, /字体的宽度 int nEscapement, /字体显示的角度 int nOrientation, /字体的角度 int nWeight, /字体的磅数 BYTE bItalic, /斜体字体 BYTE bUnderline, /带下划线的字体 BYTE cStrikeOut, /带删除线的字体 BYTE nCharSet, /所需的字符集 BYTE nOutPrecision, /输出的精度 BYTE nClipPrecision, /裁减的精度 BYTE nQuality, /逻辑字体与输出设备的实际 /字体之间的精度 BYTE nPitchAndFamily, /字体间距和字体集 LPCTSTR lpszFacename /字体名称 );其中nEscapement单位为0.1角度,方向为逆时针,所以为了使平躺的字立起来应设定其值为2700,lpszFacename则赋以“”开头的字集的名称,如“system”。其二,利用LOGFONT结构,将该结构作为参数调用CFont类的成员函数CreateFontIndirect创建逻辑字体。LOGFONT结构通常被用来描述一种逻辑字体,结构内的各变量分别代表逻辑字体的各个属性,这些变量与函数CreateFont的参数相同。其结构如下: typedef struct tagLOGFONT / lfLONG lfHeight; /字体的高度LONG lfWidth; /字体的宽度LONG lfEscapement; /字体显示的角度LONG lfOrientation; /字体的角度LONG lfWeight; /字体的磅数BYTE lfItalic; /斜体字体BYTE lfUnderline; /带下划线的字体BYTE lfStrikeOut; /带删除线的字体BYTE lfCharSet; /所需的字符集BYTE lfOutPrecision; /输出的精度BYTE lfClipPrecision; /裁减的精度BYTE lfQuality; /逻辑字体与输出设备的 /实际字体之间的精度BYTE lfPitchAndFamily; /字体间距和字体集TCHAR lfFaceNameLF_FACESIZE; /字体名称 LOGFONT;下面我们就以一个示例来说明竖写汉字的实现方法:1.建立一个MFC AppWizard(exe)应用工程CHNfont。在MFC AppWizard向导的第一步中选择Single Document,再点击按键Finish-OK完成工程的建立。2.在CMainFrame:OnCreate函数中添加如下代码,使窗体最大化。AfxGetMainWnd()-ShowWindow(SW_SHOWMAXIMIZED);3.添加如下代码实现竖写功能。 void CChildView:OnPaint() CPaintDC dc(this);/ device context for painting / 利用CFont:CreateFont(.)函数实现竖写汉字/ CFont myFont; /创建字体对象 /创建逻辑字体 myFont.CreateFont(56, /字体高度(旋转后的字体宽度)=5620, /字体宽度(旋转后的字体高度)=202700, /字体显示角度=2700, /nOrientation=010, /字体磅数=10FALSE, /非斜体FALSE, /无下划线FALSE, /无删除线DEFAULT_CHARSET, /使用缺省字符集OUT_DEFAULT_PRECIS, /缺省输出精度CLIP_DEFAULT_PRECIS,/缺省裁减精度DEFAULT_QUALITY, /nQuality=缺省值DEFAULT_PITCH, /nPitchAndFamily=缺省值system); /字体名=system CFont *pOldFont=dc.SelectObject(&myFont);/选入设备描述表 CRect rtClient; GetClientRect(rtClient); /获取客户区尺寸、位置信息 /在客户区适当位置输出文字 dc.TextOut(rtClient.Width()/2+30,rtClient.Height()/8, 无边落木萧萧下); dc.SelectObject(pOldFont); /将myFont从设备环境中分离 myFont.DeleteObject(); /删除myFont对象 / 利用LOGFONT结构实现竖写汉字/ LOGFONT lf; /定义字体结构 lf.lfWeight=10; /字体磅数=10 lf.lfHeight=56; /字体高度(旋转后的字体宽度)=56 lf.lfWidth=20; /字体宽度(旋转后的字体高度)=20 lf.lfUnderline=FALSE; /无下划线 lf.lfStrikeOut=FALSE; /无删除线 lf.lfItalic=FALSE; /非斜体 lf.lfEscapement=2700; /字体显示角度=270 lf.lfCharSet=DEFAULT_CHARSET; /使用缺省字符集 strcpy(lf.lfFaceName,system); /字体名=system CFont myLogFont; /定义字体对象 myLogFont.CreateFontIndirect(&lf); /创建逻辑字体 pOldFont=dc.SelectObject(&myLogFont);/选入设备描述表 /在客户区适当位置输出文字 dc.TextOut(rtClient.Width()/2-30,rtClient.Height()/8, 不尽长江滚滚来); dc.SelectObject(pOldFont); /将myFont从设备环境中分离 myLogFont.DeleteObject(); /删除myLogFont对象 4.编译连接,运行。或者 CString m_text; CSize sz = pdc-GetTextExtent(效); CRect rtCal; /要输出字符串的矩形区域。其宽度稍大于字符宽度。 rtCal.Width = sz.cx 2; int midhei=pDC-DrawText(m_text,&rtCal,flag | DT_CALCRECT | DT_WORDBREAK| DT_NOCLIP);或者只是简单的用: for (i=0;iTextOut(10,y,m_Text.GetAt(i); y+= sz.cy; -HFONT CreateFont(int nHeight, / logical height of font heightint nWidth, / logical average character widthint nEscapement, / angle of escapementint nOrientation, / base-line orientation angleint fnWeight, / font weightDWORD fdwItalic, / italic attribute flagDWORD fdwUnderline, / underline attribute flagDWORD fdwStrikeOut, / strikeout attribute flagDWORD fdwCharSet, / character set identifierDWORD fdwOutputPrecision, / output precisionDWORD fdwClipPrecision, / clipping precisionDWORD fdwQuality, / output qualityDWORD fdwPitchAndFamily, / pitch and familyLPCTSTR lpszFace / pointer to typeface name string);CreateFont 参数说明:1、nHeight:指定字体的字符单元或字符的逻辑单位高度,字符的高度值(也被称为em高度)是指字符单元高度值减去内部标头值。字体映射器以如下方式解释nHeight指定的值,各值含义为:0:字体映射器转换这个值以设备单位,并和已有字体的单元高度相匹配。0:字体映射器转换在选择匹配时用一个缺省的高度值。0:字体映射器转换这个值到设备单位,并将它的绝对值和已有字体的字符高度相匹配。比较所有的高度,字体映射器选择不超过要求大小的最大字体。此映射当字体第一次被使用时发生。对于MM_TEXT映射方式,可以用下面的公式为一种指定了点大小的字体确定高度:nHeight=-MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY),72)2、nWidth:指定所要求字体的字符的逻辑单位的平均宽度。如果此值为0,字体映射器选择一个closest match值,closest match值是由比较当前设备的特征系数与可使用字体的数字化特征系数之差的绝对值而确定的。3、nEscapement:指定移位向量和设备X轴之间的一个角度,以十分之一度为单位。移位向量平行于正文行的基线。Windows NT:当图形设备设置为GM_ADVANCED时,可以不依赖字符串的字符的定位角而指定字符串的移位角。当图形模式被设置为GM_COMPATIBLE时,nEscapement同时指定移位角和定位角,可以设置nEscapement和nOrientation为相同的值。Windows 95:nEscapement同时指定移位角和定位角,可设置nEscapement和nOrientation为相同的值。4、nOrientation:指定每个字符的基线和设备X轴之间的角度。5、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_MEDIUM;500;FW_SEMIBOLD;600;FW_DEMIBOLD;600;FW_BOLD:700;FW_EXTRABOLD;800;FW_BLACK;900。6、fdwItalic:如果设置为TRUE,则字体设置为斜体。7、fdwUnderline:如果设置为TRUE,则字体增加下划线。8、fdwStrikeOut:如果设置为TRUE,则字体增加删除线。9、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_CHARSETOEM_CHARSET指定的字符集与操作系统有关。可以使用DEFAULT_CHARSET值来允许字体的名字和大小来充分描述逻辑字体。如果指定的字体名不存在,任何字符集的字体都可以替代指定的字体,所以应该小心地用DEFAULT_CHARSET来避免不期望的结果出现。函数原型int DrawText(HDC hDC, / 设备描述表句柄LPCTSTR lpString, / 将要绘制的字符串int nCount, / 字符串的长度LPRECT lpRect, / 指向矩形结构RECT的指针UINT uFormat / 正文的绘制选项);参数hdc:输入设备环境句柄。lpString:输入指向将被写入的字符串的指针,如果参数nCount是-1,则字符串必须是以0结束的。 如果uFormat包含DT_MODIFYSTRING,则函数可为此字符串增加4个字符,存放字符串的缓冲区必须足够大,能容纳附加的字符。nCount:输入指向字符串中的字符数。如果nCount为-1,则lpString指向的字符串被认为是以0结束的,DrawText会自动计算字符数。lpRect:输入/输出指向结构RECT的指针,其中包含文本将被置于其中的矩形的信息(按逻辑坐标)。uFormat:输入指定格式化文本的方法。它可以下列值的任意组合,各值描述如下:DT_BOTTOM 将正文调整到矩形底部。此值必须和DT_SINGLELINE组合。DT_CALCRECT 决定矩形的宽和高。如果正文有多行,DrawText使用lpRect定义的矩形的宽度,并扩展矩形的底部以容纳正文的最后一行。如果正文只有一行,则DrawText改变矩形的右边界,以容纳下正文行的最后一个字符。出现上述任何一种情况,DrawText返回格式化正文的高度,而不是绘制正文。DT_CENTER 使正文在矩形中水平居中。DT_EDITCONTROL 复制多行编辑控制的正文显示特性。特殊地,为编辑控制的平均字符宽度是以同样的方法计算的,此函数不显示只是部分可见的最后一行。DT_END_ELLIPSIS 对于显示的文本,如果结束的字符串的范围不在矩形内,它会被截断并以省略号标识。如果一个字母不是在字符串的末尾处超出了矩形范围,它不会被截断并以省略号标识。字符串不会被修改,除非指定了DT_MODIFYSTRING标志。DT_EXPANDTABS 扩展制表符,每个制表符的缺省字符数是8。DT_WORD_ELLIPSIS, DT_PATH_ELLIPSIS和DT_END_ELLIPSIS不能和此参数一起使用DT_EXTERNALLEADING 在行的高度里包含字体的外部标头,通常,外部标头不被包含在正文行的高度里。DT_HIDEPREFIX 忽略正文中的前缀字符(&),并且前缀字符后面的字母不会出现下划线。其它前缀字符的调用方式不受影响。输入的字符串: A&bc&d正常: Abc&dDT_HIDEPREFIX: Abc&dDT_INTERNAL 用系统字体来计算正文度量。DT_LEFT 正文左对齐。DT_MODIFYSTRING 修改给定的字符串来匹配显示的正文。此标志必须和DT_END_ELLIPSIS 或 DT_PATH_ELLIPSIS同时使用。DT_NOCLIP 无裁剪绘制。当DT_NOCLIP使用时DrawText的使用会有所加快。DT_NOFULLWIDTHCHARBREAK 在宽字符的字符串中防止行断开,因此折行规则相当于单字符的字符串。例如,我们可以用在棒子版的windows中,为图标标签提供更好的可读性。除非指定DT_WORDBREAK,否则此值没有作用。DT_NOPREFIX 关闭前缀字符的处理。通常DrawText解释助记前缀字符,&为给其后的字符加下划线,解释&为显示单个&。指定DT_NOPREFIX,这种处理被
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 滑板场地租赁合同范本
- 项目托管合作合同范本
- 美缝材料销售合同范本
- 辽宁养殖转让合同范本
- 美容美发用工合同范本
- 省代代理合同终止协议
- 物业与员工合同协议书
- 维修延保服务合同范本
- 滴灌漏水维修合同范本
- 2025年水电站招聘考试题及答案
- 信息安全自查管理办法
- 备战高一高二高三高考历史临考题号押题-押第19题中国现代化(解析版)
- 违章建筑培训课件
- 2025中国数字营销行业人工智能应用趋势研究报告
- 宠物户外营地活动方案
- 期货课件培训
- 工厂行车吊装方案(3篇)
- 口腔科误吞误吸应急处置规范
- 全球及2025-2030中国口腔CBCT行业前景动态与投资趋势预测报告版
- 零售业商品品类分类表
- 2025“无废城市”框架下其他垃圾减量再生利用典型案例研究报告
评论
0/150
提交评论