windows程序设计学习笔记-文本和字体

1.文本输出
1.1.BOOL TextOut(
In HDC hdc,
In int nXStart,
In int nYStart,
In LPCTSTR lpString,
In int cchString
);

作用:在指定位置写字符串。使用当前选择的字体,背景颜色,字体颜色。
参数解释:
nXStart:系统用来对齐字符串的参考点X坐标。逻辑坐标。
nYStart:系统用来对齐字符串的参考点Y坐标。逻辑坐标。
//对参考点的解释取决于当前的文本对齐模式。
//可以用GetTextAlign取得此模式。
//可以用SetTextAlign改变此模式。

1.2.LONG TabbedTextOut(
In HDC hDC,
In int X,
In int Y,
In LPCTSTR lpString,
In int nCount,
In int nTabPositions,
In const LPINT lpnTabStopPositions,
In int nTabOrigin
);

作用:在指定位置写一个字符串。
扩展 tabs到tab-stop 位置数组中指定值。
文本用当前选择的字体,背景颜色和文本颜色写。
参数解释:
hDC:设备环境句柄
X :字符串起始点X坐标。逻辑单位。
Y:字符串起始点Y坐标。逻辑单位。
lpString:指向要写的字符串。
lpString:字符串写的长度。
nTabPositions:在tab-stop位置数组里的值数量。
lpnTabStopPositions:指向一数组包含tab-stop位置,以逻辑单位。tab-stops需要以递增顺序排列。最小的X值应该是数组里第一个条目。
nTabOrigin :开始位置X坐标。tabs从此处被扩展。逻辑单位。

返回值:
成功,维度。高度是高序字。宽是低序字。
失败,0.

1.3.virtual BOOL ExtTextOut(
int x,
int y,
UINT nOptions,
LPCRECT lpRect,
LPCTSTR lpszString,
UINT nCount,
LPINT lpDxWidths
);

作用:在一个矩形区域内使用选择的字体写一个字符串。
参数解释:
x:指定第一个字符的逻辑X坐标。
y:指定第一个字符顶部逻辑Y坐标。
nOptions:
//ETO_CLIPPED:指定文本被剪切到矩形。
//ETO_OPAQUE:用当前背景颜色来填充矩形。
lpRect :指向一个矩形结构来定义矩形的维度。
lpszString:字符串。
nCount :字符串里要处理的字符数量。
lpDxWidths:指向一个数组。每个元素表示相邻字符单元起始处的距离。为NULL时,使用默认的字符间距。

1.4.int DrawText(
In HDC hDC,
Inout LPCTSTR lpchText,
In int nCount,
Inout LPRECT lpRect,
In UINT uFormat
);

作用:绘制格式化文本在指定的矩形里。依据指定的方法格式方法。
参数解释:
hDC:设备环境句柄
lpchText:指向一个要被显示的字符串的指针。nCount为-1时,字符串需要有终止符。
nCount:字符串以字符为单位的长度。如果nCount为-1,lpchText应该以终止符结尾。
lpRect:指向一个字符串被格式化位置的矩形。逻辑坐标。
uFormat:格式化字符串的方法。

//DT_LEFT:文本左对齐。
//DT_RIGHT:右对齐
//DT_CENTER:居中文本。
//DT_TOP:文本顶部对齐。
//DT_VCENTER:垂直居中。DT_SINGLELINE 设置时有效。
//DT_BOTTOM:把字符串调整到矩形底部。仅在DT_SINGLELINE 设置时有效。

//DT_CALCRECT:决定矩形的宽和高。
(如果有多行文本,DrawText使用lpRect指向的矩形宽 且 扩展矩形基部 到文本最后一行的边界。
如果最大的单词比矩形更广,矩形宽度相应扩大。
如果文本小于矩形宽度,宽相应减小。
如果文本仅有一行,DrawText修改矩形的右边以便它包含一行里的最后一个字符。)

//DT_END_ELLIPSIS:对于显示的文本,如果一个字符串的结束部分不适合矩形,它被截断且添加省略标识。
//DT_EXPANDTABS:扩展tab字符。每个tab默认对应8个字符。
//DT_EXTERNALLEADING:包含字体外部空间在行高里。外部空间通常不包含在一行文本的高度里。

//DT_MODIFYSTRING:DT_END_ELLIPSIS 或 DT_PATH_ELLIPSIS下截断会把传入的字符串也截断
//DT_NOCLIP:无剪切绘制。
//DT_SINGLELINE:显示文本在一行。
//DT_WORDBREAK:中断单词。行自动中断在单词间,如果单词会扩展超过lpRect参数指定的矩形边界。未指定时,输出在一行。
//DT_WORD_ELLIPSIS:截断单词不适合矩形的,添加省略号。

