Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Искусственный интеллект
111 / 82 / 34
Регистрация: 26.08.2020
Сообщений: 591
Записей в блоге: 1
1

Код не работат. Где ошибка?

16.09.2020, 08:47. Показов 1878. Ответов 16

Hello everyone!
Чёта не работает вот это код из примеров:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <windows.h>
 
LRESULT CALLBACK WindowProcess(HWND, UINT, WPARAM, LPARAM);
 
int WINAPI WinMain(HINSTANCE hInst,
                   HINSTANCE hPrevInst,
                   LPSTR pCommandLine,
                   int nCommandShow){
    TCHAR className[] = "Мой класс";
    HWND hWindow;
    MSG message;
    WNDCLASSEX windowClass;
 
    windowClass.cbSize        = sizeof(windowClass);
    windowClass.style         = CS_HREDRAW | CS_VREDRAW;
    windowClass.lpfnWndProc   = WindowProcess;
    windowClass.lpszMenuName  = 0;
    windowClass.lpszClassName = className;
    windowClass.cbWndExtra    = 0;
    windowClass.cbClsExtra    = 0;
    windowClass.hIcon         = LoadIcon(0, IDI_WINLOGO);
    windowClass.hIconSm       = LoadIcon(0, IDI_WINLOGO);
    windowClass.hCursor       = LoadCursor(0, IDC_ARROW);
    windowClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    windowClass.hInstance     = hInst;
 
    if(!RegisterClassEx(&windowClass))
    {
        MessageBox(0, "Не получилось зарегистрировать класс!", "Ошибка", MB_OK);
        return 0;
    }
    hWindow = CreateWindow(className,
                           "Программа ввода символов",
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT,
                           0,
                           CW_USEDEFAULT,
                           0,
                           (HWND)0,
                           0,
                           HINSTANCE(hInst),
                           0
                          );
    if(!hWindow){
        MessageBox(0, "Не получилось создать окно!", "Ошибка", MB_OK);
        return 0;
    }
    ShowWindow(hWindow, nCommandShow);
    UpdateWindow(hWindow);
    while(GetMessage(&message, 0, 0, 0)){
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
    return message.wParam;
}
 
LRESULT CALLBACK WindowProcess(HWND hWindow,
                               UINT uMessage,
                               WPARAM wParameter,
                               LPARAM lParameter)
{
    HDC hDeviceContext;
    PAINTSTRUCT paintStruct;
    RECT rectPlace;
    HFONT hFont;
    static char text[2]={' ','\0'};
    switch (uMessage)
    {
    case WM_CREATE:
        MessageBox(0,
              "Пожалуйста, вводите символы и они будут отображаться на экране!",
              "ВНИМАНИЕ!!!", MB_ICONASTERISK|MB_OK);
        break;
    case WM_PAINT:
        hDeviceContext = BeginPaint(hWindow, &paintStruct);
        GetClientRect(hWindow, &rectPlace);
        SetTextColor(hDeviceContext, 0);
        hFont=CreateFont(90,0,0,0,0,0,0,0,
                         DEFAULT_CHARSET,
                         0,0,0,0,
                         "Arial Bold"
                         );
        SelectObject(hDeviceContext,hFont);
        DrawText(hDeviceContext, (LPCWSTR)text, 1, &rectPlace, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
        EndPaint(hWindow, &paintStruct);
        break;
    case WM_KEYDOWN:
        switch (wParameter)
        {
        case VK_HOME:case VK_END:case VK_PRIOR:
        case VK_NEXT:case VK_LEFT:case VK_RIGHT:
        case VK_UP:case VK_DOWN:case VK_DELETE:
        case VK_SHIFT:case VK_SPACE:case VK_CONTROL:
        case VK_CAPITAL:case VK_MENU:case VK_TAB:
        case VK_BACK:case VK_RETURN:
            break;
        default:
        text[0]=(char)wParameter;
        InvalidateRect(hWindow, 0, TRUE);
        break;
        }break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWindow, uMessage, wParameter, lParameter);
    }
    return 0;
}

Компилятор (GCC последней (наверное) версии прикрученный к notepad++ (да это полный трешь)) выдаёт вот такую ошибку:
Код
S:\Users\____________\Downloads\main\niam.cpp: In function 'LRESULT WindowProcess(HWND, UINT, WPARAM, LPARAM)':
S:\Users\____________\Downloads\main\niam.cpp:84:34: error: cannot convert 'LPCWSTR' {aka 'const wchar_t*'} to 'LPCSTR' {aka 'const char*'}
   84 |         DrawText(hDeviceContext, (LPCWSTR)text, 1, &rectPlace, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
      |                                  ^~~~~~~~~~~~~
      |                                  |
      |                                  LPCWSTR {aka const wchar_t*}
In file included from s:\mingw\include\windows.h:48,
                 from S:\Users\____________\Downloads\main\niam.cpp:1:
s:\mingw\include\winuser.h:3671:39: note:   initializing argument 2 of 'int DrawTextA(HDC, LPCSTR, int, LPRECT, UINT)'
 3671 | WINUSERAPI int WINAPI DrawTextA (HDC, LPCSTR, int, LPRECT, UINT);
      |                                       ^~~~~~
Help me please)
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.09.2020, 08:47
Ответы с готовыми решениями:

Препод говорит где - то ошибка в синтаксисе. Сам код взят из "жефри Рихтер - Создание эффективных WIN32 приложений" Пожалуйста, подскажите где ошибка!
// получаем код ошибки DWORD dwError = GetDlgItemInt(hwnd, IDC_ERRORCODE, NULL, FALSE); HLOCAL...

я вот написала код без использования функции, но не знаю где ошибка, т.к. счатает верно только для первоначального значения. Код C#
всем приветик) возникла проблема с заданием: Заливайте файлы на форум. я вот написала код...

