Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.049 c
1-1168784135
The X
2007-01-14 17:15
2007.03.11
Корректная работа с CHM-хелпами в Delphi5.


6-1159880537
Scar89
2006-10-03 17:02
2007.03.11
411 Length Required


15-1171561649
alien1769
2007-02-15 20:47
2007.03.11
Вакансия для программиста на С++


15-1171523923
sqler
2007-02-15 10:18
2007.03.11
HTML


2-1171648748
Malik
2007-02-16 20:59
2007.03.11
Работа с кодом типа String





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский