Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/41: Рейтинг темы: голосов - 41, средняя оценка - 4.61
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 921

Нажатие на кнопку- сабклассинг

05.08.2021, 21:35. Показов 8759. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал простую программу, в окне кнопка, подменил процедуру окна для кнопки, нажимаю на кнопке- ничего не происходит. В чем проблема? В процедуре кнопки так же пробовал обрабатывать WM_LBUTTONDOWN глючит нажатие на левую кнопку мыши в окне программы.
Заранее спасибо.

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
//оконная процедура для кнопки
LRESULT CALLBACK ButtonWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 
    WNDPROC Wndproc=(WNDPROC)(LONG_PTR)GetWindowLong(hWnd,GWL_USERDATA);
     switch(uMsg)
    {
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case IDC_BUTTON1:
                    MessageBox(NULL, "Процедура подменена", "сообщение", MB_OK);
                break;
            }
        break;
    }
 
    return CallWindowProc(Wndproc,hWnd,uMsg,wParam,lParam);
}
 
//оконная процедура основного окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    //char szBuff[256];
 
    switch ( uMsg )
    {
        case WM_CREATE:
            hButton = CreateWindowEx(NULL,"Button","button1", WS_CHILD | WS_VISIBLE, 0,40,100,20,hWnd,(HMENU) IDC_BUTTON1,hInst,NULL);
 
            SetWindowLong(hButton,GWL_USERDATA,GetWindowLong(hButton,GWL_WNDPROC));
            SetWindowLong(hButton,GWL_WNDPROC,(LONG)(LONG_PTR)ButtonWndProc);
        break;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.08.2021, 21:35
Ответы с готовыми решениями:

Как обработать нажатие на кнопку?
В диалоговом окне я создала кнопку "ОК". Нажав на нее должно закрыться диалоговое окно (так и происходит) и в главном окне должно что-то...

Долгое нажатие (зажатие) на созданную кнопку
Народ. Как-то давно пытался найти, потерпел неудачу и забил, а тут смерть как понадобилось, всё перерыл, но составить запрос в...

Сабклассинг Edit
Прошу помочь разобраться с проблемой, не получается сабклассировать Edit. Необходимо, чтобы он реагировал на нажатие клавиши enter'a,...

22
68 / 55 / 13
Регистрация: 26.07.2021
Сообщений: 191
19.08.2021, 18:34
Студворк — интернет-сервис помощи студентам
1. "LRESULT CALLBACK ButtonWndProc()" - это условно или и в самом деле в программе так написано? Потому что если и в самом деле, то откуда берутся hWnd и uMsg?

2. Сообщение BM_GETSTATE, отправленное кнопке, придёт в эту же самую ButtonWndProc(). Что она по его приходу сделает: ничего (вернёт 0) или вызовет функцию по умолчанию?

3. А на всякие мышиные события функция по умолчанию в конце вызывается?
0
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 921
21.08.2021, 12:03  [ТС]
tiun, что вы докапываетесь? У меня простой вопрос- у кнопки стиль ownerdraw. Как мне рисовать внешний вид кнопки в ее функции - не обрабатывать в родительском окне сообщение drawitem. Просто рисовать кнопку в ее функции, то есть типа реакция на сообщение WM_DRAWITEM но в функции окна для кнопки. Что тут не ясно?

В WM_PAINT в окне для кнопки я рисовать внешний вид кнопки не могу так как в WM_PAINT нету обработки состояний нажата кнопка или нет. WM_LBUTTONDOWN если ловить для этого у меня он возвращает return 0 - я пробовал не работает.

Нет ну есть простой способ перенести обработку сообщения wm_drawitem из функции родительского окна в функцию окна кнопки? Такой простой вопрос.

Добавлено через 1 минуту
Цитата Сообщение от tiun Посмотреть сообщение
это условно или и в самом деле в программе так написано?
вы наверно тут самый умный мне уже надоело объяснять проблему я перешел на псевдокод.
0
68 / 55 / 13
Регистрация: 26.07.2021
Сообщений: 191
22.08.2021, 01:36
Цитата Сообщение от kurlyak Посмотреть сообщение
что вы докапываетесь?
Я докапываюсь? Вовсе нет. Мне задают вопрос: "Почему программа работает не так, как хочется?" - и показывают маленький кусочек программы, которого совершенно недостаточно для ответа на это вопрос. Поэтому я пытаюсь объяснить, как оно вообще там всё устроено, в надежде, что человек, задавший вопрос, сам сможет понять, что у него не так.

Поехали ещё раз по пунктам:

1. Кнопка - это окно, и, как у каждого окна, у неё есть функция окна, которую мы здесь называем ButtonWndProc().

2. Если пользователь не назначил кнопке свою собственную ButtonWndProc(), то в качестве таковой используется стандартная системная функция.

3. ButtonWndProc() отвечает за обработку огромного количества разных событий, которые происходят в жизни кнопки. Среди этих событий - как события, которые бывают у любых окон, так и события, специфичные именно для кнопок. В том числе эта функция отвечает и за отрисовку кнопки.

4. Самодельная ButtonWndProc() должна либо обрабатывать все возможные события, либо передавать те, которые не обрабатывает, предыдущей функции. (А бывают и такие события, для которых предыдущую функцию нужно вызывать даже несмотря на наличие своей обработки.)

5. Хранение состояния кнопки, отслеживание изменения состояния и отвечание на запросы о состоянии - это тоже обязанность функции кнопки. Поэтому в случае самодельной ButtonWndProc() нужно либо всё это делать внутри неё, либо заботиться о том, чтобы предыдущая функция получала достаточно информации для выполнения этой работы.

6. Рисовать кнопку может понадобиться, если произошло событие одного из трёх типов: кнопку нажали (мышкой, клавиатурой или программно), кнопку отпустили, кнопка стала видимой на экране.

7. Извещения о событиях всех этих трёх типов приходят в ButtonWndProc(). Но есть одно исключение: если кнопка имеет стиль OWNERDRAW, то извещения о событиях первых двух типов приходят только функции её родителя, которая, формально, и должна заниматься отрисовкой. (Первые два типа - это когда у кнопки изменилось состояние. А третий тип - это когда перерисовка нужна, хотя состояние не изменилось, и в этом случае приходит ещё и извещение WM_DRAW самой кнопке.)

8. Фактически рисовать такую кнопку можно как в функции родительского окна, так и в ButtonWndProc(), которую можно вызвать из родительской а) напрямую или б) отправкой сообщения кнопке.

