Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Рисование в RichEdit [Delphi, Windows]


Страницы:   1 2

Andr-04 ©   (2006-07-08 19:48:00) 

Никак не могу корректно обновлять нарисованное в RichEdit через Canvas! При обрабатывании OnPaint (не важно как - и через OnMessage, и через своё событие) нарисованный фрагмент при прокручивании размножается, а если отлавливать прокрутку, то перерисовка происходит не всегда, да и на границе остаются следы рисунка. Если у кого есть опыт в данной области, какие именно события нужно отлавливать, какие сообщения нужно отправлять при их обработке и т.д. поделитесь, пожалуйста!


Unknown Mystic   (2006-07-13 03:15:00) [21]

Ааа... Теперь понял :)

Ну тогда что-то вроде:
function TForm1.RichEdit1Message(var Msg: tagMSG;
 var Rslt: Integer): Boolean;
var
 SI: TScrollInfo;
 x, y: Integer;
begin
 if msg.message = WM_PAINT then
 begin
   x := 0;
   y := 0;

   FillChar(SI, SizeOf(SI), 0);
   SI.cbSize := SizeOf(SI);
   SI.fMask := SIF_RANGE or SIF_POS or SIF_TRACKPOS or SIF_PAGE;
   GetScrollInfo(RichEdit1.Handle, SB_VERT, SI);

   EditBox2.Text := Int2Str(SI.nPos);
   EditBox3.Text := Int2Str(SI.nTrackPos);
   if SI.nTrackPos = 0 then y := SI.nPos
   else y := SI.nTrackPos;
   RichEdit1.Canvas.Rectangle(50 - x, 50 - y, 150 - x, 150 - y);
 end;
 Result := FALSE;
end;


Правда в маске может что-то лишнее - не разбирался. Это первое, что я в KOL.PAS нашел - лениво самому SI заполнять было :))


Andr-04   (2006-07-12 21:36:00) [22]

Не, мне нужно чтобы это нарисованное изображение не сидело фоном, а тоже, вместе с текстом, ПЕРЕМЕЩАЛОСЬ!


Unknown Mystic   (2006-07-12 21:21:00) [23]

В общем так, с графикой я не работал, так что мало что могу подсказать...

Но помоему мое предположение верно - "размножение" происходит из-за того, что ты не удаляешь то, что до этого рисовал. И вообще что-то страшное ты замутил с высчитыванием того, не ясно чего :)

Замени обработчик wm_paint на вот это и посмотри что будет...
    RichEdit1.Canvas.FillRect(RichEdit1.Canvas.ClipRect());
    RichEdit1.Canvas.Rectangle(33, 20, 88, 50);

Конечно не особо, но во всяком случае прямоугольник не плодится ;)


Andr-04   (2006-07-12 16:38:00) [24]

Ура, понял почему так происходит! Дело в том, что при перемещении ползунка полосы прокрутки кнопкой мыши до её отпускания GetScrollPos выдаёт начальное положение полос прокрутки, с которого она началась. GetScrollInfo тоже ничего корректного не выводит (возможно, не правильно выставляю параметр fMask (я устанавливаю его в SIF_POS)). Если я иду не в том направлении - поправьте, если в том - подскажите что нужно изменить. Все примеры рисования, которые я находил в интернете, не расчитыны на перемещение нарисованного при прокрутке RichEdit. Поэтому решение этого вопроса будет полезно и не только при KOL-программировании.


Andr-04   (2006-07-11 18:08:00) [25]


> На нём вместо прямоугольника рисуется простой отрезок. Но
> суть от этого не меняется

Уже подправил перед отправлением поста, но убрать в сообщении эту реплику забыл.


Andr-04   (2006-07-11 18:04:00) [26]

А зачем очищать-то? Пусть на нарисованном рисуется! Боюсь, конечно, выглядеть идиотом, но всё-таки рискну привести свой код (это не конечный, а предварительный. На нём вместо прямоугольника рисуется простой отрезок. Но суть от этого не меняется)! :-)
function TForm1.RichEdit1Message(var Msg: tagMSG;
 var Rslt: Integer): Boolean;
var
 x, y: Integer;
begin
 if msg.message=wm_paint then
   begin
     x:=GetScrollPos(RichEdit1.Handle, SB_HORZ);
     y:=GetScrollPos(RichEdit1.Handle, SB_VERT);
     RichEdit1.Canvas.Rectangle(33-x, 20-y, 88-x, 50-y);
   end;
 result:=false;
end;

Причём я ещё не затрагиваю проблему белого фона внутри прямоугольника - думаю, в карайнем случае отрезками нарисую, т.к. BrushStyle тоже не помогает.
Для испытания моего кода необходимо предварительно в RichEdit "забить" мусор.


Unknown Mystic   (2006-07-10 18:12:00) [27]

А как советовать, если ничего не понятно?.. Привел бы минимальный код что ли...

А ты его вообще отчищаешь перед тем как поновой рисовать то?


Andr-04   (2006-07-10 15:02:00) [28]

Поскольку больше никто ничего не советует, решил посмотреть RxLib, но что-то связанное с рисованием мне там найти не удалось. Подскажите, пожалуйста, как воспользоваться RxRichEdit для рисования на нём. Вообще, мне нужно всего-навсего нарисовать рамку, внутри которой необходимо будет изменять текст, а уже правее неё должен следовать неизменяемый текст (ну, предотвратить изменение изменяемого проще простого). Пробовал использовать таблицу из 1 строки и 1 столбца, но правее неё разместить ничего не удалось, а при создании таблицы из 1 строки и 2 столбцов не удалось скрыть границы второй ячейки. Жду предложений.


KilkennyCat   (2006-07-09 02:41:00) [29]

прошу прощения, не заметил, что - KOL...


KilkennyCat   (2006-07-09 02:40:00) [30]

Посмотрите пример у RxLib, там вроде бы, было.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо