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