Какие изменения необходимо сделать, чтобы текстовое поле Windows с 2011 года работало сейчас, с 2019 года? - PullRequest
0 голосов
/ 25 мая 2019

Какие изменения необходимо сделать, чтобы это текстовое поле Windows 2011 года работало сейчас, в 2019 году?

Я пытался скомпилировать код в этот вопрос 2011 года о создании текстового поля C ++...

#include <windows.h>

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR nCmdLine, int nCmdShow)
{
    LPTSTR windowClass = TEXT("WinApp");
    LPTSTR windowTitle = TEXT("Windows Application");
    WNDCLASSEX wcex;

    wcex.cbClsExtra = 0;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.cbWndExtra = 0;
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hInstance = hInstance;
    wcex.lpfnWndProc = WndProc;
    wcex.lpszClassName = windowClass;
    wcex.lpszMenuName = NULL;
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    if (!RegisterClassEx(&wcex))
    {
        MessageBox(NULL, TEXT("RegisterClassEx Failed!"), TEXT("Error"), MB_ICONERROR);
        return EXIT_FAILURE;
    }

    HWND hWnd;

    if (!(hWnd = CreateWindow(windowClass, windowTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL)))
    {
        MessageBox(NULL, TEXT("CreateWindow Failed!"), TEXT("Error"), MB_ICONERROR);
        return EXIT_FAILURE;
    }

    HWND hWndEdit = CreateWindow(TEXT("Edit"), TEXT("test"), WS_CHILD | WS_VISIBLE | WS_BORDER, 100, 20, 140, 20, hWnd, NULL, NULL, NULL);

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    MSG msg;

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return EXIT_SUCCESS;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_DESTROY:
        PostQuitMessage(EXIT_SUCCESS);
    default:
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return FALSE;
}

Но, пытаясь построить его в Visual Studio 2019, я получаю ошибки из-за невозможности конвертировать "t_char" в "LPTSTR".

Итак, как это сделать?Я обновляю код для работы?И возможно ли это без включения каких-либо других файлов?

Ответы [ 2 ]

3 голосов
/ 25 мая 2019

Используйте LPCTSTR вместо LPTSTR:

LPCTSTR windowClass = TEXT("WinApp");
LPCTSTR windowTitle = TEXT("Windows Application");

LPTSTR - это TCHAR *

LPCTSTR является const TCHAR *

TEXT("literal") производит const TCHAR [].

Строковый литерал - это константные данные. Начиная с C ++ 11, вы больше не можете назначать строковый литерал указателю на non-const.

1 голос
/ 25 мая 2019

Выйти из бизнеса TCHAR полностью.Эти макросы TEXT предназначены для кросс-компиляции с кодом, предназначенным для запуска в Windows 9x.

Изменяет эти строки:

LPTSTR windowClass = TEXT("WinApp");
LPTSTR windowTitle = TEXT("Windows Application");

На это:

LPCWSTR windowClass = L"WinApp";
LPCWSTR windowTitle = L"Windows Application";

И затемвсе последующие использования макросов TEXT, как показано ниже:

MessageBox(NULL, TEXT("RegisterClassEx Failed!"), TEXT("Error"), MB_ICONERROR);

Чтобы быть просто широкими строками:

MessageBox(NULL, L"RegisterClassEx Failed!", L"Error", MB_ICONERROR);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...