|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
Всем привет. Срочно переписывается гора кода с (извините) Delphi, нужен класс, инкапсулирующий (невидимое) окно Windows. В наследниках класса может переопределяться оконная процедура, добавляться обработчики сообщений окна. В Delphi это было сделано с помощью AllocateHWnd (). Эта функция создает невидимое окно, и назначает ему оконную процедуру. Фокус в том, что процедура - не простая ("статическая"), а метод. Который можно объявить виртуальным/абстрактным и реализовывать в наследниках. AllocateHWnd() - осторожно, Delphi! Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
За фокус превращения метода класса в статическую функцию отвечает хитрая процедура MakeObjectInstance(): MakeObjectInstance () - тут всё ещё хуже. Код: pascal 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.
- от интерпретации текста которой я несколько теряюсь. Надо бы позвать программиста, да где же его взять в час ночи? Вопрос: как из нестатического метода объекта сделать статический? На C++, конечно. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 01:19 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
ъъъъъ как из нестатического метода объекта сделать статический В общем, сделал без извратов. Оставил процедуру статической. У метода создания окна CreateWindowEx*() есть параметр LPVOID lpParam , который представляет собой ссылку на особую структуру, которую я не использую. Вместо этого я передаю ссылку на экземпляр объекта. Далее, при создании окна эта самая оконная процедура вызывается для обработки сообщения WM_CREATE, и это значение доступно в параметре LPARAM оконной процедуры. Привожу ссылку к ссылке на экземпляр класса, и всё. Дальше, например, вызываю виртуальный метод класса и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 01:54 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
ъъъъъ У метода создания окна CreateWindowEx*() есть параметр LPVOID lpParam , который представляет собой ссылку на особую структуру, которую я не использую. Вместо этого я передаю ссылку на экземпляр объекта. Далее, при создании окна эта самая оконная процедура вызывается для обработки сообщения WM_CREATE, и это значение доступно в параметре LPARAM оконной процедуры. Привожу ссылку к ссылке на экземпляр класса, и всё. Не всё. :( В следующих (не WM_CREATE) вызовах оконной процедуры значение указателя уже недоступно. Надо его где-то хранить... хранить можно в окне: сохранить - SetWindowLongPtr() с индексом, равным GWL_USERDATA. Считывать GetWindowLongPtr()... вроде всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 02:05 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
ъъъъъ, непонятно, зачем такое порно было сделано. нет контекста, почему с разными методами вызывается а так все просто Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Если конечно, класс меняет состояния и надо их хранить между вызовами, тогда придется temp создавать в глобальной переменной (например списке), как в оригинале. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 02:12 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
Siemargl непонятно, зачем такое порно было сделано. Древняя VCL. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 02:50 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
Siemargl Если конечно, класс меняет состояния и надо их хранить между вызовами, тогда придется temp создавать в глобальной переменной (например списке), как в оригинале. Я ссылку в окне (GWL_USERDATA) храню, как выше написал. А оконную процедуру не подменяю, из неё вызываю обычный виртуальный метод класса (сохраненного в окне), вот и всё. Всем спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2021, 03:10 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
ъъъъъ ... Всем спасибо. Ещё вопрос. Посмотрите, пожалуйста, насколько крив код с точки зрения человека, не испорченного годами Delphi-кодинга. НапомнюНапомню, что : ъъъъъ ... переписывается гора кода с (извините) Delphi, нужен класс, инкапсулирующий (невидимое) окно Windows... Интерфейс класса: конструктор/деструктор, handle хэндл невидимого окна и метод add_msg(). Метод add_msg() - для добавления обработчика конкретного сообщения windows. Пример использования. Задача: через 3 секунды показать диалог "Привет!. Реализация: для экземпляра объекта создаем обработчик события WM_TIMER. Код: plaintext 1. 2. 3. 4. 5. 6.
Cоздаем таймер с интервалом 3000 мс. Код: plaintext 1.
Результат: ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 05:21 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
ъъъъъ, код: Интерфейс класса stealth_window Файл stealth_window.h Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Реализация класса stealth_window Файл stealth_window.cpp Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 05:25 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
ъъъъъ, Неиспорченные в дельфи7 для сообщений делали просто TList с адресами подписчиков) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 06:58 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
ъъъъъ, Какой смысл переписывать 20 летнюю программу с одних буковок на другие не трогая архитектуру и технологии. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 07:17 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
ъъъъъ, А зачем вам невидимое окно? Для таймеров в невизуальных компонентах? Неужели такая проблема есть и в wxWidgets? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 09:41 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
petrav, таймер - это просто пример. Это ядро диспетчера обмена сообщениями. Например, между нитями. Или, например, можно попросить ось, чтобы она тебе слала сообщения об изменении состояния группы файлов в конкретном директории. Много чего полезного с его помощью сделано. Наверняка в wxWidgets что-то свое есть. Но, как всегда, времени разбираться нет, трясти надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 10:33 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
Что-то моё сообщение удалили без всяких комментариев. Оно культурное было и по делу. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 18:14 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
типа wxEvtHandler ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 19:09 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
Alex_Ustinov типа wxEvtHandler Можно ловить виндосовские мессаги? Нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 21:01 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
ъъъъъ Alex_Ustinov типа wxEvtHandler Можно ловить виндосовские мессаги? Нельзя. QCoreApplication::installNativeEventFilter(). ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 21:28 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
petrav, я не планирую менять хорошо знакомого уродца, который безответно пашет уже много лет, на слабоизученое (мной) чудовище с непонятными возможностями и перспективой. И - при чем тут вообще Qt или wxW? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 21:52 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
ъъъъъ petrav, я не планирую менять хорошо знакомого уродца, который безответно пашет уже много лет, на слабоизученое (мной) чудовище с непонятными возможностями и перспективой. И - при чем тут вообще Qt или wxW? Если я Вам мешаю, то скажите и я замолчу. Просто я глубоко поражён тем, что Вы решаете проблемы, которые я решал 20-ть лет назад в институте. Вот всё сложилось… и невидимое окно, и как из нестатического метода сделать статический, и свой «унифицированный» обработчик Win сообщений, и вот это вот ::KillTimer(), регистрация своего класса окна. Я даже не сразу вспомнил всё это, но когда вспомнил — прямо пазл сложился. И всё это на фоне wxWidgets. Ну право слово… ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 22:04 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
petrav, можно конкретнее - что именно не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 22:17 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
ъъъъъ petrav, можно конкретнее - что именно не так? Всё нормально. Продолжайте работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2021, 22:39 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
ъъъъъ petrav, я не планирую менять хорошо знакомого уродца, который безответно пашет уже много лет, на слабоизученое (мной) чудовище с непонятными возможностями и перспективой. И - при чем тут вообще Qt или wxW? Форум публичный. Форум читает много народу. Зачем им кидатся писать свой менеджер сообщений рукописный? Только если ТС через слово повторяет - "мопед не мой, проект легаси и ничего менять не могу. Сроки". А фреймворки и решения приводят не вам а "оглашают" читающим тему. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.06.2021, 00:05 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
ъъъъъ, по моему, кто-то где-то перемудрил. Невиртуальный метод экземпляра класса, это обычная функция, которая принимает неявный параметр this и зачем приседания с виртуальной памятью - совершенно не понятно. Если у тебя есть массив с регистрацией методов окон, которые надо вызывать из обработчика сообщений - нафига весь этот огород? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2021, 10:00 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
Кстати, ТС не огласил версию дельфи. Но в 7ой было так что любая форма окно имела возможность подписки на сообщения от Оси из коробки. Одной строкой. Имхо менеджер событий ГУИ надо опирать на самой ГУИ. Невизуальные объекты без окон, надо опирать на свои механизмы. Универсализм - зло. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2021, 10:29 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Кстати, ТС не огласил версию дельфи. Но в 7ой было так что любая форма окно имела возможность подписки на сообщения от Оси из коробки. Одной строкой. Имхо менеджер событий ГУИ надо опирать на самой ГУИ. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 21:46 |
|
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
|
|||
---|---|---|---|
#18+
ъъъъъ Siemargl Если конечно, класс меняет состояния и надо их хранить между вызовами, тогда придется temp создавать в глобальной переменной (например списке), как в оригинале. Я ссылку в окне (GWL_USERDATA) храню, как выше написал. А оконную процедуру не подменяю, из неё вызываю обычный виртуальный метод класса (сохраненного в окне), вот и всё. Всем спасибо. По правильному, что бы получить смещение для SetWindowLong, нужно к GWL_USERDATA добавить cbWndExtra из структуры WNDCLASSA используемого вами класса окна. Так как cbWndExtra байт зарезервировано под функцию окна. Так же и в обратку, если ваша функция окна (lpfnWndProc) использует сколько-то байт из структуры окна, то вы должны при создании класса окна указать в cbWndExtra сколько байт использует ваша функция, что бы никто их не подпортил. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 08:53 |
|
|
start [/forum/topic.php?fid=57&msg=40075552&tid=2017201]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
others: | 240ms |
total: | 398ms |
0 / 0 |