Где ошибка (код маленьки)
Здравствуйте, вот код в котором какая то ошибка, он не выполняется. Ищу 3 часа, HELP. if...

неработает код где ошибка?
#include&lt;iostream&gt; using namespace std; int main() { int a1,a2,a3,a4; cout&lt;&lt;&quot;viberite...

16
Модератор
Эксперт CЭксперт С++
4661 / 4192 / 767
Регистрация: 07.10.2015
Сообщений: 8,661
16.09.2020, 11:52 2
Silin11, код вполне работает, но только если выключить UNICODE!
А т.к. сейчас во всех современных средах UNICODE включается по-умолчанию, то у Вас и не работает...
Чтобы заработало, причем везде, "заверните" все строки в макро TEXT():
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <windows.h>
 
LRESULT CALLBACK WindowProcess(HWND, UINT, WPARAM, LPARAM);
 
int WINAPI WinMain(HINSTANCE hInst,
                   HINSTANCE hPrevInst,
                   LPSTR pCommandLine,
                   int nCommandShow) {
    TCHAR className[] = TEXT("Мой класс");
    HWND hWindow;
    MSG message;
    WNDCLASSEX windowClass;
 
    windowClass.cbSize = sizeof(windowClass);
    windowClass.style = CS_HREDRAW | CS_VREDRAW;
    windowClass.lpfnWndProc = WindowProcess;
    windowClass.lpszMenuName = 0;
    windowClass.lpszClassName = className;
    windowClass.cbWndExtra = 0;
    windowClass.cbClsExtra = 0;
    windowClass.hIcon = LoadIcon(0, IDI_WINLOGO);
    windowClass.hIconSm = LoadIcon(0, IDI_WINLOGO);
    windowClass.hCursor = LoadCursor(0, IDC_ARROW);
    windowClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    windowClass.hInstance = hInst;
 
    if (!RegisterClassEx(&windowClass))
    {
        MessageBox(0, TEXT("Не получилось зарегистрировать класс!"), TEXT("Ошибка"), MB_OK);
        return 0;
    }
    hWindow = CreateWindow(className,
                           TEXT("Программа ввода символов"),
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT,
                           0,
                           CW_USEDEFAULT,
                           0,
                           (HWND) 0,
                           0,
                           HINSTANCE(hInst),
                           0
    );
    if (!hWindow) {
        MessageBox(0, TEXT("Не получилось создать окно!"), TEXT("Ошибка"), MB_OK);
        return 0;
    }
    ShowWindow(hWindow, nCommandShow);
    UpdateWindow(hWindow);
    while (GetMessage(&message, 0, 0, 0)) {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
    return message.wParam;
}
 
LRESULT CALLBACK WindowProcess(HWND hWindow,
                               UINT uMessage,
                               WPARAM wParameter,
                               LPARAM lParameter)
{
    HDC hDeviceContext;
    PAINTSTRUCT paintStruct;
    RECT rectPlace;
    HFONT hFont;
    static char text[2] = { ' ','\0' };
    switch (uMessage)
    {
        case WM_CREATE:
            MessageBox(0,
                       TEXT("Пожалуйста, вводите символы и они будут отображаться на экране!"),
                       TEXT("ВНИМАНИЕ!!!"), MB_ICONASTERISK | MB_OK);
            break;
        case WM_PAINT:
            hDeviceContext = BeginPaint(hWindow, &paintStruct);
            GetClientRect(hWindow, &rectPlace);
            SetTextColor(hDeviceContext, 0);
            hFont = CreateFont(90, 0, 0, 0, 0, 0, 0, 0,
                               DEFAULT_CHARSET,
                               0, 0, 0, 0,
                               TEXT("Arial Bold")
            );
            SelectObject(hDeviceContext, hFont);
            DrawText(hDeviceContext, (LPCWSTR) text, 1, &rectPlace, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
            EndPaint(hWindow, &paintStruct);
            break;
        case WM_KEYDOWN:
            switch (wParameter)
            {
                case VK_HOME:case VK_END:case VK_PRIOR:
                case VK_NEXT:case VK_LEFT:case VK_RIGHT:
                case VK_UP:case VK_DOWN:case VK_DELETE:
                case VK_SHIFT:case VK_SPACE:case VK_CONTROL:
                case VK_CAPITAL:case VK_MENU:case VK_TAB:
                case VK_BACK:case VK_RETURN:
                    break;
                default:
                    text[0] = (char) wParameter;
                    InvalidateRect(hWindow, 0, TRUE);
                    break;
            }break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWindow, uMessage, wParameter, lParameter);
    }
    return 0;
}
0
Модератор
Эксперт CЭксперт С++
4661 / 4192 / 767
Регистрация: 07.10.2015
Сообщений: 8,661
16.09.2020, 11:59 3
Silin11, впрочем, я был неправ. Ситуация с точностью до наоборот!
0
Модератор
Эксперт CЭксперт С++
4661 / 4192 / 767
Регистрация: 07.10.2015
Сообщений: 8,661
16.09.2020, 12:11 4
У Вас проект без UNICODE.
Но Вы в некоторых местах хотели передать указатели на UNICODE-строки...

Добавлено через 2 минуты
C++
84
            DrawText(hDeviceContext, (LPCSTR) text, 1, &rectPlace, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
Вернее, в одном месте
Исправьте - и все заработает...

Добавлено через 4 минуты
К слову, Вы обратили на ошибку, выданную Вам компилятором?
cannot convert 'LPCWSTR' {aka 'const wchar_t*'} to 'LPCSTR' {aka 'const char*'}
Т.е. он не смог преобразовать указатель wchar_t* в char* Что и немудрено...

Добавлено через 3 минуты
А мой первый вариант - для случая UNICODE...
При случае можете попробовать...
0
Искусственный интеллект
111 / 82 / 34
Регистрация: 26.08.2020
Сообщений: 591
Записей в блоге: 1
16.09.2020, 13:14  [ТС] 5
Цитата Сообщение от liv Посмотреть сообщение
Исправьте - и все заработает...
Как? Я пробовал. Бесполезно.
Цитата Сообщение от liv Посмотреть сообщение
К слову, Вы обратили на ошибку, выданную Вам компилятором?
Да.
0
Модератор
Эксперт CЭксперт С++
4661 / 4192 / 767
Регистрация: 07.10.2015
Сообщений: 8,661
16.09.2020, 13:29 6
Цитата Сообщение от Silin11 Посмотреть сообщение
Как?
Я ж показал, где ошибка...

Добавлено через 1 минуту
У Вас (LPCWSTR)text, а надо (LPCSTR)text
0
Искусственный интеллект
111 / 82 / 34
Регистрация: 26.08.2020
Сообщений: 591
Записей в блоге: 1
16.09.2020, 13:43  [ТС] 7
Но тогда вылезает
s:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: S:\Users\AE0E~1\AppData\Local\Temp\ccmWpeNF.o:niam.cpp.tex t+0xa1): undefined reference to `GetStockObject@4'
s:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: S:\Users\AE0E~1\AppData\Local\Temp\ccmWpeNF.o:niam.cpp.tex t+0x2bd): undefined reference to `SetTextColor@8'
s:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: S:\Users\AE0E~1\AppData\Local\Temp\ccmWpeNF.o:niam.cpp.tex t+0x334): undefined reference to `CreateFontA@56'
s:/mingw/bin/../lib/gcc/mingw32/9.2.0/../../../../mingw32/bin/ld.exe: S:\Users\AE0E~1\AppData\Local\Temp\ccmWpeNF.o:niam.cpp.tex t+0x34c): undefined reference to `SelectObject@8'
collect2.exe: error: ld returned 1 exit status
0
Модератор
Эксперт CЭксперт С++
4661 / 4192 / 767
Регистрация: 07.10.2015
Сообщений: 8,661
16.09.2020, 14:38 8
Цитата Сообщение от Silin11 Посмотреть сообщение
Но тогда вылезает
"Вылезает" не "тогда", а после исправления ошибки компиляции.
Это ошибки линковки, которые говорят, что не найдены указанные функции. Они находятся в gdi32.lib
Значит, эта либа не подключена в проекте.

