You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何初始化const WCHAR*变量?结构体fontName类型是否需修改?

关于GdipCreateFontFamilyFromName参数与GDImDrawText结构体fontName类型的疑问

问题描述

GdipCreateFontFamilyFromName的第一个参数要求为const WCHAR*类型,请问如何以此初始化opt.fontName的值?现有GDImDrawText结构体中fontName声明为WCHAR*,是否需要修改该类型?相关代码如下:

struct GDImDrawText
{
    HWND hWnd;
    ARGB fontColor;
    int fontSize;
    int fontStyle = 0;
    WCHAR* fontName;  // <--- 是否需要改用其他类型?用哪种?
    int x = 0;
    int y = 0;
    int w;
    int h;
};  

//...

GDI gdip;
GDImDrawText opt;

opt.fontColor = 0xffffff;
opt.fontSize = 14; 
opt.fontName = L"Tahoma"; // <--- 这样写有问题吗?
opt.hWnd = hWnd; 
opt.x = 20;

gdip.mDrawText(g, opt);

//...

void GDI::mDrawText(GpGraphics* g, GDImDrawText opt)
{
    GpFontFamily* fontFamily;
    GdipCreateFontFamilyFromName(opt.fontName, 0, &fontFamily);
    //...
}

解答

1. 是否需要修改fontName的类型?

需要把GDImDrawText结构体里的fontName类型从WCHAR*改成const WCHAR*,原因有两点:

  • 匹配GdipCreateFontFamilyFromName的参数要求:该函数的第一个参数是const WCHAR*,意味着它不会修改传入的字符串内容,用const WCHAR*声明fontName能更准确表达这个语义,避免不必要的类型转换风险。
  • 消除编译器警告:L"Tahoma"是宽字符常量,类型为const WCHAR[],直接赋值给WCHAR*会触发编译器警告(允许通过非const指针修改常量属于不安全行为),改成const WCHAR*后就能解决这个问题,代码更合规。

修改后的结构体定义:

struct GDImDrawText
{
    HWND hWnd;
    ARGB fontColor;
    int fontSize;
    int fontStyle = 0;
    const WCHAR* fontName;  // 修改为const WCHAR*
    int x = 0;
    int y = 0;
    int w;
    int h;
};

2. 如何正确初始化fontName?

修改类型后,直接用宽字符常量初始化就完全合法:

opt.fontName = L"Tahoma";

如果需要使用动态生成的宽字符串(比如从用户输入获取字体名),可以将std::wstring的c_str()结果赋值给它,示例:

std::wstring customFont = L"Microsoft YaHei";
opt.fontName = customFont.c_str();

注意:使用std::wstring时,要确保在mDrawText函数执行期间,该std::wstring对象不会被销毁或修改,否则fontName会变成悬空指针。

内容的提问来源于stack exchange,提问作者Juliete

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 11:45:58