Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1127984736
Кластер
2005-09-29 13:05
2005.10.23
как определить серийный номер...


14-1126789705
Igorek
2005-09-15 17:08
2005.10.23
Журнал "Хакер"


14-1128091925
vidiv
2005-09-30 18:52
2005.10.23
Ваши ассоциации связанные с названием сайта Непом.Ру


5-1103408543
klyonov
2004-12-19 01:22
2005.10.23
Пакеты


3-1126758023
Barmaglot
2005-09-15 08:20
2005.10.23
Склейка полей и отображение их в combobox





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