Форум: "WinAPI";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];
ВнизTInplaceEdit.Invalidate - помогите понять, что делает метод. Найти похожие ветки
← →
Суслик © (2006-10-31 11:34) [0]Здавствуйте!
В модуле grids.pas есть такой метод
procedure TInplaceEdit.Invalidate;
var
Cur: TRect;
begin
ValidateRect(Handle, nil);
InvalidateRect(Handle, nil, True);
Windows.GetClientRect(Handle, Cur);
MapWindowPoints(Handle, Grid.Handle, Cur, 2);
ValidateRect(Grid.Handle, @Cur);
InvalidateRect(Grid.Handle, @Cur, False);
end;
Штатная документация, поставляемая с Delphi, говорит об этом методе следующее
Invalidate ensures that the portion of the grid window under the edit control is invalidated at the same time as the edit window. This is important when the edit window is hidden or destroyed so that the grid window can repaint the cell that was covered by the edit window.
И в общем-то я могу понять, что именно это метод и делает.
Но!
Несмотря на то, что все функции понятны - вернее понят перевод описания в MSDN - я никак не могу понять, почему и зачем в данном методе
первой строкой идет
ValidateRect(Handle, nil);
второй
InvalidateRect(Handle, nil, True);
Я не могу понять, зачем сначала вся область убирается из региона, предназначенного для прорисовки, а затем вся область добавляется в регион, который должен быть прорисован.
Объясните пожалуйста на пальцах.
В чем здесь глубокий смысл?
Спасибо.
PS BDS2006
← →
Alex Konshin © (2006-10-31 13:29) [1]Такое ощущение, что идет борьба с WM_ERASEBKGND. Скорее всего добиваются того, чтобы не стиралось старое перед тем как рисовать новое. Наверно, чтобы не было мелькания.
ValidateRect убирает область, а вот InvalidateRect добавляет в одном случае со стиранием фона, а во втором - без. Причем обрати внимание на то, что первая пара вызовов идет окну редактора, а вот вторая - окну грида (но на то же самое место). То есть окно редактора-то может быть и будет стерто-перерисовано, но уже в другом месте (а может он и вообще должен быть спрятан). А вот на гриде останется "мусор" от того, что было редактором и на его место будет нарисовано уже отредактированое значение, и скорее всего картинка изменится незначительно и перерисовка не будет заметна на глаз.
Не могу гарантировать, что прав на все 100%, но где-то близко к правде :)
← →
Суслик © (2006-10-31 13:58) [2]
> Alex Konshin © (31.10.06 13:29) [1]
Если посмотреть на TWinControl.WMEraseBkgnd, то видно, что Message.Result := 1, т.е. контрол всегда обрабатывает это сообщение, значит до DefWindowProc дел просто не дойдет.
Что бороться с WM_ERASEBKGND?
Или я что-то недопонимаю по поводу обработки WM_ERASEBKGND?
← →
Суслик © (2006-10-31 14:04) [3]Т.е. я как бы не пог понятЬ, зачем вообще бороться с WM_ERASEBKGND, если сообщение послностью обрабатывается контролом.
Теперь понял TInplaceEdit имеет DoubleBuffered равным False, поэтому в TWinControl.WMEraseBkgnd для него будет вызван FillRect(Message.DC, ClientRect, FBrush.Handle);
Т.е. последний параметр во второй строке метода TInplaceEdit.Invalidate все таки оказывает влияние.
-----
Интересно. Вот после вызова TInplaceEdit.Invalidate получится 2 невалидных области - одна у редактора, другая у грида.
В каком порядке будет происходить перерисовка?
← →
Игорь Шевченко © (2006-10-31 16:16) [4]
> Если посмотреть на TWinControl.WMEraseBkgnd, то видно, что
> Message.Result := 1, т.е. контрол всегда обрабатывает это
> сообщение, значит до DefWindowProc дел просто не дойдет.
>
Причем здесь DefWindowProc ?
← →
Суслик © (2006-10-31 17:13) [5]
> Причем здесь DefWindowProc ?
Да, скорее всего ерунду сморозил.
Но не в этом суть. :)
Игорь, что ты думаешь по исходному вопросу?
Т.е. зачем программисты Борланда
сначала вызываютValidateRect(Handle, nil);
потомInvalidateRect(Handle, nil, True);
В чем суть первого вызова, т.е.ValidateRect(Handle, nil);
Спасибо за ответ.
← →
Игорь Шевченко © (2006-10-31 18:08) [6]Суслик © (31.10.06 17:13) [5]
> В чем суть первого вызова, т.е.
> ValidateRect(Handle, nil);
"What I have not yet worked out is why you need those ValidateRect() calls preceding the InvalidateRect() calls. They should not be necessary either but disabling them causes your labels to suddenly become very flashy and I don"t know why that is happening yet."
"This is EXACTLY WHY those calls are there -- to prevent labels from flashing."
Из глубин Google.
Очевидно, что и в этом случае цель такая же - избавиться от возможного мерцания. Деталей не знаю.
← →
Суслик © (2006-10-31 18:13) [7]
> Игорь Шевченко © (31.10.06 18:08) [6]
Спасибо, Игорь.
1. Я понял, что это действительно для того, чтобы мерцания не было.
2. То что, вызов ValidateRect не есть общеизвестный трюк, который один только я, дурень, не знаю.
← →
Ketmar © (2006-10-31 18:14) [8]>[7] Суслик(c) 31-Oct-2006, 18:13
>который один только я, дурень, не знаю.
два дурня. я тоже.
← →
Суслик © (2006-10-31 18:17) [9]Могу, кстати сказать одно - это я экспериментально проверял - если убрать эту реализацию Invalidate и оставить штатную, то после нажатия ENTER в редакторе, сначала на несколько мсек прорисовывается старый фон от грида, потому рисуется уже новое значение.
В итоге не красиво.
← →
Игорь Шевченко © (2006-10-31 18:22) [10]Суслик © (31.10.06 18:13) [7]
Вместе с тобой и с Кетмаром уже три дурня - я тоже не знал.
← →
Ketmar © (2006-10-31 18:26) [11]щаз пол-форума набежит в дурни записываться...
← →
Наиль © (2006-10-31 18:51) [12]> щаз пол-форума набежит в дурни записываться...
Записываюсь!
← →
Суслик © (2006-10-31 18:57) [13]ладно, хватит офтопить - не потрепаться.
← →
Ketmar © (2006-10-31 19:04) [14]>[13] Суслик(c) 31-Oct-2006, 18:57
>ладно, хватит офтопить - не потрепаться.
так это легко исправить. пара кликов модератора... на вопрос-то уже ответили -- можно и пофлудить.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.045 c