Добавлено через 2 минуты
Как вариант, прописать в начале:
C++
1
#pragma comment (lib, "gdi32.lib")
0
Искусственный интеллект
111 / 82 / 34
Регистрация: 26.08.2020
Сообщений: 591
Записей в блоге: 1
16.09.2020, 14:46  [ТС] 9
Всё равно тоже самое

Добавлено через 29 секунд
Цитата Сообщение от liv Посмотреть сообщение
Значит, эта либа не подключена в проекте.
И как её подключить?
0
Модератор
Эксперт CЭксперт С++
4661 / 4192 / 767
Регистрация: 07.10.2015
Сообщений: 8,661
16.09.2020, 14:52 10
Цитата Сообщение от Silin11 Посмотреть сообщение
И как её подключить?
Я ж не знаю, как Вы запускаете компиляцию...
make, bat-файл или из среды (какой?)

Способ с #pragma не помог?
0
Искусственный интеллект
111 / 82 / 34
Регистрация: 26.08.2020
Сообщений: 591
Записей в блоге: 1
16.09.2020, 14:56  [ТС] 11
Цитата Сообщение от liv Посмотреть сообщение
Способ с #pragma не помог?
Нет

Добавлено через 56 секунд
Цитата Сообщение от liv Посмотреть сообщение
Я ж не знаю, как Вы запускаете компиляцию...
mingw прикрученный к нотепад ++ (можно сказать mingw из консоли)
0
Модератор
Эксперт CЭксперт С++
4661 / 4192 / 767
Регистрация: 07.10.2015
Сообщений: 8,661
16.09.2020, 14:59 12
Silin11, и? Где ответ на вопрос, как запускается компиляция?
0
Искусственный интеллект
111 / 82 / 34
Регистрация: 26.08.2020
Сообщений: 591
Записей в блоге: 1
16.09.2020, 15:00  [ТС] 13
В смысле, я ж писал куда делось то??
mingw из консоли
0
Модератор
Эксперт CЭксперт С++
4661 / 4192 / 767
Регистрация: 07.10.2015
Сообщений: 8,661
16.09.2020, 15:01 14
Лично я работаю в MStudio. Все, что надо настраивается в студии. И горя не знаю

