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消息。
这两个消息都容易被理解,书上正是为此两种消息做字体选择的
例子。这里不再详述了。
写住这么先,,初级篇终于看完了明天看中级篇,要睡觉了。。。累了。。