欢迎访问:常州市武进区嘉泽中心小学网站 !今天是:
栏目列表
您现在的位置是:首页>>教师>>计算机技术>>程序设计>>杂项>>文章内容
《循序渐进学用Visual C++ 6.0》读书笔记(七)
发布时间:2008-11-20   点击:   来源:本站原创   录入者:佚名
 

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

l         题设:画一个对话框MyDlg , 一个List Box(IDC_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,还常用400,700

  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 ;    //这里0是DEFAUL_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 //强制转化成字体回调函数

       (LPARAM)this , 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 Box的EN_CHANGE消息与List Box的LBN_SELCHANGE消息。

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

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

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

例子。这里不再详述了。

写住这么先,,初级篇终于看完了明天看中级篇,要睡觉了。。。累了。。


附件:
    关闭窗口
    打印文档
    账号登录
    保持登录 忘记密码?
    账号与武进教师培训平台同步