您的位置:首页 > 编程语言

孙鑫 第十课之二 字体选择对话框编程(笔记+转载)

2012-12-05 17:18 417 查看
1 CFontDialog类
数据成员 m_cf
CHOOSEFONT m_cf; 是一个CHOOSEFONT结构体类型的变量

typedef struct {
DWORD lStructSize; //结构长度
HWND hwndOwner; //所属窗口
HDC hDC; //当Flags标志指定CF_PRINTERFONTS标志时,它是打印机的DC句柄
LPLOGFONT lpLogFont; //指向一个LOGFONT结构
INT iPointSize; //选择的字体的大小,单位是1/10磅
DWORD Flags; //标志
COLORREF rgbColors; //选择的字体的颜色
LPARAM lCustData; //
LPCFHOOKPROC lpfnHook; //
LPCTSTR lpTemplateName; //
HINSTANCE hInstance; //
LPTSTR lpszStyle; //
WORD nFontType; //
INT nSizeMin; //当指定标志有CF_LIMITSIZE时,这个值是字体的最小点数
INT nSizeMax; //当指定标志有CF_LIMITSIZE时,这个值是字体的最大小点数
} CHOOSEFONT, *LPCHOOSEFONT;
结构体中成员lpLogFont是一个指向LOGFONT结构体的指针
Flags有几个可用的值:如果指定了标志CF_INITTOLOGFONTSTRUCT,打开该对话框时用lpLogFont指定值初始化对话框所显示的值。
rgbColor---如果Flags标志中指定CF_EFFECTS,对话框将根据这个数值初始化“颜色”下拉式列表框。另外,函数在返回时在这里返回用户选择的字体颜色。

nFontType---返回用户选择的字体属于哪一类,可能返回值是:BOLD_FONTTYPE,ITALIC_FONTTYPE,PRINTER_FONTTYPE,REGULAR_FONTTYPE和SCREEN_FONTTYPE。
Flags---该字段的初始值决定对话框的不同行为,函数返回时也会在这里返回一些用户的选择,它可以是下列值的组合:
CF_BOTH //对话框同时列出打印机字体和屏幕字体
CF_TTONLY //对话框只显示TrueType字体
CF_EFFECTS //对话框只显示“效果”复选框
CF_FIXEDPITCHONLY //对话框的字体列表中只显示等宽字体
CF_LIMITSIZE //对话框显示的字体尺寸限于nSizeMin和nSizeMax字段指定的数值之间
CF_NOSTYLESEL //对话框不显示“字形”组合列表框
CF_NOSIZESEL //对话框不显示“大小”组合列表框
CF_SCREENFONTS //字体列表中只显示屏幕字体

调用ChooseFont函数时,函数会停留直到对话框关闭为止,当用户单击了对话框中的“确定”按钮时,函数返回TRUE;用户单击“取消”按钮时,函数返回FALSE。
在调用ChooseFont函数之前,lpLogFont字段被指向一个LOGFONT结构,对话框关闭时,函数在LOGFONT结构的lfFaceName字段中返回字体的名称,字体的效果和字形也在LOGFONT结构中返回。
用户选择的颜色在rgbColor字段中返回,字体大小在iPointSize字段中返回,由于单位是1/10磅,所以返回的数值等于对话框中选择的字体大小乘以10。

函数实例代码片段如下:
HWND hwnd; // owner window
HDC hdc; // display device context of owner window

CHOOSEFONT cf; // common dialog box structure
static LOGFONT lf; // logical font structure
static DWORD rgbCurrent; // current text color
HFONT hfont, hfontPrev;
DWORD rgbPrev;

// Initialize CHOOSEFONT
ZeroMemory(&cf, sizeof(cf));
cf.lStructSize = sizeof (cf);
cf.hwndOwner = hwnd;
cf.lpLogFont = &lf;
cf.rgbColors = rgbCurrent;
cf.Flags = CF_SCREENFONTS | CF_EFFECTS;

if (ChooseFont(&cf)==TRUE)
{
hfont = CreateFontIndirect(cf.lpLogFont);
hfontPrev = SelectObject(hdc, hfont);
rgbCurrent= cf.rgbColors;
rgbPrev = SetTextColor(hdc, rgbCurrent);
. .....
}

2 自己遇到的例子

void CMy53View::OnFont()
{
CFontDialog dlg;
dlg.m_cf.Flags |= CF_INITTOLOGFONTSTRUCT | CF_EFFECTS | CF_LIMITSIZE;
dlg.m_cf.rgbColors = color; //color 为上一次所选择的颜色

dlg.m_cf.nSizeMin = 1; //指定了标志CF_LIMITSIZE,所以这是字号最小点
dlg.m_cf.nSizeMax = 72; //字号最大点数
if(IDOK == dlg.DoModal())
{
if (font.m_hObject) //如果字体已经创建,那么先把字体对象和字体资源分离
{
font.DeleteObject();
}
font.CreateFontIndirect(dlg.m_cf.lpLogFont); //用该指针变量来创建字体
color = dlg.m_cf.rgbColors; //选择字体
strFontName = dlg.m_cf.lpLogFont->lfFaceName; //字体名
Invalidate(); //使窗口不可用,此时View类的OnDraw()函数调用重绘窗口,在OnDraw()函数里 写使用这个 字体和颜色输出文字的代码
}
}

void CMy53View::OnDraw(CDC* pDC)
{
CMy53Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CFont *pOldFont = pDC->SelectObject(&font);
pDC->SetTextColor(color);
pDC->TextOut(0, 0, strFontName);
pDC->SelectObject(pOldFont);
}

原文:http://blog.csdn.net/ACE1985/archive/2010/07/28/5770482.aspx

?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: