Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.21;
Скачать: CL | DM;

Вниз

Переопределение WMPaint   Найти похожие ветки 

 
Alex_C ©   (2006-11-27 15:41) [0]

Делаю свой компонент Tmemo с подсветкой синтаксиса. Преопределяю у него метод
procedure TMyMemo.WMPaint(var Message: TWMPaint);
Все нормально, как бы работает, однако заметил, что сначала текст выводится без подсветки , а потом на него накладывается текст с подсветкой. Не могу понять, как такое может быть? Ведь отрисовка компонента происходит по WMPaint, а я его переопределил. Кто же еще может перед выполнением метода WMPaint выводить текст?
Для информации - все выделение делается на временном канвасе в памяти, а затем его BitBlt на канвас мемо.


 
Alex_C ©   (2006-11-27 16:42) [1]

Сейчас даже уже нашел где это выводится:
у меня WMPaint реализован так
//  Самое начало
   DC:= Message.DC;
   if DC= 0 then
       DC:= BeginPaint(Handle, PS); - так вот тут и выводится

При попытки убрать эту строку при запуске проги ругается:
Canvas does not allow drawing


 
Alex_C ©   (2006-11-27 16:51) [2]

Чего-то я совсем запутался. делаю пот такую процедуру WMPaint:

begin
   DC:= Message.DC;
   if DC= 0 then
       DC:= BeginPaint(Handle, PS);
   if Message.DC = 0 then EndPaint(Handle, PS);
end;

Тобишь я вообще ничего не пишу - я думал, что пустое окно должно было быть. Так нет - текст мемо выводится? Почему?


 
umbra ©   (2006-11-27 17:01) [3]

так Message.DC может быть нулем, тогда отрисовка идет на DC по умолчанию


 
Alex_C ©   (2006-11-27 18:50) [4]

Все вышеописанное взято из факов по рисованию на мемо.


 
Virgo_Style ©   (2006-11-27 22:40) [5]

Как насчет
Return Values

An application should return zero if it processes this message.


P.S. Не проверял, не уверен и вообще гадаю на кофейной гуще. Но вдруг угадаю %-)


 
Alex_C ©   (2006-11-28 08:58) [6]

Нет, ребят, вы нмного не поняли моего вопроса. Еще раз уточню: я хочу переопределить метод WMPaint для своего TMemo. Для этого я переопределяю процедуру WMPaint (это есть во всех faq)

begin
  DC:= Message.DC;
  if DC= 0 then
      DC:= BeginPaint(Handle, PS);

  aCanvas:=TCanvas.Create;
   try
       aCanvas.Handle:= DC;
       aCanvas.Font:= Font;
 // Здесь я ужеработаю с этим aCanvas
 // и что-то на него вывожу
//.....  
 finally
       if Message.DC = 0 then EndPaint(Handle, PS);
       aCanvas.Free;
   end;
end;

Все работает, но в момент выполнения BeginPaint(Handle, PS); у меня на мемо выводится текст мемо, который не форматированный, а уже затем поверх его выводится то, что я вывожу далее. При этом естественно происходит мелькание. Как этого избежать?


 
Alex_C ©   (2006-11-28 09:22) [7]

Вроде немного дальше разобрался :)
BeginPaint вызывает событие  WM_ERASEBKGND.
Теперь я его пытаюсь перехватить и делаю так:

procedure TMyMemo.WMEraseBkgnd(var Msg: TMessage);
begin
   Msg.Result := 1; // Говорю, что не надо очищать окно
end;

Однако оно все равно мерцает.



Страницы: 1 вся ветка

Текущий архив: 2007.01.21;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.057 c
3-1161961260
Juju
2006-10-27 19:01
2007.01.21
Погрешности в Float полях... (Access + ADO + Delphi 7)


2-1167771195
rolex
2007-01-02 23:53
2007.01.21
Как получить строку с 16-ричным значением цвета


15-1167402032
VirEx
2006-12-29 17:20
2007.01.21
Конкурс на "самую снежную" программку


3-1162412746
Gunek
2006-11-01 23:25
2007.01.21
Как выполнить запрос на выборку данных из нескольких таблиц?


15-1165820613
Бамбуча
2006-12-11 10:03
2007.01.21
Вопрос американцам