LPCWSTR не будет правильно приведен к методу TextOut()

Фрагмент всего кода...

#include <windows.h>
#include <string>
#include <vector>
using namespace std;
//=========================================================
// Globals.
HWND ghMainWnd = 0;
HINSTANCE ghAppInst = 0;
struct TextObj
{
    string s; // The string object.
    POINT p; // The position of the string, relative to the
    // upper-left corner of the client rectangle of
    // the window.
};
vector<TextObj> gTextObjs;

// Step 1: Define and implement the window procedure.
LRESULT CALLBACK
WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    // Objects for painting.
    HDC hdc = 0;
    PAINTSTRUCT ps;
    TextObj to;
    switch( msg )
    {
        // Handle left mouse button click message.
        case WM_LBUTTONDOWN:
            {
                to.s = "Hello, World.";
                // Point that was clicked is stored in the lParam.
                to.p.x = LOWORD(lParam);
                to.p.y = HIWORD(lParam);
                // Add to our global list of text objects.
                gTextObjs.push_back( to );
                InvalidateRect(hWnd, 0, false);
                return 0;
            }
        // Handle paint message.
        case WM_PAINT:
            {
                hdc = BeginPaint(hWnd, &ps);
                for(int i = 0; i < gTextObjs.size(); ++i)
                TextOut(hdc,
                        gTextObjs[i].p.x,
                        gTextObjs[i].p.y,
                        gTextObjs[i].s.c_str(),
                        gTextObjs[i].s.size());
                        EndPaint(hWnd, &ps);
                return 0;
            }
        // Handle key down message.
        case WM_KEYDOWN:
            {
                if( wParam == VK_ESCAPE )
                DestroyWindow(ghMainWnd);
                return 0;
                // Handle destroy window message.
                case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
            }
    }
    // Forward any other messages we didn't handle to the
    // default window procedure.
    return DefWindowProc(hWnd, msg, wParam, lParam);
}

Проблема в том, что я получаю сообщение об ошибке из Visual Studio 2012, в котором говорится, что аргумент типа "const char*" несовместим с параметром типа LPCWSTR. Это происходит в этой строке кода:

hdc = BeginPaint(hWnd, &ps);
                for(int i = 0; i < gTextObjs.size(); ++i)
                TextOut(hdc,
                        gTextObjs[i].p.x,
                        gTextObjs[i].p.y,gTextObjs[i].s.c_str(), // <---happens here
                        gTextObjs[i].s.size());
                        EndPaint(hWnd, &ps);
                return 0;

Я попытался преобразование ((LPCWSTR)gTextObjs[i].s.c_str()), но, по-видимому, это ОЧЕНЬ неправильно, основываясь на исследованиях из-за одного байта на операцию с массивом символов до двух? Также получил предупреждение "C4018: '<' : signed/unsigned mismatch" после этого изменения. Я новичок в C++, и я довольно потерян на эту ошибку, учитывая, что преобразование является неправильным.

Я рассмотрел несколько различных потоков в SO, и, похоже, ничто не приспособлено к этому конкретному случаю (или я просто не совсем понимаю взаимосвязь между этими потоками и моей).:[

Кроме того, просто чтобы уточнить... преобразование "работает", НО оно печатает какой-то странный японский / китайский символ, выглядящий написанным, и оно всегда отличается.

1 ответ

Решение

TextOut разрешается в TextOutW. Это ожидает текст UTF-16. Вы передаете 8-битный текст. Либо переключитесь на UTF-16, удерживаемый в wstring, либо вызовите TextOutA.

Другие вопросы по тегам