|
Как правильно применить стиль к контролу (Parts and States)
|
|||
---|---|---|---|
#18+
Вот здесь C SysLink контролом кто сталкивался? Как сделать чтоб ссылка не всегда была подчеркнута? я применил некий стиль к SysLink. В целом получилось, но я понял что путь не совсем правильный. Т.е. есть определенные стили Aero Style Classes, Parts, and States По сути мне надо: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
В MSDN описано как применить стиль к уже существующему контролу: Using Visual Styles with Custom and Owner-Drawn Controls И приведены некоторые коды, я пытаюсь разрисовать свой hLinkTest: Код: 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.
Сразу скажу что если тупо взять Picture1.hdc и на него рисовать DrawThemeBackground и DrawThemeText, то все работает. Но это просто картинка, а у меня ГОТОВЫЙ КОНТРОЛ . Я не догоняю в каком месте я должен применять этот код к моему hLinkTest. Если я его исполняю при старте (как тупо пытаюсь понадеявшись на чудо), то я так мыслю он это все быстренько перерисует(что очевидно и происходит). В MSDN говорится про WM_PAINT (в нижнем примере кода по указанной ссылке). Код: plaintext 1. 2. 3. 4. 5. 6.
Я могу просабклассить hLinkTest и получать WM_PAINT (подозреваю что именно это и надо делать), но я не могу понять что я в нем должен делать и что оно должно возвращать Я могу конечно тупо взять hdc = GetDC(hLinkTest) внутри WM_PAINT, но подозреваю что плевать ему будет на то что я там нарисую внутри WM_PAINT . но они откуда-то берут paint.hdc paint.rcPaint ? Откуда? Ведь lparam и wparam в WM_PAINT пустые.. Направьте, где-то я близко, но не догоняю. Метод так чувствую классный для стилизации чего хочешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2013, 15:48 |
|
Как правильно применить стиль к контролу (Parts and States)
|
|||
---|---|---|---|
#18+
Дмитрий77, Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2013, 17:10 |
|
Как правильно применить стиль к контролу (Parts and States)
|
|||
---|---|---|---|
#18+
13-й квартал, Да вроде понял я это, вот так нарисовал чего хотел Код: 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.
Но, блин не совсем то это. Я хочу ПРИМЕНИТЬ СТИЛЬ К КОНТРОЛУ, а не НАРИСОВАТЬ СТИЛЬ ВМЕСТО КОНТРОЛА (пусть бы и тот который надо). Разницу чувствуете? Т.е. данный код рисует мне текст ссылки. Да, как надо, неподчеркнутый. Могу сделать подчеркнутый, забабахав FLYOUTLINK_HOVER. Но при этом. 1) Фон рисовать самому. Т.е. прозрачным например через WM_CTLCOLORSTATIC он его уже не делает 2) Точечки Focus Rectangle не рисуются. Т.е. мне в данном случае надо изменить только свойства шрифта существующей надписи ссылки в SysLink на FLYOUTLINK_NORMAL (если мышка наведена) или на FLYOUTLINK_HOVER (если не наведена). А я вместо этого рисую сам, пусть бы и в правильном стиле. Т.е. нужно что-то типа SetWindowTheme (sysLink, веди себя как положено для FLYOUTLINK) Нет идей? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2013, 18:01 |
|
Как правильно применить стиль к контролу (Parts and States)
|
|||
---|---|---|---|
#18+
Короче задолбался я с этим разбираться. Я конечно могу полностью рисовать SysLink через WM_PAINT, чего там рисовать мышка пришла - рисуем FLYOUT_LINK, FLYOUTLINK_HOVER мышка ушла - рисуем FLYOUT_LINK, FLYOUTLINK_NORMAL Только вот с фокусом беда будет - мало того что его надо рисовать ручками, т.к. еще и отслеживать, когда он должен быть, а когда нет. Еще и фон рисовать в WM_PAINT. А ну как "тематический шрифт" не совпадет с оригинальным. Тогда еще и курсор с изображением руки будет не по тому месту елозить. Слишком много работы. Более красивым решением было бы узнать свойства шрифта FLYOUTLINK_HOVER/FLYOUTLINK_NORMAL и подсунуть этот шрифт контролу. Есть там ф-ция, но задолбаешься ее структуру в IFont переводить. А единственное место где можно подсунуть Font чтобы нерисованная SysLink его съела - это NM_CUSTOMDRAW и кушает она именно IFont через SelectObject. Так что остановился на своем варианте . Понятно, что скармливается подчеркнутый или неподчеркнутый Segoe UI 9 а цвет там стандартный для Syslink. Подсвечивание с LIS_HOTTRACK можно убрать, не стильно это. Для того чтоб сгенерировать WM_PRINT и NM_CUSTOMDRAW достаточно при захвате отпускании мыши делать код Код: vbnet 1.
Странно, что UpdateWindow это не делает. Ну и коль скоро я делаю фоном для SysLink Код: vbnet 1.
то надо запихнуть этот фон в IPictureDisp, присвоить это PictureBox на кот. надятся Syslink и подрисовывать фон этих SysLink через WM_CTLCOLORSTATIC. Иначе на Win8 фон SysLink не совпадет с FLYOUT_LINKAREA и это заметно. На 7-ках и Вистах прокатывает без этого - там обычный Button Face. Было бы конечно проще если б было можно просто забацать Код: vbnet 1.
Или все-таки есть такие волшебные сим-симы? но к сожалению в таблице стилей : http://ukintel.deviantart.com/art/Vista-Visual-Style-Classes-87482323 есть Код: vbnet 1. 2.
но нет Flyout::Syslink и т.п. А жаль... Тогда б не пришлось такой огород городить. Рисовать что-то "по кускам" дело совсем неблагодарное. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2013, 06:14 |
|
|
start [/forum/topic.php?fid=60&tid=2156904]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 150ms |
0 / 0 |