windows编程 文字与字体

本文介绍了在Windows编程中如何输出文字,包括获取设备上下文、设置字体颜色和背景、选择背景模式,以及创建和删除字体。通过BeginPaint()、EndPaint()、SetTextColor()、SetBkColor()、SetBkMode()、DrawText()和CreateFont()等函数,详细讲解了文字显示的相关步骤和技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、输出文字

要在窗口描画文字或图像,首先要先取得设备文本(Device Contexts)。取设备文本一般有2种方法,BeginPaint()函数和GetDC()函数。描画结束后必须调用EndPaint()函数和ReleaseDC()来释放设备文本。

要在窗口的某个位置描画文字,必须取窗口的有效区域(ClientRect),因为窗口的边框、菜单、工具条、状态条等部分是不能利用的。例如,要在窗口的正中间写一个字,用窗口宽度和高度的一半来取正中位置是不对的,除非这个窗口无任何边框、菜单、工具条、状态条等。正确的方法是先定义一个区域变量(类型为RECT),然后用GetClientRect()函数取出窗口有效区域放入这个变量中。最后,调用DrawText()函数在矩形区输出文字。所谓区域类型RECT其实就是一个存放矩形块座标的结构体,下面是RECT的原型。  

typedef struct tagRECT
{
    LONG    left;
    LONG    top;
    LONG    right;
    LONG    bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;


        case WM_PAINT: //重画窗口消息
            hdc = BeginPaint(hWnd, &ps);//开始描画
            // TODO: Add any drawing code here...
            RECT rt;
            GetClientRect(hWnd, &rt);//取窗口有效区域
            DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);//显示文字
            EndPaint(hWnd, &ps);//结束描画
            break;


使用BeginPaint()函数、EndPaint()函数时会同时得到一个结构体,里面有画图时的一些状态,一般为系统保留使用。


设置字体颜色:SetTextColor()

WINGDIAPI COLORREF WINAPI SetTextColor (HDC, COLORREF) //COLORREF -->DWORD-->unsigned long 前两个字节保留,后边是蓝绿红

如:SetTextColor(hdc, RGB(255, 0, 0));//0x0000FF 红色


设置文字背景色:SetBkColor

COLORREF SetBkColor( HDC hdc, COLORREF crColor );  

设置背景模式:SetBkMode

mode是要设置的模式,其值可以为OPAQUE和TRANSPARENT

OPAQUE的方式是用当前背景的画刷的颜色输出显示文字的背景,而TRANSPARENT是使用透明的输出,也就是文字的背景是不改变的。

说白点,如果当前的SetBkColor是蓝色,而窗体是白色,那么SetBkMode为OPAQUE时,文字的背景色就是蓝色,设置为TRANSPARENT时,背景色就是白色,或者说是没有背景色



另外一种文字输出 :TextOut

BOOL TextOut(
HDC hdc, // 设备描述表句柄
int nXStart, // 字符串的开始位置 x坐标
int nYStart, // 字符串的开始位置 y坐标
LPCTSTR lpString, // 字符串
int cbString // 字符串中字符的个数
);
如:TextOut(hdc, 30, 30, str, strlen(str));  


GetDC()函数与BeginPaint()函数的区别

在BeginPaint()函数的帮助上清楚地写着,这个函数将自动更新有效区。原来窗口只要发生任何改变,操作系统都会发送一个WM_PAINT消息来通知窗口刷新,在
WM_PAINT中使用BeginPaint()函数,这个函数自动告诉操作系统窗口已经是最新的了。而GetDC()没有这个功能,因此GetDC()一般不用于WM_PAINT消息中,如果一定要在WM_PAINT中使用,那就要用ValidateRect()函数来手动刷新窗口。  

        case WM_PAINT:

            hdc = GetDC (hWnd);
 
            SetTextColor(hdc, 0x0000FF);
            SetBkColor(hdc, 0xCDFAFF);
            TextOut(hdc,30,20,szHello,(int)strlen(szHello));
 
            //下面三行程序如果没有,窗口不正常地闪动
            RECT rt;
            GetClientRect(hWnd, &rt);
            ValidateRect(hWnd, &rt);    //让窗口有效区变得有效
            ReleaseDC (hWnd, hdc);

            break;

2、创建字体

CreateFont()

SelectObject()

。。。

SelectObject()

DeleteObject()

在一行中显示不下时,可以改变字体的大小来使一行能够显示。字体和后面章节中讲到的画笔、画刷的使用方法是一样的,都是调用SelectObject()函数来把字体句柄与设备文本句柄进行绑定,同时得到绑定前的字体句柄,用完之后,不能忘记把原来的字体句柄绑定回去,这样,后面如果还有程序的话,可以不受任何影响。  

创建字体是用CreateFont()函数来实现的,这儿说的“创建字体”并不是自创一个欧体还是柳体,而是创建一个字体对象,其中包括文字的宽度、高度、角度等许多信息。创建的字体用完之后也一定要手动删除,删除字体用DeleteObject()函数。  

例子:

   TCHAR str[] = "123";

    PAINTSTRUCT ps;
    HDC hdc;

    HFONT hFont, hFontOld;
    int  width, height;

        case WM_PAINT:
            RECT rc;
            hdc = BeginPaint(hWnd, &ps);
            GetClientRect(hWnd, &rc);
            SetBkMode(hdc, TRANSPARENT);
            width = (rc.right - 20) / (int)strlen(str);
            height = rc.bottom - 20;
            hFont = CreateFont(
                        height,      //字体的逻辑高度
                        width,       //逻辑平均字符宽度
                        0,           //与水平线的角度
                        0,           //基线方位角度
                        FW_REGULAR,  //字形:常规
                        FALSE,       //字形:斜体
                        FALSE,       //字形:下划线
                        FALSE,       //字形:粗体
                        GB2312_CHARSET,          //字符集
                        OUT_DEFAULT_PRECIS,      //输出精度
                        CLIP_DEFAULT_PRECIS,     //剪截精度
                        PROOF_QUALITY,           //输出品质
                        FIXED_PITCH | FF_MODERN, //倾斜度
                        "隶书"                   //字体
                    );  
            hFontOld = (HFONT)SelectObject(hdc, hFont);//选择字体
            SetTextColor(hdc, 0xC0C0C0);
            TextOut(hdc, 10, 10, str, (int)strlen(str));
            SelectObject(hdc, hFontOld);//选择旧字体
            DeleteObject(hFont);        //删除新字体  
            EndPaint(hWnd, &ps);
            break;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值