《循序渐进学用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消息。

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

例子。这里不再详述了

posted on 2006-11-25 22:41  cy163  阅读(...)  评论(...编辑  收藏

导航