将 wstringstream 转换为 LPCWSTR
Convert wstringstream to LPCWSTR
我是 Winapi 的初学者,我正在尝试像这样(在 WM_PAINT 内)将 wstringstream 转换为 LPCWSTR:
wstringstream ws;
ws << "my text" << endl;
LPCWSTR myWindowOutput = ws.str().c_str();
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 150, 305, myWindowOutput, 10);
虽然它只会产生垃圾,有人可以帮忙吗?谢谢。
LPCWSTR myWindowOutput = ws.str().c_str()
产生一个临时值(str() 调用的 return 值),它在完整语句结束后立即消失。由于您需要临时文件,因此需要将其向下移动到最终会消耗它的调用:
TextOutW(hdc, 150, 305, ws.str().c_str(), static_cast<int>(ws.str().length()));
同样,临时文件会一直存在到完整语句结束为止。这一次,这个长度足以让 API 调用使用它。
作为替代方案,您可以将 str()
的 return 值绑定到 const 引用 1),并改用它。这可能更合适,因为您需要两次使用 return 值(以获得指向缓冲区的指针,并确定其大小):
wstringstream ws;
ws << "my text" << endl;
hdc = BeginPaint(hWnd, &ps);
const wstring& s = ws.str();
TextOutW(hdc, 150, 305, s.c_str(), static_cast<int>(s.length()));
1) 在 GotW #88: A Candidate For the “Most Important const”. 下解释了为什么这样做
我是 Winapi 的初学者,我正在尝试像这样(在 WM_PAINT 内)将 wstringstream 转换为 LPCWSTR:
wstringstream ws;
ws << "my text" << endl;
LPCWSTR myWindowOutput = ws.str().c_str();
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 150, 305, myWindowOutput, 10);
虽然它只会产生垃圾,有人可以帮忙吗?谢谢。
LPCWSTR myWindowOutput = ws.str().c_str()
产生一个临时值(str() 调用的 return 值),它在完整语句结束后立即消失。由于您需要临时文件,因此需要将其向下移动到最终会消耗它的调用:
TextOutW(hdc, 150, 305, ws.str().c_str(), static_cast<int>(ws.str().length()));
同样,临时文件会一直存在到完整语句结束为止。这一次,这个长度足以让 API 调用使用它。
作为替代方案,您可以将 str()
的 return 值绑定到 const 引用 1),并改用它。这可能更合适,因为您需要两次使用 return 值(以获得指向缓冲区的指针,并确定其大小):
wstringstream ws;
ws << "my text" << endl;
hdc = BeginPaint(hWnd, &ps);
const wstring& s = ws.str();
TextOutW(hdc, 150, 305, s.c_str(), static_cast<int>(s.length()));
1) 在 GotW #88: A Candidate For the “Most Important const”. 下解释了为什么这样做