c语言的默认字体,Windows CreateFont:创建自己的字体

前面无论是使用文本输出函数还是 static 控件,字体都是默认的,比较丑陋,我们完全可以自己创建更加炫酷的字体。

创建字体使用 CreateFont 函数,它的原型是:

HFONT CreateFont(

int cHeight, //字体的逻辑高度

int cWidth, //字体的逻辑宽度

int cEscapement, //指定移位向量相对X轴的偏转角度

int cOrientation, //指定字符基线相对X轴的偏转角度

int cWeight, //设置字体粗细程度

DWORD bItalic, //是否启用斜体

DWORD bUnderline, //是否启用下划线

DWORD bStrikeOut, //是否启用删除线

DWORD iCharSet, //指定字符集

DWORD iOutPrecision, //输出精度

DWORD iClipPrecision, //剪裁精度

DWORD iQuality, //输出质量

DWORD iPitchAndFamily, //字体族

LPCSTR pszFaceName //字体名

);

上面的14个参数完全记住几乎不可能,下面是简单的说明,其他的“照猫画虎”即可。

1) 参数 cWidth 和 cHeight 通常取负值,且高度为宽度的2倍,如 -18 和 -9,即可指定 13.5 |(H+W)/2| 磅的字体。

2) 对于字体粗细程度 cWeight,可以使用 FW_ 开头的宏定义;一般取 FW_NORMAL (400),此参数需要值的值域为 [0,1000]。

3) 对于参数 bItalic、bUnderline、bStrikeOut,直接使用 TRUE 或 FALSE 传值即可。

4) 对于字符集 iCharSet,一般可以直接使用 DEFAULT_CHARSET 让系统自动处理。

注意:字体也是一种 GDI 对象,使用完后也要在 WM_DESTROY 消息中删除。

创建完字体后并不能立即使用,还需要手动触发 WM_SETFONT 消息,让Windows 将当前字体设置为我们创建的字体。

发送消息使用 SendMessage 函数,它可以让我们在必要时主动向窗口发送各种消息,原型为:

LRESULT SendMessage(

HWND hWnd, //发送消息的目标窗口句柄

UINT msg, //将要发送的消息

WPARAM wParam, //附加消息1

LPARAM lParam //附加消息2

);

这些参数和 WndProc 函数非常类似。没错,SendMessage 发送的消息就是由窗口过程来处理的。

设置字体的消息是 WM_SETFONT,只要向附加参数 wParam 传入 CreateFont 返回的句柄即可(需要转换到 WPARAM 类型)。请看下面的例子:

//窗口过程

LRESULT CALLBACK WndProc(

HWND hWnd,

UINT message,

WPARAM wParam,

LPARAM lParam

){

PAINTSTRUCT ps;

HDC hdc;

static HFONT hFont; //声明一个逻辑字体句柄为静态变量

static HWND labExample; //在初期,我们将其声明为静态变量

switch (message){

case WM_CREATE:

//创建逻辑字体

hFont = CreateFont(

-15/*高度*/, -7.5/*宽度*/, 0/*不用管*/, 0/*不用管*/, 400 /*一般这个值设为400*/,

FALSE/*不带斜体*/, FALSE/*不带下划线*/, FALSE/*不带删除线*/,

DEFAULT_CHARSET, //这里我们使用默认字符集,还有其他以 _CHARSET 结尾的常量可用

OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, //这行参数不用管

DEFAULT_QUALITY, //默认输出质量

FF_DONTCARE, //不指定字体族*/

L"微软雅黑" //字体名

);

//创建静态文本框控件

labExample = CreateWindow(

L"static", //静态文本框的类名

L"你好,欢迎来到C语言中文网" , //控件的文本

WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ | WS_BORDER /*带边框*/,

60 /*X坐标*/, 60/*Y坐标*/, 150/*宽度*/, 100/*高度*/, hWnd/*父窗口句柄*/,

(HMENU)1, //为控件指定一个唯一标识符

hInst, //当前实例句柄

NULL

);

//设置控件字体

SendMessage(

labExample, //欲设置字体的控件句柄

WM_SETFONT, //消息名(消息类型)

(WPARAM)hFont, //字体句柄

NULL //传空值即可

);

break;

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

// TODO: 在此添加任意绘图代码...

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

//请做好善后工作

DeleteObject(hFont);//删除创建的字体

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

运行效果:

881036e21733459c65d4319ad81d96f4.png

如上设置字体的方法几乎适用于所有的 Win32 标准控件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows 上,可以使用 Win32 API 中的 GDI (Graphics Device Interface) 来实现放大输出字体的功能。具体来说,可以使用 `CreateFont` 函数来创建一个指定大小的字体对象,然后使用 `SelectObject` 函数将该字体对象选入输出设备上下文中,从而实现输出放大字体的效果。 下面是一个简单的示例代码,演示如何使用 Win32 API 在窗口中输出放大的字体: ```c #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { static TCHAR szAppName[] = TEXT("HelloWin"); HWND hwnd; MSG msg; WNDCLASS wndclass; // 注册窗口类 wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR); return 0; } // 创建窗口 hwnd = CreateWindow(szAppName, TEXT("Hello, Windows!"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // 主消息循环 while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HFONT hFont; static int cxChar, cyChar; switch (message) { case WM_CREATE: { // 创建字体对象 hFont = CreateFont(24, 12, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, TEXT("Arial")); // 获取字体大小 HDC hdc = GetDC(hwnd); TEXTMETRIC tm; GetTextMetrics(hdc, &tm); cxChar = tm.tmAveCharWidth; cyChar = tm.tmHeight; ReleaseDC(hwnd, hdc); } return 0; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); // 选入字体对象 HFONT hOldFont = (HFONT)SelectObject(hdc, hFont); // 输出放大后的文本 TCHAR szText[] = TEXT("Hello, Windows!"); TextOut(hdc, cxChar, cyChar, szText, lstrlen(szText)); // 恢复原来的字体对象 SelectObject(hdc, hOldFont); EndPaint(hwnd, &ps); } return 0; case WM_DESTROY: // 释放字体对象 DeleteObject(hFont); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } ``` 在这个示例代码中,我们创建了一个 24 磅大小、Arial 字体字体对象,并使用 `SelectObject` 函数选入该字体对象。然后,在窗口的绘制过程中,使用 `TextOut` 函数输出放大后的文本。 需要注意的是,这个示例代码只是一个简单的演示,实际应用中可能需要更加复杂的处理逻辑,例如处理不同窗口大小、不同字体等情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值