Добавлено через 46 секунд
Цитата Сообщение от Silin11 Посмотреть сообщение
mingw из консоли
Как именно? Что запускается? Содержимое?
0
Искусственный интеллект
111 / 82 / 34
Регистрация: 26.08.2020
Сообщений: 591
Записей в блоге: 1
16.09.2020, 15:08  [ТС] 15
компиляция - g++ -o "$(CURRENT_DIRECTORY)\$(NAME_PART)" "$(FULL_CURRENT_PATH)" -static
запуск exeшника - "$(CURRENT_DIRECTORY)\$(NAME_PART)"

Добавлено через 53 секунды
Это запускается плагином для npp

Добавлено через 2 минуты
Цитата Сообщение от liv Посмотреть сообщение
Лично я работаю в MStudio. Все, что надо настраивается в студии. И горя не знаю
У меня нет админских прав, да и комп не потянет, поэтому приходится импровезировать.

Добавлено через 1 минуту
Лан не партесь, не особо мне это надо.

DEL
0
Модератор
Эксперт CЭксперт С++
4661 / 4192 / 767
Регистрация: 07.10.2015
Сообщений: 8,661
16.09.2020, 15:10 16
Silin11, ну и где задается путь до библиотек?
gdi32.lib - стандартная, по идее должна подключаться на автомате, но если нет пути, то где компилятор ее найдет?
Как задавать я не подскажу, не пользуюсь... Так что ищи. Ну или кто-то подскажет...
0
880 / 583 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
17.09.2020, 00:30 17
Лучший ответ Сообщение было отмечено Silin11 как решение

