Форум 3DNews
Вернуться   Форум 3DNews > Программирование > Программирование

Ответ Создать новую тему
Опции темы Опции просмотра
Непрочитано 12.12.2004, 14:38   [включить плавающее окно]   #1
legozaur
Мужской Общительный
Автор темы
 
Аватар для legozaur
 
Регистрация: 14.11.2003
Адрес: Новосибирск
Как запретить перерисовку компонента в Delphi?

Есть тектовый редактор RichEdit. Надо сделать так, чтобы при совершении определённых действий он не перерисовывался автоматически.
Например, я хочу програмно поменять цвет некоторого участка текста.
Задаю своцства SelStart и SelLength потом меняю свойство Color в SelAttributes. Но всё это действо сопровождается неприятным мерцанием компонента на экране (особенно если фрагмент текста большой). Я хотел бы сделать так, чтобы запрещать компоненту перерисовываться автоматически на период внесения измернений в атрибуты текста. Как это можно сделать?
Я пробовал перехватывать сообщение WM_PAINT через ApplicationEvents и блокировать перерисовку при помощи задания Handled в true, но из этого ничего не вышло.
Код:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if Msg.hwnd = RichEdit1.Handle then //Проверка является ли перерисованное окно редактором?
    Case Msg.message of
      WM_PAINT : begin
                   if not StopRepaint then inherited  //Если перерисовка разрешена, то перерисовываем стандартным способом
                   Handled := true;           //Событие обработано.
                 end;
    end;
end;
Какие есть ещё альтернативы?
legozaur вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 12.12.2004, 15:11   [включить плавающее окно]   #2
Johnnie Walker
Опытный
 
Регистрация: 28.04.2004
legozaur, функции изменения форматирования не вызывают Invalidate() итп, а просто посылают соответствующие сообщения в RichEdit, так что вряд ли что-то получится. FYI, у меня ничего не мерцает, может дело в чем-то другом?
Johnnie Walker вне форума  
Ответить с цитированием
Непрочитано 13.12.2004, 15:57   [включить плавающее окно]   #3
legozaur
Мужской Общительный
Автор темы
 
Аватар для legozaur
 
Регистрация: 14.11.2003
Адрес: Новосибирск
Johnnie Walker
Почему врядли получиться? Может как-то суметь перехватить эти самые сообщения? Кстати, что имеется виду под этими сообщениями? Если сообщения Windows, то можно перехватить, т. к. Handle RichEdit'а у меня есть.
Вообще - не принципиально кто кого посылает (), то есть я хотел сказать какие там сообщения куда адресуются. Важно то, что в конечном счёте всё сводится к GDI API Windows. А поскольку перерисовка при изменении свойств текста должна быть, то надо перехватывать именно WM_PAINT. Вопрос в том, правильно ли я это делаю (код выше)? Мне уже начинает казаться, что нет.
Хотя я и реагирую на сообщение, но прекратить его распространение по цепочке не могу (Handled := true только блокирует передачу события). Если вводить собственный обработчик события, то надо порождать дочерний класс от TRichEdit, а это значит разрабатывать новый компонент. Или же можно как-то ещё?
legozaur вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 13.12.2004, 18:12   [включить плавающее окно]   #4
Johnnie Walker
Опытный
 
Регистрация: 28.04.2004
legozaur, я немного непонятно написал.. Сообщения рич эдиту посылаются для изменения форматирования, а не для перерисовки. Перерисовку он уже сам организует.
Johnnie Walker вне форума  
Ответить с цитированием
Непрочитано 16.12.2004, 18:50   [включить плавающее окно]   #5
legozaur
Мужской Общительный
Автор темы
 
Аватар для legozaur
 
Регистрация: 14.11.2003
Адрес: Новосибирск
Может попробовать перехватывать сообщения, идущие к RichEdit и блокировать их, если надо запретить перерисовку?
Люди, кто знает как надо корректно использовать функции работы с сообщениями, поделитесь какими-нибудь соображениями на этот счёт.
Только прошу иметь виду, что я рассматриваю приложение на VCL, а не на WINAPI, поэтому максимум, что здесь можно, дак это перехвад месяг при помощи компонента ApplicationEvents.
Кстати, объясните мне: параметр HWND, передаваемый в PeekMessage и GetMessage - это что, ссылка на окно, которому передаётся сообщение или наоборот - от которого посылается?
legozaur вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 16.12.2004, 22:01   [включить плавающее окно]   #6
Johnnie Walker
Опытный
 
Регистрация: 28.04.2004
legozaur, если их перехватить, то форматирование не будет меняться
ApplicationEvents здесь не будет работать
PeekMessage - конечно, окно, куда идут сообщения.
Советую почитать МСДН.
Johnnie Walker вне форума  
Ответить с цитированием
Ответ Создать новую тему

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 16:12. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 2000-2017 3DNews. All Rights Reserved.
Администрация 3DNews требует соблюдения на форуме правил и законов РФ
Серверы размещены в Hostkey