Оконное приложение на С++

284
22 января 2018, 08:28

Выбивает ошибку:

Серьезность Код Описание Проект Файл Строка Состояние подавления

Ошибка C2440 =: невозможно преобразовать "const char [9]" в "LPCWSTR" Lab1 c:\users\валера\documents\visual studio 2015\projects\lab1\lab1\hello.cpp 15

#include <windows.h>
LONG WINAPI WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    HWND hwnd; // дескриптор окна
    MSG msg; // структура сообщения
    WNDCLASS w; // структура класса окна
                // Регистрация класса окна
    memset(&w, 0, sizeof(WNDCLASS));
    w.style = CS_HREDRAW | CS_VREDRAW;
    w.lpfnWndProc = WndProc; // имя оконной функции
    w.hInstance = hInstance;
    w.hbrBackground = (HBRUSH)(WHITE_BRUSH);
    w.lpszClassName = "My Class";
    RegisterClass(&w);
    // Создание окна
    hwnd = CreateWindow(L"MyClass",L"MyOkno",
        WS_OVERLAPPEDWINDOW, 500, 300, 500, 380, NULL, NULL, hInstance, NULL);
    ShowWindow(hwnd, nCmdShow); // отображение
    UpdateWindow(hwnd);          // перерисовка
                                 // Цикл обработки сообщений
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

Подскажите пожалуйста

Answer 1

Оберните все строки, передаваемые в WinAPI-функции, в TEXT(...). Пример:

w.lpszClassName = TEXT("My Class");
hwnd = CreateWindow(TEXT("MyClass"), TEXT("MyOkno"), /* ... */

Тогда вам не придётся разбираться ни с опцией проекта Configuration Properities -> General -> Charater Set, ни с A/W вариантами функций, ни с префиксом L для строк.

К слову, в вашем случае настройка Charater Set была выставлена в Use Multi-Byte Character Set (поэтому варианты функций и структур по умолчанию и ожидали LPCWSTR), но в поле w.lpszClassName вы пытались записать (сильно упрощая) ASCII-строку (забыли добавить префикс L к "My Class").

Answer 2

Это распространённая ошибка с WINAPI.

LPCWSTR - LONG POINTER CONST (наверное) WSTRING(WCHAR*)

Варианты решения:

  1. Использовать wstring s = L"uu";. Но тогда в cout уже s не передать(можно но оч сложно).

  2. добавить буковку A:

    WNDCLASSA w;
    RegisterClassA(&w);

и можно использовать обычный string

  1. Разобраться с юникодом указателями и классами wstring и string. Написать функции оператора << для wstring и т. д.

2 если хочется сразу. 1 если хочется сразу и весь функционал с юникодом. 3 для серьёзных проектов.

READ ALSO
Ошибка "Vector subscriptout of range&#39;&#39;

Ошибка "Vector subscriptout of range''

Начал недавно учиться программировать на c++ при выборе функции enter() во второй раз, моя программа выдаёт ошибку vector subscript out of range

260
Не удаётся скомпилировать код с файлом в качестве аргумента main (file.open(argv[1]))

Не удаётся скомпилировать код с файлом в качестве аргумента main (file.open(argv[1]))

В среде MVS2015 следующий код и вообще любой подобный:

246
с++ округляет деление

с++ округляет деление

Не могу понять причину, почему при делении вещественных чисел результат сам по себе округляется до 5 знаков после запятой

228
Работа с QDateEdit и QTimeEdit c++

Работа с QDateEdit и QTimeEdit c++

Как передать дату из QCalendarWidget в QDateEdit который находится на отдельном окне

252