【问题标题】:How do I convert a int to LPCTSTR? Win32如何将 int 转换为 LPCTSTR? Win32
【发布时间】:2011-11-03 07:46:08
【问题描述】:

我想在 win32 MessageBox 中显示一个 int 值。我已经阅读了一些不同的方法来执行这个演员。有人可以为我提供一个很好的实现。

Win32 编程新手,所以要轻松:)

更新

这就是我目前所拥有的。它有效..但文本看起来像中文或其他一些双字节字符。我不是在探索 Unicode 与不是 Unicode 类型。有人可以帮助我了解我哪里出错了吗?

 int volumeLevel = 6;
 std::stringstream os;
 os<<volumeLevel;
 std::string intString = os.str();  
  MessageBox(plugin.hwndParent,(LPCTSTR)intString.c_str(), L"", MB_OK);

【问题讨论】:

标签: c++ winapi


【解决方案1】:

n几种方法:

int value = 42;
TCHAR buf[32];
_itot(value, buf, 10);

另一种更友好的方式:

int value = 42;
const size_t buflen = 100;
TCHAR buf[buflen];
_sntprintf(buf, buflen - 1, _T("the value is %d"), value);

【讨论】:

  • 所以 _stprintf 会将格式化的字符串放入 TCHAR 缓冲区,然后可以将其转换为 LPCTSTR?
  • @Nick,LPCTSTR 只是 const TCHAR * 的另一个名称。当您在需要TCHAR *const TCHAR * 的上下文中使用TCHAR 数组时,编译器会自动为您提供一个指针。
  • @Jack,您需要使用 _T() 将该字符串文字包装在 _sntprintf 调用中。
  • 既然他用的是TCHAR而不是_TCHAR,那么字符串文字不应该用TEXT()而不是_T()包装吗?
【解决方案2】:

LPCTSTR 是这样定义的:

#ifdef  UNICODE
typedef const wchar_t* LPCTSTR;
#else
typedef const char* LPCTSTR;
#endif

std::string::c_str() 仅返回 const char*。您不能将const char* 直接转换为const wchar_t*。通常编译器会抱怨它,但是使用LPCTSTR 强制转换最终会迫使编译器关闭它。因此,它在运行时当然不会像您期望的那样工作。为了建立您的问题,您可能想要的是这样的:

// See Felix Dombek's comment under OP's question.
#ifdef UNICODE
typedef std::wostringstream tstringstream;
#else
typedef std::ostringstream tstringstream;
#endif

int volumeLevel = 6;    
tstringstream stros;    
stros << volumeLevel;     
::MessageBox(plugin.hwndParent, stros.str().c_str(), L"", MB_OK);  

【讨论】:

  • 如果不想使用typedef,也可以使用std::basic_ostringstream&lt;TCHAR&gt;
  • 这与一篇关于 MS 字符串的好文章一起是一个好的开始 :) 抱歉我对 w_char_t 与 char 的无知。我需要做一些研究。感谢所有的帮助。
【解决方案3】:

像 belov 一样为 MFC 转换:

int number = 1;

CString t;

t.Format(_T("%d"), number);

AfxMessageBox(t);

我用过,它对我有用。

【讨论】:

    【解决方案4】:
    int OurVariable;
    
    LPCWSTR result=(to_string(OurVariable).c_str());
    

    LPCWSTR result=LPCSTR(to_string(OurVariable).c_str());
    

    LPCSTR result=(to_string(OurVariable).c_str());
    

    它 确实有效

    【讨论】:

      【解决方案5】:

      _T() 装饰器用于Unicode 感知代码:

      int number = 1;
      
      CString t;
      
      t.Format(_T("%d"), number);
      
      AfxMessageBox(t);
      

      参考:https://social.msdn.microsoft.com/Forums/vstudio/en-US/f202b3df-5849-4d59-b0d9-a4fa69046223/how-to-convert-int-to-lpctstr?forum=vclanguage

      【讨论】:

      • 如果您使用与原始发帖人问题相同的变量名称,您的答案可能会更清楚。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2012-12-14
      • 2017-11-10
      • 2016-06-07
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      相关资源
      最近更新 更多