Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.09;
Скачать: CL | DM;

Вниз

TRichEdit Подавление мерцания?   Найти похожие ветки 

 
Flex   (2003-05-27 13:21) [0]

Сталкнулся с проблемой мерцания с TRichEdit. При быстром вводе с клавиатуры, строка иногда начинает мерцать, потом вроде нет, а потом снова мерцает.

Нашел один интересный вариант решения этой проблемы.

В классе TCustomRichEdit модуля ComCtrls изменяете код

procedure TCustomRichEdit.WMPaint(var Message: TWMPaint);
var
R, R1: TRect;
begin
if GetUpdateRect(Handle, R, True) then
begin
with ClientRect do R1 := Rect(Right - 3, Top, Right, Bottom);
if IntersectRect(R, R, R1) then InvalidateRect(Handle, @R1, True);
end;
if Painting then
Invalidate
else begin
Painting := True;
try
inherited;
finally
Painting := False;
end;
end;
end;


на

procedure TCustomRichEdit.WMPaint(var Message: TWMPaint);
begin

inherited

end;


И всё. При быстром вводе текста с клавиатуры перестает мерцать TRichEdit.

Я подозреваю, что возникнет проблема с ранними версиями RichEdit
например RICHED20.DLL

Думаю, что код корректно работает только с RICHED32.DLL

Естественно проблему можно решить проверяя версию RICHEDIT при инициализации модуля...

Вот код, который нужно вписать, всё в тот же модуль.

type
TRichEditVersion = 1..3;

var
RichEditVersion: TRichEditVersion;

const
RichEdit10ModuleName = "RICHED32.DLL";
RichEdit20ModuleName = "RICHED20.DLL";

initialization
RichEditVersion := 1;
OldError := SetErrorMode(SEM_NOOPENFILEERRORBOX);
try

FLibHandle := LoadLibrary(RichEdit20ModuleName);
if (FLibHandle > 0) and (FLibHandle < HINSTANCE_ERROR) then
FLibHandle := 0;

if FLibHandle = 0 then
begin
FLibHandle := LoadLibrary(RichEdit10ModuleName);
if (FLibHandle > 0) and (FLibHandle < HINSTANCE_ERROR) then
FLibHandle := 0;
end
else
begin
RichEditVersion := 2;
Ver.dwOSVersionInfoSize := SizeOf(Ver);
GetVersionEx(Ver);
with Ver do
begin
if (dwPlatformId = VER_PLATFORM_WIN32_NT) and
(dwMajorVersion >= 5) then
RichEditVersion := 3;
end;
end;
finally
SetErrorMode(OldError);
end;


Все же у меня вопрос, если используя возможности простого наследования WM_PAIN без всяких перересовок, мы получаем нормальный RichEdit, какого фига это не предусмотренно по умолчанию?

Или этим кодом я вношу какие-то серьезные глюки?


 
ВинХех   (2003-05-27 20:56) [1]

Это лучне в отдельный package пихнуть, а не в ComCtrls.

На счет


> Все же у меня вопрос, если используя возможности простого
> наследования WM_PAIN без всяких перересовок, мы получаем
> нормальный RichEdit, какого фига это не предусмотренно по
> умолчанию?


Не знаю :((



Страницы: 1 вся ветка

Текущий архив: 2003.06.09;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.024 c
6-26632
denisWW
2003-04-07 22:26
2003.06.09
ну кто посоветует?TNMFTP вызывает NMFTP1PacketSent только кратно


14-26774
goobit
2003-05-22 18:04
2003.06.09
Использование типа object


3-26370
Сергей Суровцев
2003-05-16 08:52
2003.06.09
Обработка локальной таблицы в ОЗУ


1-26514
alexdbases
2003-05-30 10:37
2003.06.09
Приложение с о встроеной XPThemes


14-26653
Dwemer
2003-05-24 10:15
2003.06.09
Как ловить событие ?