Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.30;
Скачать: CL | DM;

Вниз

Добавление флага стиля и обновление окна   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2002.09.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
14-98357
Карлсон
2002-09-06 15:35
2002.09.30
CC


3-97956
billybons
2002-09-09 08:01
2002.09.30
DBGrid


7-98387
Souler
2002-07-19 09:22
2002.09.30
Иконка мой компьютер


1-98145
Dark Hunter
2002-09-17 15:51
2002.09.30
Нечто с трудом понимаемое...


3-97953
RDA
2002-09-08 13:46
2002.09.30
FIBPlus и Мастер - Деталь