如何初始化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
相关产品推荐
相关产品推荐

