Форум: "WinAPI";
Текущий архив: 2002.09.30;
Скачать: [xml.tar.bz2];
ВнизДобавление флага стиля и обновление окна Найти похожие ветки
← →
Vaddya (2002-08-10 13:02) [0]С помощью SetWindowLong добавляю CheckBox-у флаг BS_PUSHLIKE не в событии формы OnCreate, т.е. не при создании. Как обновить этот CheckBox, чтобы изменения были выдны? UpdateWindow и подобные не обновляют.
← →
Юрий Зотов (2002-08-10 13:59) [1]Надо бы видеть код и место вызова SetWindowLong. Иначе что же тут скажешь?
← →
Vaddya (2002-08-10 16:06) [2]Все очень просто:
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 18:15) [3]CheckBox1.Invalidate.
← →
Vaddya (2002-08-11 08:52) [4]Это ясно, спасибо. А если программа целиком на Win32 API, без VCL, то как это сделать? Ведь сообщение CM_INVALIDATE относится к VCL.
← →
Юрий Зотов (2002-08-11 13:15) [5]Сначала инвалидировать регион (InvalidateRect, InvalidateRgn) и только потом вызвать UpdateWindow.
← →
Vaddya (2002-08-13 19:29) [6]Почему же тогда не работает код:
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-14 09:34) [7]> Почему ... не работает код
Координаты Rect привязаны к форме, а InvalidateRect вызывается для CheckBox. Поэтому при вызове Rect оказывается неверным.
> Что вообще дает это Validate/Invalidate?
Задает часть окна, которую не/нужно перерисовывать. Позволяет избежать лишних операций.
← →
Ученик (2002-08-14 09:47) [8]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 10:13) [9]В дополнение. Не всякий стиль окна можно добавить по SetWindowLong после создания окна. При изменении стиля таким путем окну посылаются сообщения WM_STYLECHANGING и WM_STYLECHANGED и дело окна отреагировать на эти сообщения - либо принять устанавливаемый стиль, либо не принять. Либо внутри себя сказать Invalidate.
С уважением,
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.09.30;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c