m0_67644151 2023-02-01 21:52 采纳率: 71.4%
浏览 50
已结题

【已废】【无用】C++中如何得到字符在html中显示的高度和长度

我的一个项目全文用C++编写,但在最后阶段需要得到一个字符串在某一字体下某一字号的实际显示高度和长度。

比如说,使用如下代码,

<html>
<head>
<meta charset="utf-8"> 
<title>TEST</title>
<style>
p {font-size:25px;}
p.sansserif{font-family:"Microsoft YaHei";}
</style>
</head>
<body>

<p class="sansserif">
<span>A</span>
<span>I</span>
<span></span>
<span></span>
</p>

</body>
</html>

,在浏览器中F12元素,选中span那一行可以显示当前字体的实际高度和长度(以px为单位)。

现在需要在这个C++程序中,运用某些方法得到特定字符串的显示高度和长度。

已经测试过如下代码:

        EM_ASM_INT(
            {
                function computeFontSize(str, size, family)
                {
                    let spanDom = document.createElement("span");
                    spanDom.style.fontSize = size;
                    spanDom.style.opacity = "0";
                    // spanDom.style.fontFamily = family;
                    spanDom.innerHTML = str;
                    document.body.append(spanDom);
                    let sizeD = {};
                    sizeD.width = spanDom.offsetWidth;
                    sizeD.height = spanDom.offsetHeight;
                    spanDom.remove();
                    return sizeD;
                }
            let str = currentDanmaku->Text;
            let st = computeFontSize(str, "16px", "Microsoft YaHei");
            return st;
            }
        );

编译器VS2022在EM_ASM_下划下划线,提示

#define EM_ASM_(code, ...) emscripten_asm_const_int(CODE_EXPR(#code)_EM_ASM_PREP_ARGS(_VA_ARGS_)
Old forms for compatibility, no need to use these.
Replace EM_ASM, EM_ASM_ARGS and EM_ASM_INT_V with EM_ASM_INT, and EM_ASM_DOUBLE_V with EM_ASM_DOUBLE.
扩展到: emscripten_asm_const_int((_extension_({_attribute_((section("em_asm"), aligned(1))) static const char x[] = "{function computeFontSize(str, size, family) { let spanDom = document.createElement("span"); spanDom.style.fontSize = size; spanDom.style.opacity ="0"; spanDom.innerHTML = str; document.body.append(spanDom); let sizeD = {}; sizeD.width = spanDom.offsetWidth; sizeD.height = spanDom.offsetHeight; spanDom.remove(); return sizeD; } }"; x; })),__em_asm_sig_builder<__typeof__(__em_asm_make_type_tuple())>::buffer)

按照提示修改为EM_ASM_INT,错误信息变为:

#define EM_ASM_INT(code, ...) emscripten_asm_const_int(CODE_EXPR(#code)_EM_ASM_PREP_ARGS(_VA_ARGS_)
Runs the given JavaScript code on the calling thread (synchronously), and returns an i32 back.
扩展到: emscripten_asm_const_int((_extension_({_attribute_((section("em_asm"), aligned(1))) static const char x[] = "{function computeFontSize(str, size, family) { let spanDom = document.createElement("span"); spanDom.style.fontSize = size; spanDom.style.opacity ="0"; spanDom.innerHTML = str; document.body.append(spanDom); let sizeD = {}; sizeD.width = spanDom.offsetWidth; sizeD.height = spanDom.offsetHeight; spanDom.remove(); return sizeD; } }"; x; })),__em_asm_sig_builder<__typeof__(__em_asm_make_type_tuple())>::buffer)

自始至终这行都报错

不允许强制转换到类型 "_attribute_"

附可能用到的源码:
Main.cpp

#include <fstream>
#include <iostream>
#include <map>
#include <math.h>
#include <string>

#include "D:\emsdk\upstream\emscripten\system\include\emscripten\emscripten.h"

#include "Character Comparator.h"
#include "Class of Danmaku.h"
#include "Data Type Converter.h"
#include "QuickSort.h"

//#include "Get String Length.js"

using namespace std;

int main()
{
    class Danmaku
    {
    public:
        int type;  // 类型
        __int64 row_id;    // row_id我发现的都有56位,于是用64位整型
        string Text;  // 要获取长度的字符串
        string Fontname;  // 字体名称
    };
...
    map<int, Danmaku*> AllDanmaku;
...
    currentDanmaku = AllDanmaku[serial];
...
    for (serial = 0;; serial++)
    {
...
        EM_ASM_INT(
            {
                function computeFontSize(str, size, family)
                {
                    let spanDom = document.createElement("span");
                    spanDom.style.fontSize = size;
                    spanDom.style.opacity = "0";
                    // spanDom.style.fontFamily = family;
                    spanDom.innerHTML = str;
                    document.body.append(spanDom);
                    let sizeD = {};
                    sizeD.width = spanDom.offsetWidth;
                    sizeD.height = spanDom.offsetHeight;
                    spanDom.remove();
                    return sizeD;
                }
            let str = currentDanmaku->Text;  // 需要传入的参数分别是这里的Text和下一行的FontName
            let st = computeFontSize(str, "25px", currentDanmaku->FontName);
            return st;  // 然后要把这个st传回C++代码,后续要对其进行运算。
            }
        );
...
    }

Get String Length.js (复制自https://blog.csdn.net/u014771745/article/details/102828237)

function computeFontSize(str, size, family) {
    let spanDom = document.createElement("span");
    spanDom.style.fontSize = size;
    spanDom.style.opacity = "0";
    // spanDom.style.fontFamily = family;
    spanDom.innerHTML = str;
    document.body.append(spanDom);
    let sizeD = {};
    sizeD.width = spanDom.offsetWidth;
    sizeD.height = spanDom.offsetHeight;
    spanDom.remove();
    return sizeD;
    }
let str = currentDanmaku->Text;
let st = computeFontSize(str, "25px", currentDanmaku->FontName);
return st;
  • 写回答

1条回答 默认 最新

  • m0_54204465 2023-02-02 08:18
    关注

    错误信息告诉你在VS2022编译器中,使用了废弃的EM_ASM_宏定义,建议替换为EM_ASM_INT。此外,在代码实现中还存在一些语法错误,导致编译失败。推荐对代码进行修正,再进行编译。

    错误信息表示无法将对象转换为 "attribute" 类型。可能是代码中存在语法错误,例如:

    "attribute" 在代码中未正确定义。
    "extension" 和 "attribute" 的使用语法不正确。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月5日
  • 已采纳回答 2月5日
  • 修改了问题 2月5日
  • 创建了问题 2月1日

悬赏问题

  • ¥15 怎样才能让鼠标沿着线条的中心线轨迹移动
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?
  • ¥15 win10权限管理,限制普通用户使用删除功能
  • ¥15 minnio内存占用过大,内存没被回收(Windows环境)
  • ¥65 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?