zoukankan      html  css  js  c++  java
  • Windows CreateFont:创建自己的字体

    原文地址:http://blog.csdn.net/softn/article/details/51718347

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

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

    
    
    1. HFONT CreateFont(
    2. int cHeight, //字体的逻辑高度
    3. int cWidth, //字体的逻辑宽度
    4. int cEscapement, //指定移位向量相对X轴的偏转角度
    5. int cOrientation, //指定字符基线相对X轴的偏转角度
    6. int cWeight, //设置字体粗细程度
    7. DWORD bItalic, //是否启用斜体
    8. DWORD bUnderline, //是否启用下划线
    9. DWORD bStrikeOut, //是否启用删除线
    10. DWORD iCharSet, //指定字符集
    11. DWORD iOutPrecision, //输出精度
    12. DWORD iClipPrecision, //剪裁精度
    13. DWORD iQuality, //输出质量
    14. DWORD iPitchAndFamily, //字体族
    15. LPCSTR pszFaceName //字体名
    16. );

    上面的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 函数,它可以让我们在必要时主动向窗口发送各种消息,原型为:

    
    
    1. LRESULT SendMessage(
    2. HWND hWnd, //发送消息的目标窗口句柄
    3. UINT msg, //将要发送的消息
    4. WPARAM wParam, //附加消息1
    5. LPARAM lParam //附加消息2
    6. );

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

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

    
    
    1. //窗口过程
    2. LRESULT CALLBACK WndProc(
    3. HWND hWnd,
    4. UINT message,
    5. WPARAM wParam,
    6. LPARAM lParam
    7. ){
    8. PAINTSTRUCT ps;
    9. HDC hdc;
    10. static HFONT hFont; //声明一个逻辑字体句柄为静态变量
    11. static HWND labExample; //在初期,我们将其声明为静态变量
    12. switch (message){
    13. case WM_CREATE:
    14. //创建逻辑字体
    15. hFont = CreateFont(
    16. -15/*高度*/, -7.5/*宽度*/, 0/*不用管*/, 0/*不用管*/, 400 /*一般这个值设为400*/,
    17. FALSE/*不带斜体*/, FALSE/*不带下划线*/, FALSE/*不带删除线*/,
    18. DEFAULT_CHARSET, //这里我们使用默认字符集,还有其他以 _CHARSET 结尾的常量可用
    19. OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, //这行参数不用管
    20. DEFAULT_QUALITY, //默认输出质量
    21. FF_DONTCARE, //不指定字体族*/
    22. L"微软雅黑" //字体名
    23. );
    24. //创建静态文本框控件
    25. labExample = CreateWindow(
    26. L"static", //静态文本框的类名
    27. L"你好,欢迎来到C语言中文网" , //控件的文本
    28. WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ | WS_BORDER /*带边框*/,
    29. 60 /*X坐标*/, 60/*Y坐标*/, 150/*宽度*/, 100/*高度*/, hWnd/*父窗口句柄*/,
    30. (HMENU)1, //为控件指定一个唯一标识符
    31. hInst, //当前实例句柄
    32. NULL
    33. );
    34. //设置控件字体
    35. SendMessage(
    36. labExample, //欲设置字体的控件句柄
    37. WM_SETFONT, //消息名(消息类型)
    38. (WPARAM)hFont, //字体句柄
    39. NULL //传空值即可
    40. );
    41. break;
    42. case WM_PAINT:
    43. hdc = BeginPaint(hWnd, &ps);
    44. // TODO: 在此添加任意绘图代码...
    45. EndPaint(hWnd, &ps);
    46. break;
    47. case WM_DESTROY:
    48. //请做好善后工作
    49. DeleteObject(hFont);//删除创建的字体
    50. PostQuitMessage(0);
    51. break;
    52. default:
    53. return DefWindowProc(hWnd, message, wParam, lParam);
    54. }
    55. return 0;
    56. }

    运行效果:


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

  • 相关阅读:
    关于在MAC上进行 LARAVEL 环境 Homestead 安装过程记录
    js 贷款计算器
    js 实现阶乘
    js 两点间距离函数
    composer Your requirements could not be resolved to an installable set of packages
    vue 项目优化记录 持续更新...
    vue 项目打包
    vue 真机调试页面出现空白
    vue 真机调试
    谈谈-Android状态栏的编辑
  • 原文地址:https://www.cnblogs.com/lzhu/p/8319333.html
Copyright © 2011-2022 走看看