Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > свое поле ввода


Автор: RapMan 25.7.2009, 11:51
Доброе время суток!
У меня следующий вопрос:
как можно сделать так чтобы использовать компоненты windows, но самому рисовать дизайн поля (например EDIT, RICHEDIT). Хочу сделать свое оформление для этих компонентов

Заранее всем спасибо!

Автор: GoldFinch 25.7.2009, 12:06
сабклассируй, и переопредели WM_DRAW

Автор: RapMan 25.7.2009, 12:18
Можно пожалуйста поподробней, просто такое никогда не делал

Автор: RapMan 26.7.2009, 18:37
разобрался с сабклассингом, но как узнать что рисовать? (например текст и скролбар)

Автор: GremlinProg 26.7.2009, 19:16
Цитата(RapMan @  26.7.2009,  20:37 Найти цитируемый пост)
как узнать что рисовать? 

RapMan, конкретнее формулируй вопрос,
либо подкрепи его картинкой какой-нибудь соответствующей, чтобы тебя поняли

Автор: RapMan 26.7.2009, 19:26
вопрос в следующем:
я хочу сделать свой стиль для richedit, то есть сделай другое оформление для scrollbar в нем

Заранее спасибо!

Автор: GremlinProg 26.7.2009, 20:15
RapMan, включаю третий глаз и начинаю сеанс телепатии!

предполагаю, что тебе неизвестны координаты скроллбара и ты хотел бы их узнать,
чтобы поверх системной раскраски компонента, навесить свою

разом получить всю информацию не получится
координаты скроллбара и состояния кнопок - с помошью GetScrollBarInfo
размеры кнопок - GetSystemMetrics, 
дополнительные параметры(число линий прокрутки, скорость, сглаживание) - SystemParametersInfo
стандартный вид кнопок - DrawFrameControl
для XP-тем - координаты отдельных элементов - GetThemeBackgroundContentRect
для определения, используется ли XP-темы - IsThemeActive

Автор: RapMan 26.7.2009, 20:27
хм, сейчас попробую поподробней описать.
я так понимаю мне нужно ловить WM_PAINT чтобы переписать дизайн прокрутки (или я ошибаюсь?)
я хочу нарисовать свой скролбар и очень хорошо если бы разноцветный текст.
не знаю какие сообщения отлавливать и как синхронизировать скролбар системы и свой

Автор: GremlinProg 26.7.2009, 23:03
Цитата(RapMan @  26.7.2009,  22:27 Найти цитируемый пост)
я так понимаю мне нужно ловить WM_PAINT чтобы переписать дизайн прокрутки

смотря какой скроллбар,
если скроллбар-компонент, то у него своя логика, это полноценное окно
если скроллбар встроенный - он в неклиентской области рисуется (WM_NCPAINT)
Цитата(RapMan @  26.7.2009,  22:27 Найти цитируемый пост)
и очень хорошо если бы разноцветный текст.

а как связан скроллбар с текстом вообще?

почитай уже раскрытые темы:
http://forum.vingrad.ru/act-Search/CODE/show/searchid-e641dbe185c3ea098ea8ee75a15575f3/search_in-posts/result_type/topics/flag/search/highlite/wm_ncpaint/index.html
http://forum.vingrad.ru/act-Search/CODE/show/searchid-60622a5d248aaff7bc2816ee2b5df151/search_in-posts/result_type/topics/flag/search/highlite/wm_hscroll+wm_vscroll/index.html
http://forum.vingrad.ru/act-Search/CODE/show/searchid-81530b3025f2b10bd9526c18ca3f9e64/search_in-posts/result_type/topics/flag/search/highlite/setscrollinfo/index.html
ключевые слова подсвечены в темах

Автор: RapMan 27.7.2009, 00:59
Спасибо, посмотрю...
я имел ввиду второй вариант:
Цитата

если скроллбар встроенный - он в неклиентской области рисуется (WM_NCPAINT)


текст у RichEdit-а

Автор: RapMan 28.7.2009, 13:31
сделал все следующим образом:
написал я свой scrollbar и подключил к richedit-у используя функцию GetScrollBarInfo, но она корректно возвращает только если при создание richedit-а указать флаг WS_VSCROLL, но так как я рисую свой scrollbar , то мне не нужен он от венды, по этому как его можно выключить?

Заранее всем спасибо!

Автор: GremlinProg 28.7.2009, 18:53
Цитата(RapMan @  28.7.2009,  15:31 Найти цитируемый пост)
написал я свой scrollbar и подключил к richedit-у используя функцию GetScrollBarInfo, но она корректно возвращает только если при создание richedit-а указать флаг WS_VSCROLL, но так как я рисую свой scrollbar , то мне не нужен он от венды, по этому как его можно выключить?


зачем выключать скроллбар? просто не используй его и все
для этого достаточно просто не опираться на координаты GetScrollBarInfo, а резервировать свою область под свой сколлбар

начинай смотреть вот эту тему, с 3 страницы: http://forum.vingrad.ru/index.php?showtopic=223828&view=findpost&p=1612530
когда начнет приходить понимание, что такое неклиентские координаты и как их использовать, перенеси этот опыт на скроллбар

ps: может тогда заодно и свой RichEdit напишешь

Автор: RapMan 28.7.2009, 19:19
да мне GetScrollBarInfo нужен только чтобы взять SIF_RANGE, то есть промежуток который нужно использовать для прокрутки.

Автор: GremlinProg 28.7.2009, 20:24
Цитата(RapMan @  28.7.2009,  21:19 Найти цитируемый пост)
да мне GetScrollBarInfo нужен только чтобы взять SIF_RANGE, то есть промежуток который нужно использовать для прокрутки.

посчитай строки, в чем проблема? EM_GETLINECOUNT

Автор: RapMan 28.7.2009, 21:15
Большое Человеческое Спасибо! Поставил бы + в репу, но пока нету такого права  smile 

а еще вопросика 2 есть  smile:
1) как можно узнать текущую позицию скролбара?
2) как можно сделать фон richedit прозрачным?

Автор: GremlinProg 28.7.2009, 22:23
Цитата(RapMan @  28.7.2009,  23:15 Найти цитируемый пост)
как можно узнать текущую позицию скролбара?

на выбор: GetScrollPos или GetScrollInfo
все о скроллбарах: http://msdn.microsoft.com/en-us/library/bb787529(VS.85).aspx
Цитата(RapMan @  28.7.2009,  23:15 Найти цитируемый пост)
как можно сделать фон richedit прозрачным?

использовать EM_FORMATRANGE: http://msdn.microsoft.com/en-us/library/bb787875(VS.85).aspx

Автор: RapMan 28.7.2009, 22:41
Большое Спасибо!

Автор: RapMan 30.7.2009, 11:10
Доброе время суток!
Как я только не извращался с Richedit он не делает то что нужно, решил написать свой с нуля, главная проблема  smile  - это как сделать scrollbar свой чтобы он мог прокручивать текст, то есть как узнать количество строк что выводит DrawTextEx? так как длина текста может быть любой, а rect может быть меньше длины текста и перенести часть текста на другую строку. Потом как при прокрутке узнать какой текст выводить?

Заранее всем откликнишимся спасибо!!!!

Автор: GremlinProg 30.7.2009, 19:59
я вообще-то не всерьез делал это предложение:
Цитата(GremlinProg @  28.7.2009,  20:53 Найти цитируемый пост)
ps: может тогда заодно и свой RichEdit напишешь


но с другой стороны, почему нет )
зайди в поиск и ищи слово rtf_printer,
будут вопросы, пиши в той теме, т.к. переносам и словам она посвящена больше

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)