【问题标题】:Win32 programming TextOut WM_PaintWin32 编程 TextOut WM_Paint
【发布时间】:2014-09-14 09:46:33
【问题描述】:

在 TextOut 行的这段代码中有一些问题:

error: cannot convert 'std::string* {aka std::basic_string<char>*}' to 
'LPCSTR {aka const char*}' for argument 4 to 
'BOOL TextOutA(HDC, int, int, LPCSTR, int)'

我已经搜索了一段时间,但找不到任何不会让我永远困惑或不会完成我想做的事情的东西,那就是画一个字符串。

case WM_PAINT:
        {
            HDC hdc;
            PAINTSTRUCT ps;
            string text = "Something";

            RECT rect;
            GetClientRect( hwnd, &rect );
            hdc = BeginPaint( hwnd, &ps );

            TextOut( hdc, rect.right/2, rect.bottom/2, &text, 1 );

            EndPaint( hwnd, &ps );
        }
        return 0;
        break;

【问题讨论】:

  • LPCSTR 被定义为typedef const char* LPCSTR; string* = char* 如何成立?
  • 如果您使用的是 Windows API,则应定义 UNICODE
  • @chris:那只会让事情变得更糟。
  • @BenVoigt,它会专门在这里。总体而言,支持某个特定代码页之外的字符的应用程序很不错。
  • @chris:UTF-8 代码页出奇地多才多艺,很少有人需要其他东西。

标签: c++ winapi


【解决方案1】:

错误信息说明了问题所在:

LPCSTR 类型是 const char * 的 typedef(别名)。这是一个 C 风格的指针,这是常量字符串 "Something" 的默认值(但不是 text)。

std::string 类型是 typedef(别名为)std::basic_string&lt;char&gt;。这是一个 C++ 模板类,用于动态管理字符串,如 C#/Java 字符串,或 MFC/ATL 中的 CString 类型。

&amp;text 行是指向字符串对象的指针,而不是指向字符串本身的指针。同样,std::string 不提供到const char * 的隐式转换。您需要显式调用 text.c_str(),它旨在与采用 C 样式字符串的 API 一起使用。

对于TextOut的最后一个参数,你可以通过-1得到它来计算字符串的长度(不是1)。或者,由于您在 std::string 对象中有字符串,您可以使用 text.size()

【讨论】:

    【解决方案2】:

    您需要将指针传递给 char 数组,而不是 C++ 字符串。试试:

    TextOut( hdc, rect.right/2, rect.bottom/2, text.c_str(), 1 );
    

    请注意,您已要求它只输出一个字符。

    【讨论】:

    • 无论UNICODE宏设置成什么,都应该是TextOutA来匹配std::string
    • @BenVoigt 或使用typedef std::basic_string&lt;TCHAR&gt; tstring;,这样您就可以使用宽/unicode 变体。
    • @reece:我已经确信这是一个糟糕的主意。如果您需要宽字符支持,请使用wstring 和以W 结尾的API。但是不要试图编写独立于字符大小的代码,这是零收益的很多问题。
    • @Ben 非常同意。但是,W 后缀很难看。删除它们并定义 UNICODE。没有真正的缺点。
    • @David:我使用 UNICODE 可切换宏作为全有或全无。要么使用_T 和函数宏,要么使用char/LPSTRwchar_t/LPWSTR 和真正的函数名称。 “删除 W”的缺点是代码的每一行都被预处理器重写。无论如何,知道真正的函数名是调试的先决条件,那么为什么要尝试将它们隐藏在源代码中呢?
    猜你喜欢
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 2018-12-04
    • 2011-05-29
    • 1970-01-01
    • 2022-12-09
    相关资源
    最近更新 更多