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

Вниз

Тень от окна (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 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.043 c
1-1128013964
userrrrr
2005-09-29 21:12
2005.10.23
как получит ин-цию о процессоре?


2-1127897200
gvv
2005-09-28 12:46
2005.10.23
Запись string-вой строки в текстовый файл


6-1120273852
yurikon
2005-07-02 07:10
2005.10.23
ICQ


1-1128091535
shamansky
2005-09-30 18:45
2005.10.23
RoseDelphiLink-3.2.20041014


3-1126194426
kreyl
2005-09-08 19:47
2005.10.23
MSSQL2000 Как передать в процедуру имя таблицы в виде строки?