Главная страница
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.03 c
8-1144144674
Goorus
2006-04-04 13:57
2007.01.21
Vorbis/OGG


15-1167335475
Chort
2006-12-28 22:51
2007.01.21
как правильно использовать данную функцию


2-1167251250
Fus1on
2006-12-27 23:27
2007.01.21
Проблема с Хендлом окна.


2-1167032516
KyRo
2006-12-25 10:41
2007.01.21
Подскажите как сделать DBGrid без скролов


2-1167829548
dstrogiy
2007-01-03 16:05
2007.01.21
Background-музыка