Форум: "Основная";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];
ВнизПереопределение 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.053 c