【问题标题】:Concatenate LPCTSTR for MessageBox [duplicate]为 MessageBox 连接 LPCTSTR [重复]
【发布时间】:2018-10-12 03:27:19
【问题描述】:

如何为 MessageBox 连接 LPCTSTR? Java中的语法是这样的

LPCTSTR str1 = "String2";
LPCTSTR str2 = "";
LPCTSTR str3 = "String1";
LPCTSTR finalMsg = "";

finalMsg = str1 + str2 + str3;

C++/Win32 的语法是什么? 谢谢!

【问题讨论】:

  • “语法”是使用字符串类,而不是指针。此外,如果您的应用程序是 Unicode,您的代码将无法编译。 LPCTSTR 是指向窄字符串或宽字符串的指针,具体取决于构建类型。
  • 不能修改内存,finalMsg指向因为LPCTSTR是指向const TCHAR的指针。

标签: c++ winapi tchar


【解决方案1】:

不要使用TCHAR,它适用于可针对不支持 Unicode 的 Windows 版本(即 Windows 98)的代码。

利用标准库字符串类来处理内存管理和连接。

std::wstring str1 = L"String2";
std::wstring str2 = L"";
std::wstring str3 = L"String1"
std::wstring finalMsg = str1 + str2 + str3;
MessageBoxW(..., finalMsg.c_str(), ...);

【讨论】:

    【解决方案2】:
    #include <windows.h>
    #include <tchar.h>
    
    int main()
    {
        LPCTSTR str1 = _T("String2");
        LPCTSTR str2 = _T("");
        LPCTSTR str3 = _T("String1");
    
        LPTSTR finalMsg = new TCHAR[_tcslen(str1) + _tcslen(str2) + _tcslen(str3) + 1];
        _tcscpy(finalMsg, str1);
        _tcscat(finalMsg, str2);
        _tcscat(finalMsg, str3);
    
        MessageBox(nullptr, finalMsg, _T("Message"), MB_OK);
    
        delete[] finalMsg;
    }
    

    Plan-B:使用std 字符串类:

    #include <windows.h>
    #include <tchar.h>
    
    #include <string>
    
    using tstring = std::basic_string<TCHAR>;
    
    int main()
    {
        tstring str1 = _T("String2");
        tstring str2 = _T("");
        tstring str3 = _T("String1");
    
        tstring finalMsg = str1 + str2 + str3;
    
        MessageBox(nullptr, finalMsg.c_str(), _T("Message"), MB_OK);
    }
    

    如果您不需要支持仅 ANSI 版本的 Windows,您可以完全放弃 TCHAR...TSTR 并使用 std::wstring,这是 std::basic_string 的模板特化 wchar_t

    【讨论】:

    • 你好,这很好用!谢谢!这仍然是我使用 C++ 的第三天。感谢您的帮助!
    • “这仍然是我使用 C++ 的第三天”。那么最好通过一本关于 C++ 的好(tm)教科书而不是玩 WinAPI。
    • 不是一个很好的答案。在调用MessageBox 时,最好使用wstring+ 运算符和c_str。令人失望的是,这个答案被接受了,它没有试图消除 TCHAR 的神话,而是继续使用 C 风格的字符串。
    • @DavidHeffernan 同意,尽管 std::wstring 也不一定正确,因为 TCHAR 的全部内容是它不必是 wchar_t。当然,在实践中,我们都使用std::wstring,因为我们知道我们的项目只针对一种角色类型,我们为了继续做事而埋下内疚。 ;) 使用这种方法然后显式调用MessageBoxW 会更正确。
    • @paddy 以 Unicode 为目标一点也不内疚。内疚将仍然使用 TCHAR,就好像它仍然是 20 世纪一样。所以是的wstring 在这里是正确的。是的,显式调用 W 版本。这就是我编辑 Jonathan 的 CW 答案的方式。
    【解决方案3】:

    使用 strcat() 复制旧的 C 样式字符串。

    或者更准确地说,_tcscat() 在大多数平台上都可以处理您使用的任何字符类型。

    请务必预先分配字符串缓冲区,使其足够大以容纳任何结果。

    TCHAR buff[128];
    
    _tcscpy(buff, str1);
    _tcscat(buff, str2);
    _tcscat(buff, str3);
    

    【讨论】:

    • 这样更好。
    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多