Win32 программирование TextOut WM_Paint

0

Имея некоторые проблемы в этом блоке кода в строке 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;
  • 0
    LPCSTR определяется как typedef const char* LPCSTR; как работает string* = char* ?
  • 0
    Если вы используете Windows API, должен быть определен UNICODE .
Показать ещё 4 комментария
Теги:
winapi

2 ответа

3
Лучший ответ

Сообщение об ошибке объясняет, в чем проблема:

Тип LPCSTR является typedef (псевдоним для) const char *. Это указатель C-стиля, которым по умолчанию является константа "Something" (но не text).

Тип std::string - это typedef (псевдоним для) std::basic_string<char>. Это класс шаблонов C++, который используется для динамического управления строками, таких как строки С#/Java, или тип CString из MFC/ATL.

Строка &text является указателем на строковый объект, а не указателем на собственно строку. Аналогично, std::string не обеспечивает неявное преобразование в const char *. Вам нужно явно вызвать text.c_str() который предназначен для использования с API-интерфейсами, которые используют строки стиля C.

Для последнего аргумента TextOut вы можете передать -1 чтобы вычислить длину строки (не 1). Кроме того, поскольку у вас есть строка в объекте std::string, вы можете использовать text.size().

3

Вам нужно передать указатель на массив символов, а не на строку C++. Пытаться:

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

Обратите внимание, что вы запросили его для вывода только одного символа.

  • 1
    Должен быть TextOutA для соответствия std::string независимо от того, какой макрос UNICODE установлен.
  • 0
    @BenVoigt Или используйте typedef std::basic_string<TCHAR> tstring; так что вы можете использовать широко / Unicode варианты.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню