Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.009 c
1-98179
AndreyS
2002-09-17 18:31
2002.09.30
Упаковщики exe


3-98004
Карелин Артем
2002-09-10 16:08
2002.09.30
Ускорение работы базы при больших Blob.


3-97946
VaZ
2002-09-05 09:06
2002.09.30
Еще раз о больном: Calculated Fields


1-98036
France
2002-09-18 22:45
2002.09.30
TStringGrid


14-98346
SPeller
2002-09-05 06:23
2002.09.30
Халява





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