Главная страница
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.031 c
15-1167780991
Ringo
2007-01-03 02:36
2007.01.21
2007 год. Ваш прогноз для России и всех остальных?


2-1167947196
rolex
2007-01-05 00:46
2007.01.21
Как получить список соединений для Интернет?


6-1155718511
fastik
2006-08-16 12:55
2007.01.21
фреймы в WebBrowser


2-1167738956
d_xaos
2007-01-02 14:55
2007.01.21
Мультиязычность интерфейса.


15-1167486457
vrem
2006-12-30 16:47
2007.01.21
ПРАЗДНИК - что не нравится?