|
А как грамотно сделать свой контрол именно на базе Inherits Control
|
|||
---|---|---|---|
#18+
Ну вот смотрю в сорцы http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/TreeView.cs Хочу сделать свой Treeview чтоб он воткнулся в .Net-идеологию Накатал вот так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Сдается мне что этого недостаточно чтоб он создался-отобразился вызовом New MyTreeview и Me.Controls.Add() и с ним можно было работать. Т.е. TV даже не отображается, отображается пустой шаблон "Control". А что дальше делать? В какое место Source Code смотреть, чтоб сделать по аналогии и чтоб это был именно ".Net контрол"? Я могу конечно отступить от идеологии и сделать как в коде ниже(что собственно поначалу и стал ваять), но это стандартный API-метод, он работает (функция Create, я Listview так в VB6 делал), но "Control" сам по себе, а m_hwndTV сам по себе: у меня вписанный m_hwndTV например не получает фокуса по TAB и полностью побороть это я не могу. Код: 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. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2016, 16:18 |
|
А как грамотно сделать свой контрол именно на базе Inherits Control
|
|||
---|---|---|---|
#18+
А дальше надо сделать Код: vbnet 1. 2. 3. 4. 5. 6. 7.
И он появится. Только сразу нарываюсь на проблему из-за которой начал сыр-бор, из-за которой не получается использовать TVS_EX_RICHTOOLTIP. Примечания к итемам неродные. Судя по всему кривая система ToolTip-ов наследуеся из "Controls". Посему правильный путь таки тот "длинный код" что я привел в первом посте, т.е. не делать cp.ClassName = WC_TREEVIEW, а делать CreateWindowEx самому, это по крайней мере работает как хочется. Но тогда остается не очень простой вопрос с получением фокуса по TAB для m_hwndTV, о чем пытался спросить в соседнем топике. WM_SETFOCUS/WM_KILLFOCUS играть конечно можно, но мне пока не удалось сымитировать правильное поведение. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2016, 21:59 |
|
А как грамотно сделать свой контрол именно на базе Inherits Control
|
|||
---|---|---|---|
#18+
Дмитрий77, сорцы winforms - доступны ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2016, 22:26 |
|
А как грамотно сделать свой контрол именно на базе Inherits Control
|
|||
---|---|---|---|
#18+
Изопропил, ну дык я в них и пытаюсь копаться если ты заметил. Там только проблема с переопределением поведения Tooltip-ов похоже глубоко зарыта. Получается не в Treeview.cs Но в Controls.cs я тоже что-то не нашел. Если с фокусом удастся побороться, то сделаю по своему. Хотя правильнее б было побороться именно с Net-тултипом и оставить Net контрол, знать бы как. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2016, 22:39 |
|
А как грамотно сделать свой контрол именно на базе Inherits Control
|
|||
---|---|---|---|
#18+
попробуй поискать тултип в Inherits Control. тултип используется всеми контролами, поэтому логично искать его в базовом классе. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2016, 15:43 |
|
А как грамотно сделать свой контрол именно на базе Inherits Control
|
|||
---|---|---|---|
#18+
Antonariyпопробуй поискать тултип в Inherits Control. тултип используется всеми контролами, поэтому логично искать его в базовом классе. Не вижу я никаких намеков в Controls.cs, а даже если б они там и были не факт что удалось бы что-то поменять. Здесь варианты какие: 1) действительно найти и восстановить родное поведение, при котором TVS_EX_RICHTOOLTIP применится к .Net контролу - ничего не получается 2) Нарисовать Treeview через API (код в первом посте), тогда TVS_EX_RICHTOOLTIP работает, но проблема с TABSTOP. Ее решить в принципе получается, но манипуляции с SetFocus (API), WM_SETFOCUS, WM_KILLFOCUS приводят к глюкам со стилем TVS_EX_FADEINOUTEXPANDOS (когда стрелочки на Treeview пропадают при переводе фокуса не мгновенно а как бы растворяются постепенно). 3) Вариант нарисовать свой подобный Tooltip по TTN_SHOW (ну в принципе я это умею делать), но высчитывать координаты TV-итема и накладывать картинку + текст тултипа точно на картинку + текст итема - это жесть. Плюс нафига я должен это делать когда есть задокументированный стиль. Думаю проще таки на это все забить как я уже хотел сделать и оставить все как есть (с .Net -тултипами). Обидно однако. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2016, 15:49 |
|
А как грамотно сделать свой контрол именно на базе Inherits Control
|
|||
---|---|---|---|
#18+
Дмитрий77, Ёлы-палы, ты как смотришь? Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 10:05 |
|
А как грамотно сделать свой контрол именно на базе Inherits Control
|
|||
---|---|---|---|
#18+
ЕвгенийВДмитрий77, Ёлы-палы, ты как смотришь? Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Ну и? Видел я этот код, конкретно вчера даже игрался с ним. Он никак не влияет на несъедание .Net-ом стиля TVS_EX_RICHTOOLTIP. Он делает следующее: Тултип, который TTN_SHOW выводится без этого кода "где попало", т.е. не на итеме а стандартно под мышкой (под местом где она сунулась в Node). Смысл кода в том, что он высчитывает Handle node определяет RECT node через tV_HITTESTINFO и позиционирует Tooltip (handle которого берется из TTN_SHOW ) над node. При этом еще и ошибается на пару пикселей (Tooltip слазит чуть вверх и влево, перекрывая картинку итема). В родном Treeview тултип четко ложится на текст node без всяких корректирующих кодов (и картинка на картинку если TVS_EX_RICHTOOLTIP). Еще надо вернуть 1 в WndProc чтобы это работало (что и делается в Treeview.cs) Или я чего-то еще не доглядел в этом коде? (насчет реанимации TVS_EX_RICHTOOLTIP?) Ну собственно исходя из того что имеем, остается только брать этот кривой Tooltip (к которому относится упомянутый код), применять к нему этот код (с нек. модификациями), далее изменять размер Tooltip и пририсовывать на него картинку слева (через CustomDraw тупо на hdc тултипа), при этом еще перерисовывать текст (текст соответственно надо сместить вправо). Самое сложное там еще "закрасить" "оригинальный текст" тултипа (менять из WndProc нельзя, вызовет цепную реакцию из TTN_SHOW), но через сностый workaround это таки делается. Я вчера это уже сделал, вроде все получилось. Самопал, но выглядит как оригинал. Надо ж добить хоть как то. Допилю, выложу. м.б. даже проект. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2016, 15:48 |
|
А как грамотно сделать свой контрол именно на базе Inherits Control
|
|||
---|---|---|---|
#18+
Дмитрий77Допилю, выложу. м.б. даже проект. Все, доделал вчера. По сути я этот стиль "нарисовал". Единственное, я не буду Inherits TreeView, а просто использую свой SubclassHWND (как обычно делаю) для оригинального TreeView - оба варианта есть в приложенном тест-проекте Код: 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. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110.
В общем теперь можно забить. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 16:08 |
|
А как грамотно сделать свой контрол именно на базе Inherits Control
|
|||
---|---|---|---|
#18+
Дмитрий77, Честн говоря я не понимаю, зачем Вы создаете себе трудности, а потом их героически преодолеваете. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 21:41 |
|
А как грамотно сделать свой контрол именно на базе Inherits Control
|
|||
---|---|---|---|
#18+
Cat2, А че еще делать. Есть прога, она типа продается, начинка давно написана, отточена и как это писалось тоже уже в целом забыто, стареем-тупеем, делать особо нечего. Вышел Win 8, Win10, многие вещи, типа те же стили тулбаров, которые неплохо смотрелись на висте и 7-ке уже смотрятся похабно. Ну имплементировал Риббон (ленту) - наконец-то, лет 5 вокруг него ходил, не знал с какого конца кусать. Совсем другое дело, имеем теперь стиль Paint/Wordpad/Проводник. Меняю иконки потихоньку. Думаю что б еще сделать. Увидел этот стиль тултипов в проводнике, понравилось. Сказал ХОЧУ. И че его раньше не увидел, он уже на Висте был. Юзеры наверно тоже не замечают. С ходу не получилось, но блин надо ж было сделать. Трудность в чем? Что мозги чуть напряг и размялся. Не, тырить/рисовать иконки и мувать их в свою прогу это конечно интересней, ну пойду дальше этим займусь. Можно еще пойти бухнуть, тоже дело. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2016, 00:02 |
|
|
start [/forum/moderation_log.php?user_name=D+%D0%BC%D0%BE%D0%B5%D0%B9+%D0%B4%D1%83%D1%88%D0%B5+%D0%BE%D1%81%D0%B0%D0%B4%D0%BE%D0%BA+%D0%B7%D0%BB%D0%B0]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 696ms |
total: | 859ms |
0 / 0 |