返回值:
成功,返回文本高度。逻辑单位。
失败,0

2.设置文本颜色,背景颜色,背景模式,字符间距
文本颜色:
SetTextColor:文字颜色
SetBkMode:背景模式。QPAQUE:用当前设定的背景色填充矩形框。TRANSPARENT。
SetBkColor

//SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));
//SetBkColor(hdc, GetSysColor(COLOR_WINDOW));

字符间距:默认值是0.
SetTextCharacterExtra(hdc, iExtra); // iExtra是逻辑单位。
GetTextCharacterExtra。

3.字体
文字的字样和字号定义了一种特定的字体。
3.1.逻辑字体
typedef struct tagLOGFONT {
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;

成员解释:
lfHeight:(根据点值求到的像素数)
对MM_TEXT映射模式,点值–字体高度。
lfHeight = -PointSize * (GetDeviceCaps(hDC, LOGPIXELSY) / 72);

lfWidth:字符的平均宽度。
//使用方式:
//1.LOGFONT的lfWidth设为0,创建逻辑字体并选入设备环境
//2.用GetTextMetrics获得tmAveCharWidth字段,按比例调节该值的大小,
//3.用被调节过的tmAveCharWidth值作为lfWidth字段值来创建一个新的字体。

lfWeight :指定字体点值,在范围[0, 1000]。0时用默认权重。
lfItalic:指定一个倾斜字体。
lfUnderline :指定一个下划线字体。
lfStrikeOut :指定一个删除线字体。
lfCharSet:指定字符集。
//ANSI_CHARSET
//BALTIC_CHARSET
//CHINESEBIG5_CHARSET
//DEFAULT_CHARSET
//EASTEUROPE_CHARSET
//GB2312_CHARSET
//GREEK_CHARSET
//HANGUL_CHARSET
//MAC_CHARSET
//OEM_CHARSET
//RUSSIAN_CHARSET
//SHIFTJIS_CHARSET
//SYMBOL_CHARSET
//TURKISH_CHARSET

lfPitchAndFamily:指定字体间距和组。
//0,1位指定字体间距,可是以下值:
//DEFAULT_PITCH
//FIXED_PITCH
//MONO_FONT
//VARIABLE_PITCH
//4-7位指定字体组,可是以下值:
//FF_DECORATIVE
//FF_DONTCARE
//FF_MODERN
//FF_ROMAN
//FF_SCRIPT
//FF_SWISS
//FF_DECORATIVE:
//FF_DONTCARE:

lfFaceName

3.2.TEXTMETRIC
typedef struct tagTEXTMETRICW
{
LONG tmHeight;
// lfHeight > 0,两者近视相等,都指行间距。
//lfHeight < 0, tmHeight - tmInternalLeading为lfHeight的绝对值
LONG tmAscent; // 在基准线之上的长度。
LONG tmDescent; // 在基准线之下的长度。
LONG tmInternalLeading; // 内部间隔值。
LONG tmExternalLeading; // 外部间隔值
LONG tmAveCharWidth; // 小写字母的平均宽度
LONG tmMaxCharWidth; // 大写字符的宽度。
LONG tmWeight; // 点值
WCHAR tmDefaultChar; // 字符在字体集不存在时,此字符代替。
BYTE tmItalic; // 斜体
BYTE tmUnderlined; // 下划线
BYTE tmStruckOut; // 删除线
BYTE tmPitchAndFamily;
BYTE tmCharSet;//字符集
} TEXTMETRICW, *PTEXTMETRICW, NEAR *NPTEXTMETRICW, FAR *LPTEXTMETRICW;

3.3.字体枚举
3.3.1.int EnumFonts(
In HDC hdc,
In LPCTSTR lpFaceName,
In FONTENUMPROC lpFontFunc,
In LPARAM lParam
);

参数解释:
lpFaceName为NULL,枚举所有字体。非NULL,返回特定字体。
lpFontFunc:枚举回调函数。
lParam:可选。可用来给枚举回调函数传递参数。

3.3.2.int EnumFontFamilies(
In HDC hdc,
In LPCTSTR lpszFamily,
In FONTENUMPROC lpEnumFontFamProc,
In LPARAM lParam
);

第一次调用时,lpszFamily设为NULL。
对每个字体系列,调用一次lpEnumFontFamProc。
然后,应用程序会用字体系列的每个字样名字再次调用EnumFontFamilies,但每次使用一个不同的回调函数。
对该系列每个字体,GDI会调用第二次传入的回调函数。

3.4.默认的字体选择对话框
3.4.1.CHOOSEFONT
typedef struct
{
DWORD lStructSize;
HWND hwndOwner;
HDC hDC;
LPLOGFONT lpLogFont;
INT iPointSize;
DWORD Flags;
COLORREF rgbColors;
LPARAM lCustData;
LPCFHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
HINSTANCE hInstance;
LPTSTR lpszStyle;
WORD nFontType;
INT nSizeMin;
INT nSizeMax;
} CHOOSEFONT, *LPCHOOSEFONT;

作用解释:
包含ChooseFont函数用来初始化 字体选择对话框的信息。
对话框关闭时,系统在此结构里返回用户选择信息。

参数解释:
lStructSize :sizeof(CHOOSEFONT)
hwndOwner :对话框拥有窗口句柄。
lpLogFont :指向一个LOGFONT结构。
iPointSize :1/10点值单位。
Flags :
//CF_APPLY :让对话框显示 Apply按钮。
//应处理Apply按钮的WM_COMMAND消息。
//处理函数可发送 WM_CHOOSEFONT_GETLOGFONT消息取得当前用户选择字体信息。
//CF_EFFECTS :让对话框 删除线,下划线,文本颜色选项。
//CF_ENABLEHOOK :启用在此结构lpfnHook中指定的 钩子处理器

//CF_ENABLETEMPLATE :指明 hInstance 和 lpTemplateName 指定一个使用的模板。
//CF_ENABLETEMPLATEHANDLE :指明 hInstance指定一个数据块,包含预加载的对话框模板。
//如果此标志指定,系统忽略lpTemplateName。
//CF_FIXEDPITCHONLY :ChooseFont仅仅枚举 等宽字体。
//CF_INITTOLOGFONTSTRUCT :ChooseFont应用lpLogFont指向结构来初始化对话框控件。
//CF_LIMITSIZE :ChooseFont选择的字体尺寸应在 nSizeMin到nSizeMax间。
//CF_SHOWHELP :
//让对话框显示帮助按钮,hwndOwner须指定窗口来接受HELPMSGSTRING注册消息。
//此消息在按下对话框里Help按钮时发送。
//CF_USESTYLE :

rgbColors :CF_EFFECTS标志设置时,rgbColors初始文本颜色。ChooseFont返回成功时,此成员包含用户选择的文本颜色的RGB值。
lCustData :
//应用定义的数据,传给 钩子,由lpfnHook成员定义。
//当发送WM_INITDIALOG消息给钩子,消息的lParam参数是指向CHOOSEFONT结构的指针。
lpfnHook:一个指针指向CFHookProc钩子处理器,可处理用于对话框的消息。只在 CF_ENABLEHOOK标志设置时有效。
lpTemplateName:对话框模板资源名。模板默认为标准对话框模板。只在 CF_ENABLETEMPLATE标志设置时有效。
hInstance:
//如CF_ENABLETEMPLATEHANDLE 标志被设置,hInstance是一个指向内存对象的句柄。
//内存对象包含了一个对话框模板。
lpszStyle :CF_USESTYLE 设置时有效。
nFontType:ChooseFont返回时,用来表示选择的字体类型。
nSizeMin
nSizeMax

4.windows字体背景知识
Windows支持 GDI字体和设备字体。
GDI字体存储在硬盘文件中。设备字体是输出设备自身就支持的。
GDI字体分三类:点阵字体,笔画字体和Truetype字体。

点阵字体的每个字符都以像素形式表示,并存储在一个位图里,又称位图字体。
每种点阵字体都针对字符的特定尺寸和纵横比设计。

点阵字体字样名:
System
FixedSys
Terminal
Courier
MS Serif
MS Sans Serif
Small Fonts

每个点阵字体只有几个有限的尺寸。

笔画字体。笔画字体由一系列点和连接点的线段组成。
笔画字体可以平滑地缩放。

笔画字体字样名:
Modern
Roman
Script
对GDI点阵字体和GDI笔画字体,对不同的字形,可直接合成。

TrueType字体的每个字符都通过字符的轮廓线来定义。
windows可改变字符轮廓线的坐标对TrueType字体进行缩放。

TrueType字体的字样名称:
Courier New
Courier New Bold
Courier New Italic
Courier New Bold Italic
Times New Roman
Times New Roman Bold
Times New Roman Italic
Times New Roman Bold Italic
Arial
Arial Bold
Arial Italic
Arial Bold Italic
Symbol
设置斜体或粗体时,既可使用属性,也可使用同一系列的不同字样来达到同样的目的。

你可能感兴趣的:(Ui-Wndows-Api)