|
Сохранение цвета текста выделенных и hover-итемов в ListView (стиль Explorer)
|
|||
---|---|---|---|
#18+
Ну т.е. строчки разноцветные, а не черные. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Проблема: цвет Selected-итемов - черный, цвет итемов над которыми скользит мышь - черный. "explorer" стиль не должен менять цвет. Хорошо, вылечил классически: Код: 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.
Структуры, константы под спойлером. Код: 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.
Дефолтный проект .Net 4.5 VS 2013EE. Я пока еще не решил, но планирую большой проект делать все-таки .Net 2.0 (для совместимости с XP и т.п.) Конвертанул тест-проект через свойства проекта. И все - мой фикс сдох, т.е. фикс красит весь текст в черный если с сабклассингом. Ну, .Net-овский Items(0).ForeColor работает, но как указал мне это недостаточно. Любая другая обратная конвертация хоть бы назад в .Net 4.5 уже не помогает. Как такое может быть? Как лечить? Прилагаю картинку с пояснениями. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2014, 06:29 |
|
Сохранение цвета текста выделенных и hover-итемов в ListView (стиль Explorer)
|
|||
---|---|---|---|
#18+
Прилагаю на всякий случай НЕ испорченный тест-проект. Т.е. Net 4.5 VS2013EE VB.NET Который делает вторую картинку. До того как я его конвертирую в .Net 2.0 Надо чтоб при конвертации функциональность (цвет выделенных и hover итемов) сохранялась. Запускать надо не ниже Висты со включенными стилями - иначе бессмысленно (я тестировал на 8.1). ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2014, 06:36 |
|
Сохранение цвета текста выделенных и hover-итемов в ListView (стиль Explorer)
|
|||
---|---|---|---|
#18+
Короче тестанул еще. После конвертации в .Net2 WinXP- все корректно (там соглашаемся со стандартными цветами при выделении), итемы цветные Vista, Win 8.1 -некорректно, т.е. сабклассинг делает все итемы черными Win7 -что интересно, все корректно, т.е. как на второй картинке (итемы цветные и под выделенным тоже) Что касается оригинального проекта .Net 4.5 -на Висте, 7-ке и 8.1 -везде все корректно Но на XP то блин работать не будет. А я люблю чтоб на всех OS один exe-шник хорошо работал. А .Net2 суко глючит на новых. Можно конечно дублировать файлы: Net 2 -под XP 4.5-под все остальное, инсталлятор разберется, но сильно увеличится размер проекта и это бардак как бы. Думаю опять .Net гадит со своими внутренними кривыми реализациями, что даже API не всегда применить нормально можно (думаю Items.ForeColor где-то дублирует мой "чистый код" типа кто кого). Могу конечно Items.ForeColor не назначать а цвет писать в Tag итема (как раньше делал), но это здесь не помогает. Впрочем КОНКРЕТНЫЙ ВОПРОС остался. Надо чтоб после конвертации приложенного проекта в .Net2 результат на 8.1 был как на моей второй картинке (а не как на нижней). Общие рассуждения не приветсвую, но если кто придумает/поможет конкретно с этим, буду благодарен. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2014, 07:29 |
|
Сохранение цвета текста выделенных и hover-итемов в ListView (стиль Explorer)
|
|||
---|---|---|---|
#18+
Все, критикуйте, разрешаю. Устал. Было вы неплохо понять принцип конвертации C++ типов в .Net. В VB6 обычно прокатывало As Long + вариации ByVal/ByRef с MoveMemory + укороченные структуры местами типа как в tagNMLVCUSTOMDRAW (с DiSetup это кстати никогда не прокатывает(Имеющийся буфер не подходит для указанной операции) и с Юникодом/не Юникодом бороться обычно тяжеловато). Marshal.PtrToStructure, Marshal.StructureToPtr -более менее понятно. DWORD -Integer, int - Integer Указатели на строки - byval String и главное про A/W и про charset в структурах не забывать... А вот как со всей многочисленностью LONG,HWND,DWORD_PTR,COLORREF разбираться безошибочно... Что-то б типа таблицы умножения где б было, или какой-нибудь "инструмент". То что собака в этом это я уже догадался напоровшись дважды. Все остальное что уже наконвертировал из VB6 видимо работает за счет того, что "простые типы", "случайно получилось", "случайно совпало", "случайно неправильные элементы структур не используется". Аккуратность - 99% залог успеха если используешь API. Знаю. Критиковать надо вот это: Код: 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.
Оригинальный C++ msdn Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 12:34 |
|
Сохранение цвета текста выделенных и hover-итемов в ListView (стиль Explorer)
|
|||
---|---|---|---|
#18+
Ну, пока выяснил что в плохом варианте (с .Net2) у меня в NMLVCUSTOMDRAW clrText попадает в iSubItem ( 8 байт по дороге потерял) а в clrText сидит походу dwItemSpec( 8 байт потерял до него значит) при этом dwDrawStage на своем месте кажется Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 15:03 |
|
Сохранение цвета текста выделенных и hover-итемов в ListView (стиль Explorer)
|
|||
---|---|---|---|
#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.
Но с т.зр. полной корректности смущает: 1) Надо делать для обращения к итему: Код: vbnet 1.
2) Dim code As UInt16 в NMHDR, а иначе не работает - похоже на "подтасовку" Вот эти двое: UINT code UINT An unsigned INT. The range is 0 through 4294967295 decimal. This type is declared in WinDef.h as follows: typedef unsigned int UINT; -- UINT_PTR idFrom; Код: plaintext 1. 2. 3. 4. 5.
Есть идеи? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 15:42 |
|
Сохранение цвета текста выделенных и hover-итемов в ListView (стиль Explorer)
|
|||
---|---|---|---|
#18+
Не ну фигня какая-то. Код: plaintext 1. 2. 3. 4. 5.
Код: vbnet 1. 2. 3. 4. 5. 6.
UInt16 -это 2 -байта при любых раскладках (соотв. as Integer в VB6), а по другому он не хочет. Т.е. в .Net это работает с жестким интервалом 2 байта между idFrom и code Но в VB6 это работало с as Long как часы (дельта= 4 байта). Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Если работает- не трогай, то я это осилил, но непонятка сия таки бесит. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2014, 18:20 |
|
|
start [/forum/topic.php?fid=20&msg=38833318&tid=1402121]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 128ms |
0 / 0 |