|
Объясните мне как делать сабклассинг нескольких контролов в .Net
|
|||
---|---|---|---|
#18+
Глядел сюда: How to subclass windows in Windows Forms by using Visual Basic .NET or Visual Basic 2005 Если речь идет об Form1 то прямо в ней пишем: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
А вот если надо например сабклассить Button1, Button2 и кучу чего еще... В VB6 я тупо делал по своей ф-ции на каждый контрол: Код: vbnet 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.
Здесь (по указанной ссылке) сразу приглянулся вариант: Subclass Any HWND Получилось вот чего: Код: vbnet 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.
Ну т.е. при таком подходе предполагается, что при добавлении сабклассинга нового контрола будет добавляться Код: vbnet 1. 2. 3. 4.
и основной код переработки будет добавляться непосредственно в класс (в единственную ф-цию), а разделение итти через case(hwnd): Код: vbnet 1. 2. 3. 4. 5.
Вопрос 1. Нельзя ли что-то улучшить? Потому как я здесь для себя вырабатываю алгоритм который очевидно буду применять многократно. С одной стороны я могу создать по классу на каждый контрол, но чувствую так не делают. С другой стороны чувствую что s1 и s2 уже и так разделены (разные экземпляры класса), но зачем-то проверяю Me.s_NewControl.Handle, да еще и внутри класса. Фраза "Now s1 should be listening to the Button1's messages" заставляет задуматься что обработку надо вынести куда-то в другое место и вместо Case Me.s_NewControl.Handle использовать Case s1,s2,s3 (м.б. по типу if (e.name)=s1 then...) В общем нужно как-то это добить а моя видимо "недоученность" не позволяет мне грамотно дооформить этот код. Не поможете? Вопрос 2. Сабклассинг снимать надо? И правильно ли я это делаю? Код: vbnet 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2013, 07:15 |
|
Объясните мне как делать сабклассинг нескольких контролов в .Net
|
|||
---|---|---|---|
#18+
Дмитрий77, создать наследника для каждого типа контрола - самый прямой и честный путь(в смысле ООП) если хочется в привычном стиле по функции на каждый контрол - тогда по классу наследнику NativeWindow на каждый контрол(вместо каждой функции) Сахару подсыпать конечно можно - создать единственный экземпляр SubclassHWND на форму (или класс контролов) и в нём на каждый контрол регистрировать делегат обработчик, причём регистрировать сам контрол, а не его hwnd) в SubclassHWND подписаться на закрытие формы и сделать ReleaseHandle не задумываясь SubclassHWND можно сделать и поумнее - на самые часто используемые сообщения - создать по виртуальному методу на нужное сообщение в SubclassHWND, а дальнейших наследниках перекывать при необходимости. во втором варианте - регистрировать разные делегаты на разные сообщения, если параметром делегата сделать не собственно Message, а осмысленные параметры - лямбда может оказаться корошо читаемой конкретика зависит от количества как типов контролов так и количества экземпляров(регистровать обработчики перечислением имён контролов, типов, задействовать тэги, ограничитьконтейнерами на форме и т д) P.S. сомнения в правильности выбора инструмента меня не покидают ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2013, 08:24 |
|
Объясните мне как делать сабклассинг нескольких контролов в .Net
|
|||
---|---|---|---|
#18+
Изопропил, Я тут еще порыскал, а вот так сойдет? Чтоб шибко не умничать. По крайней мере я "разделил" более грамотно. Ничего не упустил? Код: vbnet 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.
Меня еще смущает в данном случае вариант когда НЕ НАДО обрабатывать msg . Эквивалентно ли m = Nothing (выделено в коде) конструкции Exit Sub/Exit Function непосредственно в Sub WndProc которая минует MyBase.WndProc(m) По крайней мере в приведенном выше тесте первая кнопка не нажимается. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2013, 08:50 |
|
Объясните мне как делать сабклассинг нескольких контролов в .Net
|
|||
---|---|---|---|
#18+
Дмитрий77Эквивалентно ли m = Nothing (выделено в коде) конструкции Exit Sub/Exit Function непосредственно в Sub WndProc которая минует MyBase.WndProc(m) М.б. лучше Код: vbnet 1.
??? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2013, 09:25 |
|
Объясните мне как делать сабклассинг нескольких контролов в .Net
|
|||
---|---|---|---|
#18+
Дмитрий77, 1)Call base.WndProc for unhandled messages 2)не надо из обработчика бросать исключений. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2013, 10:37 |
|
Объясните мне как делать сабклассинг нескольких контролов в .Net
|
|||
---|---|---|---|
#18+
Изопропил, вот такой говнокод получше видимо будет Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2013, 13:37 |
|
Объясните мне как делать сабклассинг нескольких контролов в .Net
|
|||
---|---|---|---|
#18+
ИзопропилИзопропил, вот такой говнокод получше видимо будет Код: 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.
Я так понимаю, ответ на мой вопрос (который единственный меня серьезно беспокоит в моем коде) Дмитрий77Дмитрий77Эквивалентно ли m = Nothing (выделено в коде) конструкции Exit Sub/Exit Function непосредственно в Sub WndProc которая минует MyBase.WndProc(m) М.б. лучше Код: vbnet 1.
??? есть: Изопропил2)не надо из обработчика бросать исключений. Если я делаю: Код: vbnet 1. 2. 3. 4.
то m передается в CallBackProc ByRef Соответственно Код: plaintext 1. 2. 3.
приведет к выполнению кода Код: vbnet 1.
что наверно не правильно, потому как правильно вообще ничего не делать (когда не хотим обрабатывать сообщение). OK, в VB6 есть такое событие: Код: vbnet 1. 2. 3.
Поступая по аналогии... Как такой вариант? Я думаю, здесь уже не придраться. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2013, 00:13 |
|
Объясните мне как делать сабклассинг нескольких контролов в .Net
|
|||
---|---|---|---|
#18+
Дмитрий77аписал бы хотя бы C# было бы проще. это был c# :( ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2013, 00:56 |
|
Объясните мне как делать сабклассинг нескольких контролов в .Net
|
|||
---|---|---|---|
#18+
Изопропилэто был c# :( Да? Ну извини тогда. Я на C# не пишу, видимо специфический синтаксис, многие обороты с ходу не понять. Но в любом случае не сумел понять идеи. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2013, 01:15 |
|
Объясните мне как делать сабклассинг нескольких контролов в .Net
|
|||
---|---|---|---|
#18+
Дмитрий77видимо специфический синтаксис это у бейсика специфический Код: vbnet 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2013, 11:40 |
|
|
start [/forum/topic.php?fid=20&msg=38402235&tid=1404011]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
others: | 347ms |
total: | 494ms |
0 / 0 |