Главная страница
    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.47 MB
Время: 0.008 c
1-98129
dimanew
2002-09-20 12:18
2002.09.30
Какое св-во CheckListBox говроит что item


1-98208
LAndrew
2002-09-15 22:07
2002.09.30
ListView и контекстное меню как в проводнике, как сделать?


8-98242
Alexey-neo
2002-05-13 21:36
2002.09.30
Как осуществить поворот?


3-98005
Aristarh
2002-09-09 17:55
2002.09.30
Ошибка при открытии IB таблицы.


3-98021
BlackTiger
2002-09-10 20:13
2002.09.30
ADO vs BDE vs





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