|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,637
|
|||||||||||
callback - функции, как метод класса03.04.2023, 06:49. Показов 7184. Ответов 60
Метки нет (Все метки)
Здравствуйте! Хочу задать слудющий вопрос, хотя тема не нова, но я так её вкурить не могу, а именно, как задать в классе (метод класса) фукцию обратного вызова?
Есть функция, например, такая
почему если делать так, то выскакивает ошибка:
0
|
|||||||||||
| 03.04.2023, 06:49 | |
|
Ответы с готовыми решениями:
60
Метод класса не работает как callback-функция Методы класса как callback функции
|
|
Модератор
|
||
| 05.04.2023, 05:48 | ||
lParam при обработке WM_CREATE процедура окна получает CREATESTRUCT*.https://learn.microsoft.com/en... /wm-create https://learn.microsoft.com/en... atestructw Откуда там kwindow* ?
0
|
||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||||||
| 05.04.2023, 05:51 | |||||||
|
Только организовать все несколько иначе имеет смысл на мой взгляд. 1) Цикл обработки сообщений вынести из класса kwindow. Либо просто в _tWinMain(), либо "по модному" - сделать отдельный класс TApplication и в него это все вынести (хотя это перебор на мой взгляд). В самом деле: окон ведь может быть несколько, из какого Go() вызывать в вашем случае? "из любого" - конечно ответ, но все же нелогично, согласитесь, этот цикл - явно не к окну по смыслу относится. 2) switch с выбором сообщений явно надо перенести в метод WndProc(). А функция должна просто вызывать метод - и все.
Есть же MFC, например, можно посмотреть как там сделано API идеологически. Это как раз по сути простейшая обертка над WinApi
0
|
|||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 05.04.2023, 05:55 | ||
|
Тогда в моем примере надо, конечно, в WndProcProxy отдельно обработать WM_CREATE и в этом случае метод класса не вызывать. В общем-то нет никакого особого смысла в обработке этого сообщения.
0
|
||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,637
|
||||
| 05.04.2023, 06:32 [ТС] | ||||
|
0
|
||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||||||||
| 05.04.2023, 06:49 | |||||||||
|
Так что (в случае вашей реализации Go() ) вызвать win1.Go(); win2.Go(); не выйдет, т.к. в первом же Go() вы "застрянете" на всё время работы приложения. Добавлено через 5 минут
Да, можно разобраться как вызываются функции в машинном коде, как в них передаются параметры, как передаются параметры методов классов и т.д., на основании этих знаний навернуть ассемблерный код по "подмахиванию" байтиков в нужные места. Это всё увлекательно и быть может даже полезно в учебных целях и в целях профессиональной пальцерастопыки, но никакого практического смысла и никаких выигрышей в сравнении с вариантом выше не даёт абсолютно. Всё равно где-то у вас обязательно будет объявлена "просто функция" в любом её обличии, которая в итоге будет вызывать метод класса, указатель на который будет передаваться через lparam. Ибо иначе - никак.
0
|
|||||||||
|
Модератор
|
|||||||
| 05.04.2023, 08:03 | |||||||
|
https://github.com/Chuyu-Team/... unk.h#L225
0
|
|||||||
| 05.04.2023, 08:48 | |
|
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|
| 05.04.2023, 09:37 | |
|
politoto,
если вы видите разницу между ассемблерными вставками и прописыванием этого же в маш. кодах - ну я вас поздравляю, конечно.
0
|
|
|
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
|
|
| 05.04.2023, 09:59 | |
|
politoto,
Не факт что сработает. Исполнение кода на стеке/в куче может быть запрещено
0
|
|
| 05.04.2023, 10:22 | |
|
0
|
|
|
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
|
|||
| 05.04.2023, 11:50 | |||
|
Добавлено через 16 минут В простейшем случае можно так же просто this сохранить где-то в глобальной области и им пользоваться при вызове. Принципиальная суть от этого не изменится, только форма. Недостатки подходов, использующих глобальное состояние, думаю, никому не нужно здесь объяснять, хотя нужно сказать, что в определенных ситуациях это будет хорошо работать. Но я бы добавил что неизменность этой ситуации хорошо бы как-то гарантировать (но это не всегда возможно).
1
|
|||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,637
|
|||||||||||
| 05.04.2023, 21:47 [ТС] | |||||||||||
0
|
|||||||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||||
| 05.04.2023, 21:59 | |||||
|
Добавлено через 2 минуты Добавлено через 55 секунд Можно создать сколько угодно окон одного класса. Например, окна класса Button для кнопок. Добавлено через 1 минуту Тем более, что неактивные окна тоже должны получать свои сообщения (например, WM_PAINT), если систем их отправила. DispatchMessage() внутри себя умеет понимать какую оконную функцию дернуть, т.е. к какому классу относится окно для данного сообщения (по hwnd).
0
|
|||||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,637
|
|||||||||||||||
| 05.04.2023, 22:33 [ТС] | |||||||||||||||
|
Если действовать так как предлагал ты, то мы лишаемся такого средства С++, как полиморфизм, правильно?
И ещё, если объявлять функцию так, как она объявлена выше, то разве нельзя её использовать для обработки сообщений, она объявлена как static то есть this не помеха, тогда зачем этот финт нужен?
0
|
|||||||||||||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||||
| 05.04.2023, 22:57 | |||||
|
Многопоточное приложение что-ли? Разумеется, всю обработку сообщений можно сложить в WndProcProxy (она подразумевалась под "выше", да?). Но ведь вся ветка с того и началась: как функцию обработки сообщений - т.е. WndProc - сделать методом класса. И в ветке было показано как. И вдруг такой неожиданный вопрос.
0
|
|||||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,637
|
|||||
| 05.04.2023, 23:30 [ТС] | |||||
![]()
0
|
|||||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||||||
| 06.04.2023, 06:04 | ||||||
|
0
|
||||||
|
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
|
||
| 06.04.2023, 10:46 | ||
|
Не по теме: Не вы один.. походу ТС не знает что ему нужно. Ему предложили 100500 способов вызова метода класса как функции, но все ему не то...
0
|
||
| 06.04.2023, 10:46 | |
|
Нестатическая ссылка в статичной (BOOL CALLBACK EnumWindowsProc) функции внутри класса
CALLBACK функция как член класса
Как в аргумент функции передать указатель на метод класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|