|
Headers in ListView: проблема с картинками: высота и перерисовка.
|
|||
---|---|---|---|
#18+
Проблема #1: Если mscomctl сам вставляет картинки и худо-бедно регулирует высоту, то Comctl этого не делает. Т.е. если на Висте все и так хорошо, на XP-стиле так сказать терпимо, то на классике просто похабно. Высоту явно надо увеличить. Что-то я уже наискал на тему HD_LAYOUT, но добротных примеров не нашел. Как изменить headers.height? Проблема #2: Видна из рисунка ниже. Проявляется исключительно на классике при использовании манифеста. При применении горизонтального скроллинга картинка уезжает куда надо, а тень ее (верт. полоса справа и слева) остается на прежнем месте. Здесь видимо потребуются дополнит. объяснения: 1) Я использую для Listview Код: vbnet 1.
LVS_EX_DOUBLEBUFFER жизненно необходим для Код: vbnet 1.
в случае Висты и достаточно хорош для остальных стилей /систем, т.к. уменьшает мерцалку при перерисовках, но имеет побочный эффект неперерисовки header-ов в принципе, поэтому это надо делать принудительно: 2) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Собственно глюк, нарисованный на картинках выше обусловлен именно этим пунктом и не зависит от LVS_EX_DOUBLEBUFFER, но я вынужден выполнять этот код именно из-за LVS_EX_DOUBLEBUFFER Я могу не использовать LVS_EX_DOUBLEBUFFER для классики, но тогда при горизонтальном скроллинге header-ы вообще могут "затираться ластиком", т.е. пункт 2 полезен по-любому 3) В принципе я нашел как исправить и это: (Я назначаю картинки ПОВТОРНО после принудительной перерисовки, тени исчезают, но не дай бог я буду перерисовывать картинку в первом, т.е. нулевом столбце, тогда ничего не сработает) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Но теперь "ТЕНИ" появляются в момент MOUSE_UP при раздвижении header-ов. Ладно, бьем и здесь. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Но остается проблема НУЛЕВОГО СТОЛБЦА. При задвигании его влево тень его картинки нас преследует, мои ходы это не решают. Вообще говоря, резонно задать еще следующий вопрос. Как отменить действие манифеста применительно к заданному контролу? Он на классике часто ничего не дает (для header-ов то точно), иногда дает глюки. Иногда хочется скажем чтоб на ListView был FocusRectangle (с точечками даже красивее). Я конечно могу отменить стиль Код: vbnet 1. 2. 3. 4. 5.
Но этим я отменяю лишь Vista/XP стиль, но никак не "вредные" деяния манифеста. Типа тема уходит, а тени остаются. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2010, 03:36 |
|
Headers in ListView: проблема с картинками: высота и перерисовка.
|
|||
---|---|---|---|
#18+
По поводу высоты самую умную информацию я нашел здесь: http://forum.sources.ru/index.php?s=1c8d2b146bbf5e9b1646f3ee0a5759bf&showtopic=252062 (в конце самом) Ну допустим устанавливаю я первый шрифт "10" (что дает нужную высоту в 20 пикселей на классике) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Автор настолько обрадовался Код: plaintext 1. 2. 3. 4.
Кой-какую информацию можно почерпнуть тут: http://www.vbaccelerator.com/home/vb/code/controls/s_grid_2/s_grid_2/VB5_SGrid_2_Full_Source_zip_cHeaderControl_cls.asp Ну накатал я вот такую функцию.... Код: 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.
Ну говорит она мне что тек. высота 17, а идеальная 20. Спасибо, я это итак знаю. Попытки применить все что после строчки IdealHeaderHeight = lHeight типа MoveWindow/InvalidateRect/UpdateWindow глючит безбожно, т.к. очевидно идет борьба с VB-Listview, видимо это вообще не тот путь. "Мона создать два шрифта" мне больше нравится, только как это "мона". Без примера не знаю. Есть еще вариант вставлять картинки 16х16, но с полями в один пиксель снизу и сверху(типа реальная высота 14, это нормально смотрится). Но тогда картинки придется очень аккуратно подбирать. Причем сразу становится обидно за Висту, где родной высоты с лихвой хватает. Ну,б... 6-й контрол же как-то это делает... =============================================== "ТЕНИ" вокруг картинок. Код: plaintext
Если сделать =0, то тени вообще не будет, но это некрасиво. Остается либо мой вариант, где тень таки остается в нулевой колонке(это не очень бросается), либо выяснять как делать тень "прозрачной". ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2010, 12:23 |
|
Headers in ListView: проблема с картинками: высота и перерисовка.
|
|||
---|---|---|---|
#18+
Дмитрий77 "ТЕНИ" вокруг картинок. Код: plaintext
Если сделать =0, то тени вообще не будет, но это некрасиво. Остается либо мой вариант, где тень таки остается в нулевой колонке(это не очень бросается), либо выяснять как делать тень "прозрачной". Тот метод что я привел никуда не годится. Во-первых проблема нулевого столбца. Во-вторых если делать колонки слишком узкими, то тени все равно выезжают где попало. Подозреваю что это как то связано с тем, что Control-5 ни хрена не умеет правильно работать с шириной столбцов. Если коротко, то это целиком и полностью лечится хитростью. 1. BITMAPMARGIN надо вообще убрать: Код: plaintext
И это полностью решает эту проблему. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
А вот с высотой ничего пока не придумал, кроме как использовать рабочую область иконки 16х14 (естественно иконки надо подбирать более тщательно, на альфа-художника я не тяну, а на таких мелких размерах программы обычно не справляются с перерисовкой). Попытка использовать более высокую иконку, в отличии от предыдущего случая не фурычит: иконка будет обрезана стандартной высотой header-а. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2010, 01:37 |
|
Headers in ListView: проблема с картинками: высота и перерисовка.
|
|||
---|---|---|---|
#18+
Пытаюсь все-таки разобраться с высотой headers. М.б. кто подскажет у кого рука набита? Что надо делать в принципе я понял. Сабклассить hwndHeader, ловить HDM_LAYOUT и менять pwpos.cy Вот я пытаюсь хотя бы распечатать в debug ту .cy что он предлагает: Код: 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.
И чтобы я ни делал, у меня там выводятся либо ссылки на память, либо нули. Как я понимаю, Layout.pwpos.cy должен выдавать высоту в пикселях, которую я и должен в сабклассинге поменять на большую. Но я походу запутался с Ptr-ами и значениями. HDM_LAYOUT message lParam A pointer to an HDLAYOUT structure. The prc member specifies the coordinates of a rectangle, and the pwpos member receives the size and position for the header control within the rectangle. HDLAYOUT structure Код: plaintext 1. 2. 3. 4.
prc Type: RECT* Structure that contains the coordinates of a rectangle that the header control will occupy. pwpos Type: WINDOWPOS* Structure that receives information about the appropriate size and position of the header control. На VB6 грамотных примеров на тему процессинга HDM_LAYOUT я не нашел. М.б. найдется добрый человек кто б помог с этими *, Ptr, MoveMemore, Byval/ByRef, VarPtr и т.д. в данном случае. Пример на другом языке напр. Изменение высоты и расположения CHeaderCtrl и высоты строк CListCtrl с помощью сообщений HDM_LAYOUT Но моя проблема думаю именно в переводе на VB6. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2013, 19:33 |
|
Headers in ListView: проблема с картинками: высота и перерисовка.
|
|||
---|---|---|---|
#18+
Дмитрий77На VB6 грамотных примеров на тему процессинга HDM_LAYOUT я не нашел.Я ведь рассказывал, как искать примеры на vb6 , нет? Вторая ссылка. Не знаю, насколько этот пример грамотен, но это как бы целый header-контрол, не имеющий, правда, отношения к common controls. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2013, 22:59 |
|
Headers in ListView: проблема с картинками: высота и перерисовка.
|
|||
---|---|---|---|
#18+
Antonariy, Да умею я искать, в т.числе так как ты показываешь. И по этой ссылке вроде как уже был. Счас буду более внимательно штудировать. А сам с ходу можешь написать безошибочно структуры и MoveMemory (CopyMemory) для VB6. Глядя чисто на C-шные определения в MSDN что я привел? Я попытался, и считаю что в Layout.pwpos.cy я должен для начала "прочесть" высоту header навязывуемую системой. Но чтоб я не делал, реального числа - предполагаю что-то порядка 19(px) 21(px) я оттуда прочесть не могу. Т.е A pointer to an HDLAYOUT structure Предположение 1: в lParam лежит Ptr на prc в lParam+4 лежит Ptr на pwpos Предположение 2: начиная с адреса lParam там подряд лежат prc и pwpos согласно размерностям RECT и WINDOWPOS Видимо я запутался в *prc; *pwpos, *LPHDLAYOUT Если ты хорошо разбираешься в указателях, в указателях на указатели и т.п. то тебе быстрее будет мне написать как правильно (ну да, буду паразитом на этот раз), чем пытаться что-то объяснять. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2013, 23:49 |
|
Headers in ListView: проблема с картинками: высота и перерисовка.
|
|||
---|---|---|---|
#18+
Antonariy, Исходя из того что нарисовано в акселераторе по указанному вами примеру, правильный код должен быть Код: 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.
Но Debug.Print tHDL.pwpos.cy распечатывает мне числа по типу 2262368 2401368 что никак не ассоциируется с высотой header порядка 20 пикселей, а больше смахивает на адреса памяти Т.е. либо в акселераторе как обычно бред сивой кобылы, либо я неправильно понял/прочитал/осознал то что имеется в виду. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2013, 01:02 |
|
Headers in ListView: проблема с картинками: высота и перерисовка.
|
|||
---|---|---|---|
#18+
Сдается мне что сабклассить и ковырять HDM_LAYOUT вообще не тот путь. Идея описанных методов: 1) послать HDM_LAYOUT и получить существующую структуру HDLAYOUT И в принципе она возвращается (то чего хочу = 17 пикселей на классике) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Ну, в смысле сидеть и караулить это сообщение в самом header не надо 2) А потом как то To use HDM_LAYOUT to set the initial size and position of a header control, set the initial visibility state of the control so that it is hidden. After sending HDM_LAYOUT to retrieve the size and position values, use the SetWindowPos function to set the new size, position , and visibility state. (так в msdn написано) Но с этим походу задница, в которую уже тыкался 3 года назад. 8729101 Походу придется опять забить, а жаль. Ну как-то делают же это на "других языках"....м.б. из-за глючности VB-шной реализации. Но рисовать Listview целиком через API желания точно нет. Или правда шрифтом подтасовывать, а текст как-то через hdc стандартным шрифтом накалякать? Кстати как? Если сделаю SETFONT, то любой TextOut будет тем же шрифтом рисовать. Хотя поиграться наверно можно... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2013, 06:28 |
|
Headers in ListView: проблема с картинками: высота и перерисовка.
|
|||
---|---|---|---|
#18+
Все-таки воспользовался "идеей 2-х шрифтов". 1) Запоминаем "родной шрифт" Код: vbnet 1. 2. 3. 4. 5.
2) Для Headers в Listview устанавливаем свой (большой) шрифт, напр. так чтоб не мучиться: Код: vbnet 1. 2. 3. 4.
Например MS Sans Serif 12 автовыставит высоту header в 24 пикселя (вместо 17 на классике либо 19 с Segoe UI 9 на Висте) 3) Через CUSTOM DRAW, там же где я делаю прозрачность header-ов дополнительно меняем шрифт на зарезервированный родной. Код: 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.
Ну собственно и все. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2013, 18:23 |
|
Headers in ListView: проблема с картинками: высота и перерисовка.
|
|||
---|---|---|---|
#18+
Ну вот еще скриншот. Единственная проблема: на "вистах" происходит автовыравнивание CustomDraw шрифта по вертикали (проблема отсутствует), на XP автовыравнивания не происходит (проблемка!!!), т.е. высота headers -увеличена, но текст смещен вверх (от верхнего края родного шрифта). Как пофиксить не знаю, вариант с TextOut на hdc мне не нравится, т.к. текст тогда "не прыгает" вместе с нажатием кнопки. Но в принципе, на Вистах это смотрится прилично (родная "тематическая" высота header - при отключенной теме!!! - иначе прощай прозрачность). Собственно, ориентируем давно уже все красивости на Висту... А что касается XP, метод позволяет "чуть" увеличить высоту header на классике (обычные серые headers без прозрачности), чтобы не "лепились" рисунки 16х16 - т.е. по сути это решает вопрос над которым бился 3 года назад. Ну, и еще в этом примере прозрачность headers только для случая одной застопоренной колонки. Если столбцов несколько (обычный вариант), то надо усложнять код, т.е. высчитывать координаты каждого item по отдельности и рисовать кусками - и непонятно получится ли. Но для приведенного случая прозрачность я сделал, больше пока не надо. А с высотой и подтасовкой шрифтов справедливо для любого к-ва столбцов. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2013, 18:41 |
|
|
start [/forum/topic.php?fid=60&fpage=58&tid=2156991]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
28ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 249ms |
total: | 385ms |
0 / 0 |