Форум: "WinAPI";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];
ВнизТень от окна (CS_DROPSHADOW) Найти похожие ветки
← →
Antonn © (2005-08-19 14:34) [0]Как включить я знаю, а вот как отключить?
Включаю:protected
procedure CreateParams(var Params: TCreateParams); override;
procedure TMainForm.CreateParams(var Params: TCreateParams);
const CS_DROPSHADOW = $00020000;
begin
inherited;
Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW;
end;
Спасибо.
← →
Eraser © (2005-08-19 15:38) [1]Antonn © (19.08.05 14:34)
Params.WindowClass.Style := Params.WindowClass.Style or not CS_DROPSHADOW;
← →
Юрий Зотов © (2005-08-19 15:39) [2]type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
FShadow: boolean;
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FShadow := not FShadow;
RecreateWnd
end;
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited;
if FShadow then
Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW
end;
← →
Юрий Зотов © (2005-08-19 15:46) [3]> Eraser © (19.08.05 15:38) [1]
... and not CS_DROPSHADOW
> Antonn © (19.08.05 14:34)
Либо так (без CreateParams и RecreateWnd):
procedure TForm1.Button1Click(Sender: TObject);
begin
FShadow := not FShadow;
if FShadow then
SetClassLong(Handle, GCL_STYLE,
GetClassLong(Handle, GCL_STYLE) or CS_DROPSHADOW)
else
SetClassLong(Handle, GCL_STYLE,
GetClassLong(Handle, GCL_STYLE) and not CS_DROPSHADOW)
end;
← →
Eraser © (2005-08-19 15:53) [4]Юрий Зотов © (19.08.05 15:46) [3]
... and not CS_DROPSHADOW
Мда... щас глянул - обычно записывают именно "and not" хотя по логике должен именно or быть.
Может так правильно: GetClassLong(Handle, GCL_STYLE) or (not CS_DROPSHADOW)) ?
← →
Eraser © (2005-08-19 16:01) [5]Вопрос снят, про инверсию забыл )
← →
Юрий Зотов © (2005-08-19 16:12) [6]> Eraser © (19.08.05 15:53) [4]
Что значит "обычно"? Есть правила булевой алгебры, никто их пока не отменял. Это все равно, что сказать "дважды два обычно четыре". Не обычно, а всегда, это правило арифметики такое.
По логике как раз and not и должно быть. Мы же хотим бит сбросить.
CS_DROPSHADOW=$20000 или 0010 0000 0000 0000 0000 (дв.). Как видим, здесь установлен 17-й бит, остальные сброшены. Соответственно, в (not CS_DROPSHADOW) будет наоборот - 17-й бит сброшен, остальные установлены. Значит:
X or CS_DROPSHADOW - установит 17-й бит X независимо от того, что в нем было ранее (b or 1 = 1), а остальные биты не изменятся (b or 0 = b).
X and not CS_DROPSHADOW - сбросит 17-й бит X независимо от того, что в нем было ранее (b and 0 = 0), а остальные биты не изменятся (b and 1 = b).
Что и требуется. А вот
X or not CS_DROPSHADOW - установит все биты X, а 17-й как раз и не изменится. Этого нам не надо.
← →
Eraser © (2005-08-19 16:21) [7]Юрий Зотов © (19.08.05 16:12) [6]
Да это я уже понял!
Ошибка позорненькая конечно...(
← →
Antonn © (2005-08-19 17:10) [8]Eraser © (19.08.05 15:38) [1]
у меня окно создается один раз, моя задача без перезапуска программы вкл/выкл тень. А предложеный способ сработает толбко при создании окна, а при RecreateWnd слетают остальные св-ва.
Юрий Зотов © (19.08.05 15:46) [3]
спасибо большущее, заработало, я почти тоже самое делал, но не в той степи:
if CheckBox1.Checked then SetWindowLong(handle, GWL_EXSTYLE, GetWindowLong(handle,GWL_EXSTYLE) or CS_DROPSHADOW) else
SetWindowLong(handle, GWL_EXSTYLE, GetWindowLong(handle,GWL_EXSTYLE) and ((not 0)-CS_DROPSHADOW));
кстати, это вот с этим я не переборщил?
GetWindowLong(handle,GWL_EXSTYLE) and ((not 0)-CS_DROPSHADOW))
← →
Юрий Зотов © (2005-08-19 17:39) [9]> Antonn © (19.08.05 17:10) [8]
SetWindowLong здесь не годится. Нам же нужно сменить стиль не самого окна, а класса окна - значит, SetClassLong.
> кстати, это вот с этим я не переборщил?
Переборщил, конечно. Просто and not CS_DROPSHADOW.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.038 c