Поиск:

Ответ в темуСоздание новой темы Создание опроса
> custom edit control 
:(
    Опции темы
deniska
Дата 2.7.2008, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: 1
Всего: 0



задача такая - изменить задний план эдита. не просто фон поменять, а картинку, град. заливку и т.д. выводить под буквами. создал контрол производный от CEdit, переопределил OnPaint(). рисуется. проблема вот в чем: естественно сам текст приходистя тоже рисовать самому: drawtext, textout - неважно. каретка мигает от стандартного эдита, соответственно мне надо выводить текст точно в том месте (по оси Х), как в стандартном. пока текст в эдите меньше размера контрола - все ок, есть GetRect для получения области контрола для печати, в ней пишем текст. как только делаем текст больше размера контрола, и мы начинаем его кареткой скролировать, или удалять символы из середины текста - каретка с моим текстом дружить перестает. стандартный эдит как то хитро выводит текст: обрезает первую букву или не обрезает, смещает текст то влево то вправо (чую завсит от ширины первой печатаемой буквы). вобщем как определить то реальную координату, с которой он выводит начинает печатать текст. надеюсь понятно объяснил чего требуется. может у кого есть какие то соображения, а то убьюсь апстенку :( 
PM MAIL ICQ   Вверх
deniska
Дата 2.7.2008, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: 1
Всего: 0



частично проблему решил: 
Код

OnPaint()
{
......
    GetWindowText( Text );
    if( !Text.IsEmpty() )
    {    
        CRect FormatRect;
        GetRect( FormatRect );
        int LetInd = CharFromPos( CPoint( FormatRect.left, 0 ) );
        Text.Delete( 0, LetInd );
        BufDC.TextOut( PosFromChar( LetInd ).x    .....................
    }
.......
}


остался еще вопросик: создаю свой шрифт,
потом:
Код

    SetFont( &Font );
    BufDC.SelectObject( Font );

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

все шрифты валидные
PM MAIL ICQ   Вверх
Earnest
Дата 4.7.2008, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Почему бы картинку не подстилать на OnEraseBackgnd? А текст рисует пусть сам...


--------------------
...
PM   Вверх
deniska
Дата 7.7.2008, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: 1
Всего: 0



а уверены что так можно? просто пробовал, у меня не получилось.
PM MAIL ICQ   Вверх
Earnest
Дата 7.7.2008, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Может что-то не так сделал?. 
Нужно из OnEraseBackgnd возвращать TRUE: почитай внимательно ее описание в MSDN.


--------------------
...
PM   Вверх
deniska
Дата 7.7.2008, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: 1
Всего: 0



Код

BOOL CTextEdit::OnEraseBkgnd(CDC* pDC)
{
    pDC->BitBlt( 0, 0, WndRect.Width(), WndRect.Height(), &BkndDC, 0, 0, SRCCOPY );
    return TRUE;
}


вот такой код вставлял. по брейкпоинту в функцию попадал, но на экране ничего не меняется - белый прямоугольник. BitBlt TRUE возвращает
PM MAIL ICQ   Вверх
Earnest
Дата 7.7.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Странно... впрочем у старых контролов типа Edit свои причуды... 
Тогда имеет смысл попробовать следующие варианты (чтобы текст он все-таки сам рисовал) - в порядке усложнения:
1) Отшибить у класса кисть через SetClassLong. Теоретически, кисть, определенная в классе, и используется для стирания фона, а если кисти нет - то контрол как-бы прозрачен. Не факт, что эдит так себя ведет, но это самое простое.
2) Обработать WM_CTLCOLOREDIT в паренте или, через reflection, в самом контроле.
Тут можно либо просто возвращать нулевую кисть, либо еще и картинку (фон) рисовать
3) Перехватить WM_PAINT, подставить картинку и послать WM_PRINTCLIENT (почитай сначала про это сообщение). 


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0614 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.