与字体相关的win API函数,以及结构

本文介绍了使用 Windows API 进行字体操作的方法,包括获取字体信息、创建自定义字体及设置字体颜色等实用技巧。

最近正在学习Windows API编程,所以对字体以及字体颜色方面的API函数以及结构体做一些总结,

菜鸟作品。。。by Lee.Ye


BOOL GetTextMetrics ( HDC hdc, LPTEXTMETRIC lptm); 

;该函数把程序当前的字体信息,存放到TEXTMETRIC
 
typedef struct tag TEXTMETRIC{
        LONG tmHeight;//高度
        LONG tmAveCharWidth;//宽度
        BYTE  tmPitchAndFamily;//其他结构栏位
} TEXTMETRIC, * PTEXTMETRIC;//用于存储装置字体结构信息

 

 
    对于固定宽度字体,每个字体的宽度是tmAveCharWidth,
    对于固定宽度字体,tmPitchAndFamily栏位的低位元为0,
 
字体:
 
HGDIOBJ SelectObject ( HDC hdc, HGDIOBJ hgdiobj);
//将相应的对象加入到HDC
HGDIOBJ GetStockObject ( int fnObj);//获取字体
 
SelectObject ( hdc, GetStockObject(ANSI_FIXD_FONT));获取ANSI_FIXD_FONT字体并生效
代码:
    TEXTMETRIC tm;
    HDC hdc;
    
    hdc = GetDC(hwnd);//获取该窗口句柄对应的dc
    GetTextMetrics (hdc,&tm);
    SelectObject ( hdc, GetStockObject(ANSI_FIXD_FONT));获取ANSI_FIXD_FONT字体
    TextOut(.....................);
    ReleaseDC(hwnd,hdc);
 
创建字体:
  
 HFONT CreateFont(
                                     int nHeight,               //字体高度
                                     int nWidth,                // 字体宽度
                                     int nEscapement,           // 字体显示的角度
                                      int nOrientation,          // 字体的角度
                                      int fnWeight,              // 字体的磅数
                                      DWORD fdwItalic,           // 斜体
                                      DWORD fdwUnderline,        // 下划线
                                      DWORD fdwStrikeOut,        // 删除线
                                      DWORD fdwCharSet,          // 所需的字符集
                                      DWORD fdwOutputPrecision,  // 输出的精度
                                      DWORD fdwClipPrecision,    // 裁剪的精度
                                      DWORD fdwQuality,   // 逻辑字体与输出设备的字体之间的精度
                                      DWORD fdwPitchAndFamily,   // 字体间距和字体集
                                      LPCTSTR lpszFace           // t字体名称
                                    );(用于创建字体的结构体)HFONT CreateFontIndirect (CONST LOGFONT * lplf);(与LOGFONT配合使用的函数)
 
代码:
 
    TEXTMETRIC tm;
    LOGFONT lf;
    HDC hdc;
    
    hdc = GetDC (hwnd);
    
    lf....................;
    GetTextMetrics(hdc,&tm);
    SelectObject(hdc,CreateFontIndirect(&lf));
    TextOut(hdc,0,0,TEXT("这是自定义的字体"),strlen(TEXT("这是自定义的字体")));
    ReleaseDC(hwnd,hdc);
 
字体选择框:
BOOL ChooseFont(LPCHOOSEFONT lpcf);
 
typedef struct{
                            DWORD lStructSize;//结构体大小
                            LPLOGFONT lpLpgFont;//字体信息
                            DWORD Flags;
                            //CF_SCREENFONTS在屏幕上显示,CF_EFFECT显示下划线字体颜色,删除线功能,CF_INITTOLOGFONTSTRUCT用lpLogFont初始化选择框。
                        }CHOOSEFONT, *LPCHOOSEFONT;

 

代码:
CHOOSEFONT cf = {0};//创建字体选择框并赋上初值
LOGFONT lf;//用于被指向的字体信息
 
cf.lStructSize = sizeof(CHOOSEFONT);
cf.lpLogFont = &lf;
cf.Flags = CF_SCREENFONTS | CF_EFFECTS;
 
ChooseFont(&cf); 
hdc = GetDC(hwnd);
SelectObject(hdc,CreateFontIndirect(&cf.lpLogFont));//
TextOut(..............................);
ReleaseDC(...........);
 
字体颜色:
设置字体前景色:
COLORDEF SetTextColor(HDC hdc,COLORDEF crColor);//RGB(x,x,x)设置颜色
设置背景色:
SetBkColor(HDC hdc,COLORDEF crColor);
SetBkMode(hdc,OPAQUE);//设置背景模式,OPAQUE不透明,TRANSPARENT透明
 
typedef struct {
    DWORD lStructSize;
    HWND hwndOwner;
    HWND hInstance;
    COLORREF rgbResult;
    COLORREF *lpCustColors;
    DWORD Flags;
    LPARAM lCustData;
    LPCCHOOKPROC lpfnHook;
    LPCTSTR lpTemplateName;
} CHOOSECOLOR, *LPCHOOSECOLOR;//颜色选择框结构体

 

 
自定义颜色:
CHOOSECOLOR cc = {0};//初始化为默认值
COLORREF cd[16];//存放16中自定义颜色
 
cc.lStructSize = sizeof(CHOOSECOLOR);
cc.lpCustColors = crf;//
cc.Flags = CC_FULLOPEN ;//设置颜色的标志
 
hdc = GetDC(hwnd);
ChooseColor(&cc);//创建一个能使用户从中选择颜色的通用颜色对话框
SetTextColor(hdc,cc.rgbResult);//选择颜色的结果放在rgbResult中。
 
以上总结来自Lee.Ye

转载于:https://www.cnblogs.com/leeyeah/archive/2012/08/05/2623960.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值