Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 06.01.2019
Сообщений: 2

Отсутствие отображения нажатия на кнопки

25.01.2019, 17:29. Показов 854. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не получается самому допереть, но очень любопытно, что не так. Вот код.
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
#include <Windows.h>
 
LPCSTR m_applicationName;
HINSTANCE m_hInstance;
HWND m_hwnd;
 
static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    int screenWidth = 0, screenHeight = 0;
    WNDCLASS wc;
    int posX, posY;
 
    m_hInstance = GetModuleHandle(NULL);
    m_applicationName = "To";
 
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = m_hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = m_applicationName;
    
    if(!RegisterClass(&wc))
    {
        MessageBox(NULL, "Cannot register class", "Error", MB_OK | MB_ICONERROR);
        return false;
    }
 
    screenWidth = 964;
    screenHeight = 723;
 
    
    posX = (GetSystemMetrics(SM_CXSCREEN) - screenWidth)/2;
    posY = (GetSystemMetrics(SM_CYSCREEN) - screenHeight)/2;
 
    m_hwnd = CreateWindow(m_applicationName, m_applicationName, WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                            posX, posY, screenWidth, screenHeight, NULL, NULL, m_hInstance, NULL);
 
    if(!m_hwnd)
    {
        MessageBox(NULL, "Cannot create main window", "Error", MB_OK | MB_ICONERROR);
        return false;
    }
    
    MSG msg;
 
    while(GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return 0;
}
 
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HWND Button;
    static HWND Edit;
    
    switch(msg)
    {
        case WM_CREATE:
            Button = CreateWindow("BUTTON", "TB", WS_VISIBLE | WS_CHILD, 200, 200,
                                108, 22, hwnd, NULL, m_hInstance, NULL);
            Edit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", NULL, WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL,
                                100, 100, 140, 22,
                                hwnd, NULL, m_hInstance, NULL);
            break;
 
        case WM_PAINT:
        {
            
        }
        break;
 
        case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
 
        case WM_CLOSE:
        {
            DestroyWindow(hwnd);
            return 0;
        }
 
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);        
    }
}
Если создать окно, в него добавить кнопки или editbox'ы, добавить манифест на XP'шные кнопки, то при стартовой отрисовки кнопки не появляются, лишь после изменения размеров, а нажатие кнопки или же курсор в эдитбоксе отображаться не будет (со старым дизаном кнопок все хорошо). Все книги предлагают именно такой вариант написания. Но стоит изменить конец оконной процедуры на:
C++
1
2
3
4
5
6
7
8
9
...
        case WM_CLOSE:
        {
            DestroyWindow(hwnd);
            return 0;
        }
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
все начинает фурычить как нужно. Вот и вопрос, что такого делает манифест, что старый вариант не работает?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.01.2019, 17:29
Ответы с готовыми решениями:

Отсутствие в BIOS отображения устройств во вкладке Onboard Devices Configuration
Добрый день! Столкнулся с данной проблемой, когда возникла необходимость отключить в BIOS встроенную звуковую карту. В итоге я ее там...

Отлов нажатия кнопки submit и блокировка последующего нажатия
Привет всем! Нужен код, который способствует блокировке нажатия кнопки после одного нажатия на нее. Спасибо. Добавлено через 54...

Как из обработчика Form1_KeyPress вызвать событие для нажатия заданной по имени кнопки на форме (кнопки 0-9)
Пишу калькулятор. Есть несколько кнопок (Button) с цифрами и знаками. Для цифр имена кнопок: but_0, but_1, ... but_9 На все кнопки с...

1
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
25.01.2019, 18:54
Zerafs, полагаю, всему виной пустая отработка WM_PAINT.
В результате ничего не делалось.
Во втором случае отработка передается в DefWindowProc() и все работает.
Или уберите пустую отработку WM_PAINT, либо сделайте так:
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
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HWND Button;
    static HWND Edit;
    PAINTSTRUCT ps;    //для WM_PAINT
    HDC         hdc;    //для WM_PAINT
 
    switch (msg)
    {
    case WM_CREATE:
        Button = CreateWindow("BUTTON", "TB", WS_VISIBLE | WS_CHILD, 200, 200,
            108, 22, hwnd, NULL, m_hInstance, NULL);
        Edit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", NULL, WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL,
            100, 100, 140, 22,
            hwnd, NULL, m_hInstance, NULL);
        break;
 
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);  //!!!!!!!!!!!!!!!!!!
        
        EndPaint(hwnd, &ps);              //!!!!!!!!!!!!!!!!!!
        break;
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
 
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0; //И обязательно после ВСЕХ обработанных сообщений возвращать 0 (ну почти всех, есть исключения)
}
Добавлено через 1 минуту
И манифест тут совершенно ни при чем
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.01.2019, 18:54
Помогаю со студенческими работами здесь

Не запускается комп: индикатор возле кнопки Пуск на системнике зажегся только во время нажатия кнопки. После - не горит.
Просьба к форумчанам помочь в решении проблеммы. Сегодня вдруг отрубился комп во время работы. Если быть точнее, то аудио выключилось, а на...

Мультифон- отсутствие кнопки звонить
Устанавливаю последнюю версию программы Мультифон с сайта multifon.ru После установки не могу звонить, нет кнопочки звонок. Должно...

Создайте обработчик события нажатия кнопки мыши на форме (Click), который будет устанавливать все кнопки в активный режи
Доброго времени суток! Помогите сделать задачу пожалуйста я полный ноль! (с описанием если можно:cry:) Уточните условие задания,...

Путь прохождения прерывания от нажатия клавиши до отображения на экране
Всем привет. Сижу читаю статьи про прерывания, так для общего просвещения. Так основные принципы вроде как понятны, но хотелось бы...

Вызов процедуры нажатия кнопки с кнопки
При нажатии на Button1 создается экземпляр класса. Требуется, при нажатии на Button2 вызывать процедуру нажатия Button1, чтобы создался...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru