![]() |
|
|
![]()
|
|
| deniska |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: 1 Всего: 0 |
задача такая - изменить задний план эдита. не просто фон поменять, а картинку, град. заливку и т.д. выводить под буквами. создал контрол производный от CEdit, переопределил OnPaint(). рисуется. проблема вот в чем: естественно сам текст приходистя тоже рисовать самому: drawtext, textout - неважно. каретка мигает от стандартного эдита, соответственно мне надо выводить текст точно в том месте (по оси Х), как в стандартном. пока текст в эдите меньше размера контрола - все ок, есть GetRect для получения области контрола для печати, в ней пишем текст. как только делаем текст больше размера контрола, и мы начинаем его кареткой скролировать, или удалять символы из середины текста - каретка с моим текстом дружить перестает. стандартный эдит как то хитро выводит текст: обрезает первую букву или не обрезает, смещает текст то влево то вправо (чую завсит от ширины первой печатаемой буквы). вобщем как определить то реальную координату, с которой он выводит начинает печатать текст. надеюсь понятно объяснил чего требуется. может у кого есть какие то соображения, а то убьюсь апстенку :(
|
|||
|
||||
| deniska |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: 1 Всего: 0 |
частично проблему решил:
остался еще вопросик: создаю свой шрифт, потом:
так вот опытным путем выяснилось, что при отображении шрифты в стандартном CEdit, которому установлен такой же шрифт как и в моем буфере, немного отличаются. размер, жирность совпадают, но немного отличаются начертания. с чем это может быть связано? все шрифты валидные |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Почему бы картинку не подстилать на OnEraseBackgnd? А текст рисует пусть сам...
-------------------- ... |
|||
|
||||
| deniska |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: 1 Всего: 0 |
а уверены что так можно? просто пробовал, у меня не получилось.
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Может что-то не так сделал?.
Нужно из OnEraseBackgnd возвращать TRUE: почитай внимательно ее описание в MSDN. -------------------- ... |
|||
|
||||
| deniska |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: 1 Всего: 0 |
вот такой код вставлял. по брейкпоинту в функцию попадал, но на экране ничего не меняется - белый прямоугольник. BitBlt TRUE возвращает |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Странно... впрочем у старых контролов типа Edit свои причуды...
Тогда имеет смысл попробовать следующие варианты (чтобы текст он все-таки сам рисовал) - в порядке усложнения: 1) Отшибить у класса кисть через SetClassLong. Теоретически, кисть, определенная в классе, и используется для стирания фона, а если кисти нет - то контрол как-бы прозрачен. Не факт, что эдит так себя ведет, но это самое простое. 2) Обработать WM_CTLCOLOREDIT в паренте или, через reflection, в самом контроле. Тут можно либо просто возвращать нулевую кисть, либо еще и картинку (фон) рисовать 3) Перехватить WM_PAINT, подставить картинку и послать WM_PRINTCLIENT (почитай сначала про это сообщение). -------------------- ... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |