Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1167317916
Германн
2006-12-28 17:58
2007.01.21
Ну, блин и Новый Год!


15-1166967507
Kerk
2006-12-24 16:38
2007.01.21
Порекомендуйте движок форума


2-1167223347
Философ Огня
2006-12-27 15:42
2007.01.21
Размер файла БД Interbase


2-1167402196
AlexanderMS
2006-12-29 17:23
2007.01.21
Функция формирования римских цифр из арабских.


15-1167469742
Derww
2006-12-30 12:09
2007.01.21
Как определить связен ли граф?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский