VC/Windows字体度量测试代码

简介: VC/Windows字体度量测试代码

VC/Windows字体度量参数研究及绘制效果_柳鲲鹏的博客-CSDN博客


看了上一篇博文,也许有人想看看代码,自己调试一下。这是代码:


// FontTest.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
//#include <atltypes.h>
//#include <afxwin.h>
#include "FontTest.h"
#define MAX_LOADSTRING 100
// 全局变量:
HINSTANCE hInst;        // 当前实例
TCHAR szTitle[MAX_LOADSTRING];      // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];    // 主窗口类名
// 此代码模块中包含的函数的前向声明:
ATOM    MyRegisterClass(HINSTANCE hInstance);
BOOL    InitInstance(HINSTANCE, int);
LRESULT CALLBACK  WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK  About(HWND, UINT, WPARAM, LPARAM);
HFONT               CreateMyFont(TCHAR *fontName, int height);
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
  UNREFERENCED_PARAMETER(hPrevInstance);
  UNREFERENCED_PARAMETER(lpCmdLine);
  // TODO: 在此放置代码。
  MSG msg;
  HACCEL hAccelTable;
  // 初始化全局字符串
  LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  LoadString(hInstance, IDC_FONTTEST, szWindowClass, MAX_LOADSTRING);
  MyRegisterClass(hInstance);
  // 执行应用程序初始化:
  if (!InitInstance (hInstance, nCmdShow))
  {
  return FALSE;
  }
  hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_FONTTEST));
  // 主消息循环:
  while (GetMessage(&msg, NULL, 0, 0))
  {
  if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  }
  return (int) msg.wParam;
}
//
//  函数: MyRegisterClass()
//
//  目的: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
  WNDCLASSEX wcex;
  wcex.cbSize = sizeof(WNDCLASSEX);
  wcex.style    = CS_HREDRAW | CS_VREDRAW;
  wcex.lpfnWndProc  = WndProc;
  wcex.cbClsExtra  = 0;
  wcex.cbWndExtra  = 0;
  wcex.hInstance  = hInstance;
  wcex.hIcon    = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_FONTTEST));
  wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);
  wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
  wcex.lpszMenuName = MAKEINTRESOURCE(IDC_FONTTEST);
  wcex.lpszClassName  = szWindowClass;
  wcex.hIconSm  = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
  return RegisterClassEx(&wcex);
}
//
//   函数: InitInstance(HINSTANCE, int)
//
//   目的: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
   hInst = hInstance; // 将实例句柄存储在全局变量中
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
   if (!hWnd)
   {
      return FALSE;
   }
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
   return TRUE;
}
HFONT CreateMyFont(TCHAR *fontName, int size)
{
  //size = MulDiv(-size,GetDeviceCaps(GetDC(NULL),LOGPIXELSX),72); 
  return CreateFont        //创建自定义字体
( size,    //字体的高度
  0, //由系统根据高宽比选取字体最佳宽度值
  0, //文本的倾斜度为,表示水平
  0,  //字体的倾斜度为
  FW_HEAVY,   
  0,      //非斜体字
  0,      //无下划线
  0,      //无删除线
  GB2312_CHARSET, //表示所用的字符集为ANSI_CHARSET
  OUT_DEFAULT_PRECIS, //输出精度为默认精度
  CLIP_DEFAULT_PRECIS,  //剪裁精度为默认精度
  DEFAULT_QUALITY,  //输出质量为默认值
  DEFAULT_PITCH|FF_DONTCARE,
//字间距和字体系列使用默认值
  fontName    //字体名称
  );
}
LRESULT paint(HWND hWnd, HDC hDC)
{
  HFONT metricsFont;  
  HFONT tipFont;
  HPEN hPen;
  LPWSTR title=L"泰山OFFICE";
  LPWSTR fontName = L"宋体";
  //LPWSTR fontName = L"Times New Roman";
  int    fontHeight = 100;
  LPWSTR testText = L"泰山Office";
  RECT clientDimension;    //存放客户区的尺寸
  POINT begin; //保存点的信息,org表示圆心坐标
  hPen=CreatePen(PS_SOLID,1,RGB(255,0,0));
  SelectObject(hDC,hPen); 
  GetClientRect(hWnd,&clientDimension); //获取客户区的尺寸
  if((clientDimension.right-clientDimension.left)<400|| (clientDimension.bottom-clientDimension.top)<300) //判断屏幕尺寸
  {
  MessageBox(hWnd,L"屏幕尺寸太小,无法绘图!",L"错误信息",0);
  return 0;
  }
  TCHAR buffer[100] = {0};
  begin.x = 100;
  begin.y = 150;
  // {{{{{{{{{{
  metricsFont=CreateMyFont(fontName, fontHeight);  //创建字体
  SelectObject(hDC,metricsFont); //将创建的字体句柄选入设备环境
  TEXTMETRIC tm;
  GetTextMetrics(hDC, &tm);
  wsprintf(buffer, testText);
  TextOut(hDC,begin.x,begin.y, buffer, lstrlen(buffer));
  // }}}}}}}}}}
  // {{{{{{{{{{
  int x = begin.x;
  int y = begin.y;
  int length = 500;
  int yPos[10] = {0};
  yPos[0] = begin.y;
  //leading, tmInternalLeading=0;
  yPos[1] = begin.y + tm.tmExternalLeading;
  //baseline
  yPos[2] = begin.y + tm.tmAscent;
  //tmHeight=tmDescent+tmAscent
  yPos[3] = begin.y + tm.tmAscent+ tm.tmDescent;
  tipFont=CreateMyFont(fontName, 14);
  SelectObject(hDC,tipFont); //将创建的字体句柄选入设备环境
  for (int i=0; i<10; i++)
  {
  y = yPos[i];
  if (y==0)
  {
    break;
  }
  wsprintf(buffer, L"%d", i);
  TextOut(hDC,x-10, y-7, buffer, lstrlen(buffer));
  MoveToEx(hDC, x, y, NULL);
  LineTo(hDC, x+length, y);
  }
  // }}}}}}}}}}
  // {{{{{{{{{{
  wsprintf(buffer, L"tmExternalLeading=%d, tmInternalLeading=%d",
  tm.tmExternalLeading, tm.tmInternalLeading);
  begin.x = 100;
  begin.y = 280;
  TextOut(hDC,begin.x,begin.y, buffer, lstrlen(buffer));
  wsprintf(buffer, L"tmAscent=%d, tmDescent=%d, tmHeight=%d",
  tm.tmAscent, tm.tmDescent,
  tm.tmHeight);
  begin.y += 20;
  TextOut(hDC,begin.x,begin.y, buffer, lstrlen(buffer));
  // }}}}}}}}}}
  DeleteObject(metricsFont);
  DeleteObject(tipFont);
  return 0;
}
//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的: 处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT  - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  int wmId, wmEvent;
  PAINTSTRUCT ps;
  HDC hDC;
  switch (message)
  {
  case WM_COMMAND:
  wmId    = LOWORD(wParam);
  wmEvent = HIWORD(wParam);
  // 分析菜单选择:
  switch (wmId)
  {
  case IDM_ABOUT:
    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    break;
  case IDM_EXIT:
    DestroyWindow(hWnd);
    break;
  default:
    return DefWindowProc(hWnd, message, wParam, lParam);
  }
  break;
  case WM_PAINT:
  hDC = BeginPaint(hWnd, &ps);
  paint(hWnd, hDC);
  EndPaint(hWnd, &ps);
  break;
  case WM_DESTROY:
  PostQuitMessage(0);
  break;
  default:
  return DefWindowProc(hWnd, message, wParam, lParam);
  }
  return 0;
}
// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
  UNREFERENCED_PARAMETER(lParam);
  switch (message)
  {
  case WM_INITDIALOG:
  return (INT_PTR)TRUE;
  case WM_COMMAND:
  if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
  {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
  }
  break;
  }
  return (INT_PTR)FALSE;
}

