zoukankan      html  css  js  c++  java
  • 《循序渐进学用Visual C++ 6.0》读书笔记(七

    《循序渐进学用Visual C++ 6.0》读书笔记(七)

    l         题设:画一个对话框MyDlg , 一个List BoxIDC_LB ,

    一个静态文本(IDC_STEXT),同时为list box创建空件型成员变量

    m_ctlListBox和字符串型成员变量m_strListBox.

    今日我们要学习字体控制,但是我们必须了解一些必备知识。

    l         LogFont结构

     

    这个结构的成员变量多得要死,了解就okey了,有需要的时候查msdn.

    typedef struct tagLOGFONT {

     LONG lfHeight;         //高度

     LONG lfWidth;         //宽度

     LONG lfEscapement;       //打印角度,900垂直打印,0水平打印。

     LONG lfOrientation;         //字体打印角度,1800上下倒置,900左右倒置。

     LONG lfWeight;               //字体粗细,默认是0,还常用400700

     BYTE lfItalic;                  //斜体字,默认0非斜体,1斜体。

     BYTE lfUnderline;            //下划线,默认0无。

     BYTE lfStrikeOut;            //字体被直线穿过,默认0无。

     BYTE lfCharSet;   //字符集,如宋体字。一般设置为DEFAUL_CHARSET.

     BYTE lfOutPrecision;   //符合度,看不明白?一般设置为OUT_DEFAUL_

                                                                                                    PRECIS

     BYTE lfClipPrecision;   //不懂,一般设置为CLIP_DEAFAUL_PRECIS

     BYTE lfQuality;           //字体图形质量,不管,设为DEFAUL_QUALITY

     BYTE lfPitchAndFamily; //字间距,不管,设为DEFAUL_PITCH+FF_DON

                                                                                  TCARE

     TCHAR lfFaceName[LF_FACESIZE]; //所有字体式样数组,

                                     供字体回调函数调用。

    } LOGFONT;

    例如:

    LogFont lf ; //声明一个LogFont结构变量

    lf.lfCharSet=DEFUAL_CHARSET; //设置为宋体字

    lf.lfPitchAndFamily=0 ;  //这里0DEFAUL_QUALITY

    lf.lfFaceName[]=NULL; //动态数组的字符式样集合,初始化清空

           //////////////////////////////////////////////////////////////////////////////////////////////////

    l         EnumFontFamFamiliesEX()请求可用字体列表函数。

     

    看到以EX结尾,我们就知道这是一个API函数,看函数原形:

    E…..EX(“设备场景LogFont结构指针 ,字体回调函数地址,

              LPARAM,    0  )

           //画布上次讲过了,画布就是其中一个设备场景,

        建立画布如:CClientDC dc(this)

           //回调函数上次也讲过了,但呆会再讨论。

           //LPARAM是给回调函数使用的,上次也讲过了。

           //最后一个永远是0 ,据说是给以后扩展的时候使用的。

    例如:

           CClientDC dc(thist);

           LogFont   lf;

           …..    // lf的初始化如上例。

      ::EnumFontFamFamiliesEX( (HDC) dc , // 强制转化成HDC类型

         &lf , (FONTENUMPROC) EnumFontFamProc //强制转化成字体回调函数

           LPARAMthis , 0 ) //强转当前窗体指针为LPARAM接收回调函数使用情况。

           ////////////////////////////////////////////////////////////////////////////////////////////////////

    l         如何创建字体回调函数?

     

    看一个经典的字体回调函数例子:

    int CALLBACK EnumFontFamProc( LPENUMLOGFONT lpelf ,

    LPNEWTEXTMETRIC lpntm , DWORD nFontType ,

    Long lParam )

    {

    MyDlg * pWnd = (MyDlg *) lParam ;

    pWnd ->m_ctlListBox.AddString (lpelf->elfLogFont.lfFaceName)

    return ture ;

    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////

    这个回调函数是我们创建的,头3个参数看似很深懊,其实是LogFont结构

    的分解版,第一个参数是ENUMLOGFONT的结构指针,这种结构用来设置

    字体的粗斜下划线,第二个参数是NEWTEXTMETRIC的结构指针,这种结

    构却用来设置字体的高宽大小,第三个参数则用来设置字体显示风格,

    TureType, 而最后一个参数是回调函数必需有的,它似呼有某些隐藏操作,

    不用我们管。

    第一个语句是为对话框MyDlg设置指针,它等于lParam.

    第二个语句是MyDlg下的List Box空件添加项目,项目名称等于那个结构的

    式样名字。

    第三个语句回调函数必须的。

    l         CFont

     

    CFont类可以看作LogFont结构的扩展,他们的成员变量完全一样,不过类

    是有成员函数的,如:CreatFont方法与SetFont方法

    看例:

    CFont m_fFont ;  //创建一字体实例;

    m_fFont.CreatFont (12, 0,0,…..LogFont的参数一模一样,详见上面….);

    l         MyDlg.h头文件,加入回调函数声明。

    int CALLBACK EnumFontProc( LPENUMLOGFONT lpnlf ,

    LPNEWTEXTMETRIC lpntm ,DWORD nFontType , long LPARAM);

    l         MyDlg.cpp文件,写下自己的字体回调函数

    这里可以照抄上例。

    l         MyDlg类创建成员函数FillFont();

    由于这个函数并不为什么消息而创建的,是我们自己创建用

    来集成一系列操作的函数。

    View面版,点MyDlg类,右点添加,输入名字等创建它。

    代码清单:

    void MyDlg::FillFont();

    {

           LogFont lf;

           lf.SetChar=DEFUALT_CHARSET;

           strcpy( lf.lfFaceName , “”);

           m_ctlListBox.ResetContext() ;

           CClientDC dc(this);

           ::EnumFontFamilesEX((HDC) dc ,&lf ,

           (FontEnumProc) EnumFontProc,(LPARAM) this,0);

    }

    //strcpy(目标,源)是字符串复制函数。

    这里初始化。要注意就是lf.lfFaceName是字符串数组。

    //List Box 有个方法ResetContext()是清空下拉列表。

    //下面几句上面讲过,请求字体列表。

    l         FillFont()加入MyDlg的装载函数里。

    Void MyDlg::InitDialog()

    {

    …..

    FillFont();

    ….

    }

    l         Edit BoxEN_CHANGE消息与List BoxLBN_SELCHANGE消息。

    Edit Box内容被用户改变就会激发EN_CHANGE消息.

    List Box被用户下拉选择项目时会激发LBN_SELCHANG消息。

    这两个消息都容易被理解,书上正是为此两种消息做字体选择的

    例子。这里不再详述了

  • 相关阅读:
    并发的简单介绍1
    UITableView (4): 在TableView中移动cell和Section 从TableView中删除cell和section 添加系统默认刷新控件
    UITableView (3):显示cell上的菜单
    TableView(2)
    UITableView (1)
    在 Interface Builder 中配置自动布局的约束
    Velocity 的工作原理
    ORA-01858: a non-numeric character was found where a numeric was expected
    Java 8:不要再用循环了
    Lambda表达式
  • 原文地址:https://www.cnblogs.com/cy163/p/572509.html
Copyright © 2011-2022 走看看