|
|
|
класс-оболочка
|
|||
|---|---|---|---|
|
#18+
VC2005/winapi Приветствую всех! Сижу уже целый день в гугле, глаза вместе с головой уже квадратно-гиперболические, но так и не нашел ни одного примера класса-оболочки для оконных классов static, button, edit и др. Кто-нибудь пробовал написать нечто подобное? Может знаете ссылки? Ну тогда вы просто обязаны в меня ими кинуть, в голову, желательно, аккурат между квадратно-гиперболические глаз. HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam Проблема собственно в том, что не могу понять как мне обрабатывать сообщения поступающие к подобного рода классу. Допустим у меня есть класс CMyStatic Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. есть глобальный обработчик сообщений для всех экземпляров этого класса LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); но хотелось бы использовать как в MFC внутренний обработчик сообщений, для каждого экземляра класса свой Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2007, 22:44 |
|
||
|
класс-оболочка
|
|||
|---|---|---|---|
|
#18+
Cerebrum есть глобальный обработчик сообщений для всех экземпляров этого класса LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); но хотелось бы использовать как в MFC внутренний обработчик сообщений, для каждого экземляра класса свой Спасибо! Вариант следующий.(Уже где-то предлагал, по-моему). Создаем некий базовый класс для всех "своих" оконных элементов, в нем делаем метод WndProc - виртуальный/абстрактный, например. А также делаем внутри класса ещё одну оконную процедуру - статическую. При создании окна устанавливаем При помощи SetWindowLongPtr (или как там его) поле GWLP_USERDATA устанавливаем его в значение this. При создании окна передаем оконную статическую оконную процедуру, где этот самый указатель берется, преобразуется в this, и уже вызывается виртуальная оконая процедура конкретно этого класса. Т.е. что-то вроде: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. инициализации окна передаем ему в качестве оконной процедуры MyWindowClass::commonWndProc, а потом устанавливаем пол GWLP_USERDATA в указатель равный this... Если нужно именно для каждого экземпляра свой, то можно сделать поле указатель на функцию, запихнуть его в класс и вызывать его... Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2007, 23:42 |
|
||
|
класс-оболочка
|
|||
|---|---|---|---|
|
#18+
спасибо , дружище, буду пробовать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2007, 10:45 |
|
||
|
класс-оболочка
|
|||
|---|---|---|---|
|
#18+
маленько запутался.... :) итак, 1. Создаем базовый класс, пусть будет как у тебя Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 2. Нужен класс CMyStatic производный от MyWindowClass Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. здесь Код: plaintext 1. 2. В общем опять туплю не по децки, на тебя одна надежда...help ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2007, 16:58 |
|
||
|
класс-оболочка
|
|||
|---|---|---|---|
|
#18+
Cerebrum Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Вообще вот так: Код: plaintext 1. 2. 3. 4. я такую вещь делал когда-то через SetWindowLong, но сейчас появились 64битные системы, а SetWindowLong на 64бит работать не будет по понятным причинам. ЗЫ. Обернуть бы это все как-нибудь по-красивей виртуальными методами :-\ А то немного коряво получается - так как в конструктор виртуальные методы вызывать бесполезно... Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2007, 18:15 |
|
||
|
класс-оболочка
|
|||
|---|---|---|---|
|
#18+
да насчет обертки я тоже так думаю, но это потом, а пока мне надо понять логику, а то у меня складывается впечатление, что мы говорим о разных вещах. Я правильно понял, ты предлагаешь использовать потом в глобальном обработчике сообщений для класса CMyStatic нечто подобное Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2007, 18:31 |
|
||
|
класс-оболочка
|
|||
|---|---|---|---|
|
#18+
Cerebrum да насчет обертки я тоже так думаю, но это потом, а пока мне надо понять логику, а то у меня складывается впечатление, что мы говорим о разных вещах. Я правильно понял, ты предлагаешь использовать потом в глобальном обработчике сообщений для класса CMyStatic нечто подобное Нет, не правильно. Я вот это имел в виду: Код: 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. MyWindowClass::commonWndProc будет одна для всех классов, никогда не будет меняться. Её можно будет запихнуть даже в private а оверрайды/обработку сообщений переопределять (wndProc) в каждом из потомков MyWindowClass, при этом все будет работать. Конечно, работать будет только если поле GWLP_USERDATA будет устновлено в this и класс будет производным от MyWindowProc. Потом можно офигеть и вычленить каждое из нужных сообщений, сделать обертку для них в виде виртуальных функций или присваиваемых переменных, и получится новый VCL :) Пример потомка (для разъяснений): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. нужна только для того, чтобы передать обработку сообщений внутрь класса, которому принадлежит окно, больше ни для чего другого. Вопросы? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2007, 00:01 |
|
||
|
класс-оболочка
|
|||
|---|---|---|---|
|
#18+
вопрос только один: почему я такой тупой, что сразу не допер!? спасибо, Erv пошел пробовать, а то что-то у меня такие чудеса начались, что даже самому старшно... -------------------------------------------------------------- [не претендую на уникальность] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2007, 09:11 |
|
||
|
класс-оболочка
|
|||
|---|---|---|---|
|
#18+
немного оффтоп, но возможно что он как-то связан с тем что я затеял Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. больше никаких функций в этом классе нет, то есть фактически я эмулирую создание и разрушение окна. Значение m_hWnd остается прежним, кто разрушает окно? Родитель? -------------------------------------------------------------- [не претендую на уникальность] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2007, 11:37 |
|
||
|
класс-оболочка
|
|||
|---|---|---|---|
|
#18+
Cerebrum wrote: > больше никаких функций в этом классе нет, то есть > фактически я эмулирую создание и разрушение окна. Значение m_hWnd остается > прежним, кто разрушает окно? Идей нету. Винды под рукой тоже. Можно почитать справку. Или отладить с установкой бряков. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2007, 18:33 |
|
||
|
класс-оболочка
|
|||
|---|---|---|---|
|
#18+
Cerebrum пишет: > больше никаких функций в этом классе нет, то есть фактически я эмулирую > создание и разрушение окна. Значение m_hWnd остается прежним, кто > разрушает окно? Родитель? Да кто угодно. Windows может разрушить. Это не важно на самом деле. По концепции Windows окно - это объект, как надо его разрушить, ему посылается WM_DESTROY. Оно уничтожается. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2007, 21:13 |
|
||
|
класс-оболочка
|
|||
|---|---|---|---|
|
#18+
MasterZiv Да кто угодно. Windows может разрушить. Это не важно на самом деле. По концепции Windows окно - это объект, как надо его разрушить, ему посылается WM_DESTROY. Оно уничтожается. ПО моему, понял. В оконной процедуре вызывается DefWindowProc (или как там её), она и гасит окно... Хотя и другие вариант могут быть. (Если честно, никогда не делал IsWindow перед DestroyWindow). Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2007, 00:38 |
|
||
|
класс-оболочка
|
|||
|---|---|---|---|
|
#18+
тоже решил забить, просто делаю DestroyWindow(), если hWnd != NULL; спасибо -------------------------------------------------------------- [не претендую на уникальность] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2007, 08:56 |
|
||
|
класс-оболочка
|
|||
|---|---|---|---|
|
#18+
ну вот, создание оконной библиотеки с нуля: http://www.relisoft.com/win32/index.htm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2007, 17:44 |
|
||
|
класс-оболочка
|
|||
|---|---|---|---|
|
#18+
maXmoну вот, создание оконной библиотеки с нуля: http://www.relisoft.com/win32/index.htm премного благодарен! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2007, 19:11 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=295&tid=2028906]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
109ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 455ms |

| 0 / 0 |