Решение

1) Как минимум в строке #84 надо заменить LPCWSTR на LPCTSTR.
2) Подправить, как уже говорили, поддержку обоих режимов ANSI/Unicode - действительно было бы очень хорошо.
3) Про проблему с компиляцией - вам тоже верно сказали: оно не находит функции, потому что у вас не прилинкована библиотека gdi32.lib.

Вот только MinGW вправду чё-то игнорирует "pragma-comment-lib"... ну...
Проще всего будет компилировать с доп-опциями: -lgdi32 или сразу с -mwindows (который включает и первое и ещё многое прочее).

Добавлено через 6 минут
Bash
1
g++ -o "$(CURRENT_DIRECTORY)\$(NAME_PART)" "$(FULL_CURRENT_PATH)" -mwindows -static
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.09.2020, 00:30

Элементарный код, где ошибка?
Здравствуйте! Имеется два класса, код детский, однако при компиляции выводит ошибку &quot;C:\Program...

Код не работает где ошибка?
Вот код, должен вернуть результат обработки $sing_hash но ksort выдает ошибку 1 параметр array_push...

Где ошибка? Код Хэмминга (15,11)
Ввожу 11-битовое кодовое слово, умножаю его на порождающую матрицу, получаю закодированное слово,...

нужно отредактировать код, где то ошибка
Задание Дана целочисленная квадратная матрица. Определить: 1. сумму элементов в тех столбцах,...

Написал код, но не могу понять где ошибка :[
type TForm3 = class(TForm) Edit1: TEdit; Label1: TLabel; Button1: TButton; ...

Где тут ошибка(вылезает 89)? Код Цезаря
&quot;Дан текст из 200 символов. Зашифровать этот текст кодом Цезаря (каждый символ заменяется другим...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.