目录
相关文章
|
23天前
|
数据采集 机器学习/深度学习 大数据
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
这篇文章详细介绍了C3D架构在行为检测领域的应用,包括训练和测试步骤,使用UCF101数据集进行演示。
29 1
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
|
25天前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
2月前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
4天前
|
人工智能 测试技术 Windows
Windows 竞技场:面向下一代AI Agent的测试集
【10月更文挑战第25天】随着人工智能的发展,大型语言模型(LLMs)在多模态任务中展现出巨大潜力。为解决传统基准测试的局限性,研究人员提出了Windows Agent Arena,一个在真实Windows操作系统中评估AI代理性能的通用环境。该环境包含150多个多样化任务,支持快速并行化评估。研究团队还推出了多模态代理Navi,在Windows领域测试中成功率达到19.5%。尽管存在局限性,Windows Agent Arena仍为AI代理的评估和研究提供了新机遇。
20 3
|
1月前
|
XML 网络安全 数据格式
Kali渗透测试:Windows事件管理工具wevtutil的使用方法(一)
Kali渗透测试:Windows事件管理工具wevtutil的使用方法(一)
|
2月前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
67 6
基于Python访问Hive的pytest测试代码实现
|
2月前
|
Java C++
代码文件间重复性测试
本文介绍了如何使用代码相似性检测工具simian来找出代码文件中的重复行,并通过示例指令展示了如何将检测结果输出到指定的文本文件中。
|
2月前
|
测试技术 UED
软件测试的艺术:从代码到品质的探索之旅
在数字时代的浪潮中,软件已成为我们生活和工作不可或缺的一部分。然而,高质量的软件背后隐藏着一门鲜为人知的艺术——软件测试。本文将带你走进这门艺术的世界,从基础理论到实践应用,一起探索如何通过软件测试保障产品质量,提升用户体验,并最终实现从代码到品质的华丽转变。
|
2月前
|
敏捷开发 安全 测试技术
软件测试的艺术:从代码到用户体验的全方位解析
本文将深入探讨软件测试的重要性和实施策略,通过分析不同类型的测试方法和工具,展示如何有效地提升软件质量和用户满意度。我们将从单元测试、集成测试到性能测试等多个角度出发,详细解释每种测试方法的实施步骤和最佳实践。此外,文章还将讨论如何通过持续集成和自动化测试来优化测试流程,以及如何建立有效的测试团队来应对快速变化的市场需求。通过实际案例的分析,本文旨在为读者提供一套系统而实用的软件测试策略,帮助读者在软件开发过程中做出更明智的决策。
|
2月前
|
SQL JavaScript 前端开发
基于Java访问Hive的JUnit5测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下
69 6