![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Переопределение WMPaint [D6, WinXP]
Alex_C © (2006-11-27 15:41:00)Делаю свой компонент Tmemo с подсветкой синтаксиса. Преопределяю у него метод
procedure TMyMemo.WMPaint(var Message: TWMPaint);
Все нормально, как бы работает, однако заметил, что сначала текст выводится без подсветки , а потом на него накладывается текст с подсветкой. Не могу понять, как такое может быть? Ведь отрисовка компонента происходит по WMPaint, а я его переопределил. Кто же еще может перед выполнением метода WMPaint выводить текст?
Для информации - все выделение делается на временном канвасе в памяти, а затем его BitBlt на канвас мемо.
Alex_C (2006-11-28 09:22:00) [1]Вроде немного дальше разобрался :)
BeginPaint вызывает событие WM_ERASEBKGND.
Теперь я его пытаюсь перехватить и делаю так:
procedure TMyMemo.WMEraseBkgnd(var Msg: TMessage);
begin
Msg.Result := 1; // Говорю, что не надо очищать окно
end;
Однако оно все равно мерцает.
Alex_C (2006-11-28 08:58:00) [2]Нет, ребят, вы нмного не поняли моего вопроса. Еще раз уточню: я хочу переопределить метод 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); у меня на мемо выводится текст мемо, который не форматированный, а уже затем поверх его выводится то, что я вывожу далее. При этом естественно происходит мелькание. Как этого избежать?
Virgo_Style (2006-11-27 22:40:00) [3]Как насчет
Return Values
An application should return zero if it processes this message.
P.S. Не проверял, не уверен и вообще гадаю на кофейной гуще. Но вдруг угадаю %-)
Alex_C (2006-11-27 18:50:00) [4]Все вышеописанное взято из факов по рисованию на мемо.
umbra (2006-11-27 17:01:00) [5]так Message.DC может быть нулем, тогда отрисовка идет на DC по умолчанию
Alex_C (2006-11-27 16:51:00) [6]Чего-то я совсем запутался. делаю пот такую процедуру WMPaint:
begin
DC:= Message.DC;
if DC= 0 then
DC:= BeginPaint(Handle, PS);
if Message.DC = 0 then EndPaint(Handle, PS);
end;
Тобишь я вообще ничего не пишу - я думал, что пустое окно должно было быть. Так нет - текст мемо выводится? Почему?
Alex_C (2006-11-27 16:42:00) [7]Сейчас даже уже нашел где это выводится:
у меня WMPaint реализован так
// Самое начало
DC:= Message.DC;
if DC= 0 then
DC:= BeginPaint(Handle, PS); - так вот тут и выводится
При попытки убрать эту строку при запуске проги ругается:
Canvas does not allow drawing