![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Добавление флага стиля и обновление окна [D5, WinXP]
Vaddya © (2002-08-10 13:02:00)С помощью SetWindowLong добавляю CheckBox-у флаг BS_PUSHLIKE не в событии формы OnCreate, т.е. не при создании. Как обновить этот CheckBox, чтобы изменения были выдны? UpdateWindow и подобные не обновляют.
Игорь Шевченко (2002-08-14 10:13:00) [1]В дополнение. Не всякий стиль окна можно добавить по SetWindowLong после создания окна. При изменении стиля таким путем окну посылаются сообщения WM_STYLECHANGING и WM_STYLECHANGED и дело окна отреагировать на эти сообщения - либо принять устанавливаемый стиль, либо не принять. Либо внутри себя сказать Invalidate.
С уважением,
Ученик (2002-08-14 09:47:00) [2]procedure InvalidateWindowFrame(Window : HWnd);
begin
SetWindowPos(Window, 0, 0, 0, 0, 0, SWP_NOZORDER or SWP_NOMOVE or
SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOCOPYBITS or SWP_FRAMECHANGED)
end;
InvalidateWindowFrame(CheckBox1.Handle)
Юрий Зотов (2002-08-14 09:34:00) [3]> Почему ... не работает код
Координаты Rect привязаны к форме, а InvalidateRect вызывается для CheckBox. Поэтому при вызове Rect оказывается неверным.
> Что вообще дает это Validate/Invalidate?
Задает часть окна, которую не/нужно перерисовывать. Позволяет избежать лишних операций.
Vaddya (2002-08-13 19:29:00) [4]Почему же тогда не работает код:
procedure TForm1.Button1Click(Sender: TObject);
var
Rect: TRect;
begin
SetWindowLong(CheckBox1.Handle, GWL_STYLE,
GetWindowLong(CheckBox1.Handle, GWL_STYLE) or BS_PUSHLIKE);
Rect.TopLeft := Point(CheckBox1.Left - 10, CheckBox1.Top - 10);
Rect.BottomRight := Point(CheckBox1.Left + CheckBox1.Width + 10,
CheckBox1.Top + CheckBox1.Height + 10);
Canvas.Rectangle(Rect); // Рисуется нормальный прямоугольник
InvalidateRect(CheckBox1.Handle, @Rect, True);
end;
Хотя если вместо 10 везде поставить 100, все нормально обновляется.
И еще. Судя по справке потом нужно вызвать ValidateRect? Или я что-то недопонял. Что вообще дает это Validate/Invalidate?
Юрий Зотов (2002-08-11 13:15:00) [5]Сначала инвалидировать регион (InvalidateRect, InvalidateRgn) и только потом вызвать UpdateWindow.
Vaddya (2002-08-11 08:52:00) [6]Это ясно, спасибо. А если программа целиком на Win32 API, без VCL, то как это сделать? Ведь сообщение CM_INVALIDATE относится к VCL.
Юрий Зотов (2002-08-10 18:15:00) [7]CheckBox1.Invalidate.
Vaddya (2002-08-10 16:06:00) [8]Все очень просто:
procedure TForm1.Button1Click(Sender: TObject);
begin
SetWindowLong(CheckBox1.Handle, GWL_STYLE,
GetWindowLong(CheckBox1.Handle, GWL_STYLE) or BS_PUSHLIKE);
end;
CheckBox после установки флага не обновляется, но если нажать на него, сразу обновляется. Так вот нужно, чтобы он сразу сам обновился. Дважды послать BM_CLICK конечно можно, но зачем же так топорно.
Юрий Зотов (2002-08-10 13:59:00) [9]Надо бы видеть код и место вызова SetWindowLong. Иначе что же тут скажешь?