中国人自古就有自右至左、从上到下书写汉字的习惯。而当我们在自己所编写的应用程序中使用输出函数输出的总是自左至右的横排文字。有没有可能在我们的应用程序中实现竖写汉字的效果呢?笔者偶然发现了一种利用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   {   //   lf     
            LONG   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   lfFaceName[LF_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,                 //字体高度(旋转后的字体宽度)=56     
                20,                 //字体宽度(旋转后的字体高度)=20   
                2700,                 //字体显示角度=270°   
                0,                                     //nOrientation=0   
                10,                                   //字体磅数=10   
                FALSE,                             //非斜体   
                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;i<m_text.GetLength();i++){   
  pDC->TextOut(10,y,m_Text.GetAt(i));   
  y+=   sz.cy;   
  }

程序执行后,如下:

文字的纵向显示的问题 cdc drawtext相关推荐

  1. Py之Matplotlib:python包之Matplotlib库图表绘制经验总结(中英文字体修改、横坐标文字进行横/纵向显示、控制坐标轴范围等)之详细攻略

    Py之Matplotlib:python包之Matplotlib库图表绘制经验总结(中英文字体修改.横坐标文字进行横/纵向显示.控制坐标轴范围等)之详细攻略 目录 1.Matplotlib库图表绘制包 ...

  2. Echarts系列之怎么让文字纵向显示

    如何让Echarts中的文字纵向显示? 实现上面的效果,我真的是仔细看了官方配置文档一遍又一遍,但是没有直接的配置项,这里我要说的解决方案是从值来解决的. 可以直接在字符串文字后面加如\ n,如'竖\ ...

  3. div css纵向显示 html,css如何设置竖排文字?

    有时候网页中的文字因为特别要求不能横向显示,这时候所需要的就是让文字来竖排显示,那么,网页中如何让文字竖排显示呢?接下来本篇文章将介绍css实现文字竖排显示的方法,希望对大家有所帮助. 方法一:使用w ...

  4. echarts x轴文字个数太多_echarts x轴标签文字过多导致显示不全,最有效的3种解决方法...

    echarts x轴标签文字过多导致显示不全,只是我之前在csdn发表过,经过实践,效果不错! 如图: 办法1:xAxis.axisLabel 属性 axisLabel的类型是object ,主要作用 ...

  5. echarts横坐标文字太长显示不完的两种解决办法:rotate旋转文字、调用函数让文字纵向排列

    //方法1:横坐标文字太长显示不完,调用函数解决,在axisLabel下添加属性,让文字纵向排列: formatter:function(val){return val.split("&qu ...

  6. UIButton文字居左显示

    今天我们来讲如何让UIButton文字居左显示?我们都应该写过让UILabel的text居左显示.代码也非常简单. UILabel文字居左显示 实现文字居左显示代码如下: UILabel *label ...

  7. php 中文 过长 省略号,css实现文字过长显示省略号

    本篇文章介绍了css实现文字过长显示省略号的方法,具有一定的参考价值,希望对学习css的朋友有帮助! 一.CSS样式 解决文字过长显示省略号问题 1.一般样式 一般 css 样式,当宽度不够时,可能会 ...

  8. 【css】文字溢出,显示省略符号(...)

    前言 CSS3 文字溢出,显示省略符号需要区分情况进行处理:可分为单行和多行的情况. 单行文字溢出 假设有这样的需求,如图: 那么可以用如下代码实现: <!DOCTYPE html> &l ...

  9. echarts实现给图例添加单位、百分比,以及图例文字过长显示省略号

    修改lengend formatter: (name) => {if (this.seriesData.length) {let sum = 0;this.seriesData.forEach( ...

最新文章

  1. 32位md5解密_用户名与密码前后加密、后台解密实现方案
  2. 设计模式 — 创建型模式 — 工厂模式
  3. java dao模式_Java DAO 模式
  4. WebBenchmark之动态数据测试
  5. CF626F. Bear and Fair Set
  6. 个人信息保护呼吁“基本法”
  7. C#——await与async实现多线程异步编程
  8. jquery选择器小知识点们
  9. PHP 必须勾选用户协议,javascript实现用户必须勾选协议实例讲解
  10. 关于新手学习seo入门的指南建议
  11. FME进阶视频教程: FME使用技巧之高级扇出,讲解在FME中输出数据的高级方式,满足数据个性化分类输出的需求
  12. 淘宝网首页登录失败原因分析及解决…
  13. HTML打开网页自动播放音乐
  14. eclipse安装STS支持注意的坑
  15. 用 Python 生成 CSV 文件
  16. mysql连接异常:The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zo
  17. java分布式事务——seata,tcc解决方案总结!
  18. docker安装GraphDB
  19. 什么是Filter过滤器
  20. 毕节计算机考试准考证打印,2016年9月毕节计算机三级四级准考证打印入口,计算机等级考试时间查询...

热门文章

  1. JVM错误日志hs_err_pid****.log分析
  2. java utf8 简繁转换 类库,java 中文繁简体转换工具 opencc4j
  3. svn冲突问题详解 SVN版本冲突解决详解
  4. Map与Json之间的转化
  5. Linux TTY基本概念之ttys*、tty*、ttyS*、console理解
  6. 天翼云服务器的一些问题及解决方式
  7. Salesforce Apex 中常用技能总结(持续更新)
  8. 教学|3DsMAX怎么样制作环境贴图,3D建模步骤教程
  9. Word输入一个字,后面就会消失一个字,该怎么办
  10. 中国石油大学(北京)-《外国文学作品选读》第一阶段在线作业