Имея некоторые проблемы в этом блоке кода в строке 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 *
. Это указатель 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()
.
Вам нужно передать указатель на массив символов, а не на строку C++. Пытаться:
TextOut( hdc, rect.right/2, rect.bottom/2, text.c_str(), 1 );
Обратите внимание, что вы запросили его для вывода только одного символа.
TextOutA
для соответствия std::string
независимо от того, какой макрос UNICODE
установлен.
typedef std::basic_string<TCHAR> tstring;
так что вы можете использовать широко / Unicode варианты.
LPCSTR
определяется какtypedef const char* LPCSTR;
как работаетstring* = char*
?UNICODE
.