9. Узнать состояние кнопки в ButtonWndProc() можно либо передав ей из родительской функции то, что пришло в DRAWITEMSTRUCT, либо отправив сообщение BM_GETSTATE кнопке, либо передав его напрямую предыдущей функции. Если п.5 выполнен корректно, то ответ придёт правильный.
(Ещё есть псевдофункция Button_GetState(), но фактически это та же самая отправка BM_GETSTATE.)

Кликните здесь для просмотра всего текста
Цитата Сообщение от kurlyak Посмотреть сообщение
мне уже надоело объяснять проблему я перешел на псевдокод
40 лет назад, когда я изучал программирование, псевдокод выглядел иначе. Но главное - он никогда не был похож до степени неотличимости на реальный язык программирования.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.08.2021, 01:36

Программное нажатие на левую и правую кнопку мыши
как програмно нажать левую и правую клавишу мыши?

Нажатие на кнопку TCppWebBrowser
Всем доброй ночи. Вопрос окажется немного посложнее чем покажется в названии темы. Так вот. Я знаю как нажимать на страничке на компонент...

Нажатие на кнопку увеличивало значение переменной.
В общем нужно чтобы при нажатии на QPushButton значение переменной n увеличивалось на 1. Писал слот просто чтобы возвращал n+1. Но при...

Нажатие на кнопку только 1 раз в день
Нужно сделать что бы кнопку можно было нажать только 1 раз в день, и что бы данные когда далы эта кнопка нажата были сохранены. Не...

Как с эмулировать нажатие на кнопку веб страницы
Доброго времени суток, есть IP камера у которой есть зашитый в прошивку веб интерфейс.Есть потребность создать ПО которое бы эмулировало...


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru