Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2012, 14:15   #1
Now.
 
Регистрация: 25.07.2012
Сообщений: 5
Лампочка GetWindowsLong & SetWindowLong

Здравствуйте
Пытаясь написать что-то вроде виджета, я нагуглил интересный способ придать форме прозрачность для нажатий мыши (Click pass though). Заключается он в одной единственной строчке:

Код:
SetWindowLong(Handle, GWL_EXSTYLE, $8080028);
Всё бы хорошо, но вот решив сделать эту функцию переключаемой в меню (Checked), чтобы в случае надобности можно было передвинуть форму, наткнулся на такую проблему как нехватка знаний, и гугл скилл в этот раз не помогает Вся проблема заключается в том, что я не знаю как это отменяется. Прочитал статьи и справки, касаемые этих функций, но нашел всего один единственный ответ, но не исчерпывающий. Там посоветовали перед активацией функции, запросить изначальный стиль формы функцией GetWindowsLong и хранить его в переменной, после чего при надобности возвращать значение, затирая код, который я показал выше. Вот если бы я знал как это всё вообще выглядит... Помогите люди добрые подробными примерами
Now. вне форума Ответить с цитированием
Старый 25.07.2012, 16:32   #2
AlexMas
Пользователь
 
Аватар для AlexMas
 
Регистрация: 30.05.2012
Сообщений: 69
По умолчанию

Код:
//при установке прозрачности
oldstyle := GetWindowLong(Application.Handle, GWL_EXSTYLE);
SetWindowLong(Handle, GWL_EXSTYLE, $8080028);

//при отмене
SetWindowLong(Handle, GWL_EXSTYLE, oldstyle);
не?
AlexMas вне форума Ответить с цитированием
Старый 25.07.2012, 18:02   #3
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Now., играешь против правил, смотри, как бы ОС тебе не отомстила. Или ее разработчики в следующих релизах/апдейтах Говорено 1000 раз: не пользуйтесь магическими константами. Вот что делает твой код:

Код:
SetWindowLong(Handle, GWL_EXSTYLE,
   WS_EX_NOACTIVATE or      // $08000000
   WS_EX_LAYERED or         // $00080000
   WS_EX_TRANSPARENT or     // $00000020
   WS_EX_TOPMOST);          // $00000008
А теперь внимательно читаем, что можно устанавливать с помощью SetWindowLong (тот момент, что SetWindowLong не стоит использовать вообще - и это тоже указано в MSDN - я пока не акцентирую), а что - нет. И что видим?

Цитата:
WS_EX_TOPMOST
The window should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.
То, что оно у тебя отработало - это либо везение, либо просто "до поры, до времени". И когда, в один прекрасный момент (а может, и не очень прекрасный), у тебя что-нибудь перестанет работать - не говори, что я тебя не предупреждал.
volvo877 вне форума Ответить с цитированием
Старый 25.07.2012, 20:15   #4
Now.
 
Регистрация: 25.07.2012
Сообщений: 5
Радость

AlexMas, Благодарю, получилось более-менее. Правда при переключении вся прозрачность формы пропадала, но получилось частично решить, добавив еще строку:

Код:
SetWindowLong(Handle, GWL_EXSTYLE, $8080028);
Main.Brush.Style:=bsClear;
Так хоть и появляются артефакты по краям png изображений в ~1px, копирующие фон при клике активации, но это не шибко страшно. Хотя бы так.

Получилось с переключателем:


Было раньше без него:



Цитата:
Сообщение от volvo877 Посмотреть сообщение
Now., играешь против правил, смотри, как бы ОС тебе не отомстила. Или ее разработчики в следующих релизах/апдейтах Говорено 1000 раз: не пользуйтесь магическими константами.
Совсем не страшно играть против правил, когда их не знаешь К тому же, аналогов этой функции я не нашел. Но как-то же делают? Да и что может случиться, кроме как глюков программки? Не страшно, я в паблик не собираюсь её выкладывать. Только для себя, так сказать "облегчение юзабилити".

Кстати, я так всю программу методом гугла написал. Может быть что-то осуществил старым методом, что-то не рекомендуемым, но кое-как эта вся конструкция работает. Вот до сих пор не знаю только как осуществить альфа каналы изображения + прозрачную главную форму. Т.е. чтобы получилась полупрозрачная, рисованнае мною панель (png файл с альфой), которая играет роль основной формы в скомпилированном приложении, потому что сама основная форма прозрачная (TransparentColorValue - clWhite, TransparentColor - True, Color - clWhite). Получается только с png со 100%-й видимостью, иначе же за ним просвечивается clWhite.

Последний раз редактировалось Now.; 25.07.2012 в 20:48.
Now. вне форума Ответить с цитированием
Старый 26.07.2012, 15:49   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Так хоть и появляются артефакты по краям png изображений в ~1px, копирующие фон при клике активации, но это не шибко страшно.
Есть мнение, что попутал правую-нижнюю координату (Right/Bottom) с высотой и шириной. Там как раз разница 1 пиксель.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 26.07.2012, 18:54   #6
Now.
 
Регистрация: 25.07.2012
Сообщений: 5
По умолчанию

Так и есть, вчера заметил. Но округлые углы у png всё равно не исправить.
Now. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разница между cout/cin && printf/scanf treis1000 Общие вопросы C/C++ 7 20.03.2012 18:49
Обычный класс и SetWindowLong Alexoid Общие вопросы C/C++ 1 14.01.2011 08:21
GetWindowLong и SetWindowLong Coyot Помощь студентам 0 04.12.2010 14:03
TForm & TImage & PNG & Прозрачность delphi_beginner Общие вопросы Delphi 7 19.09.2009 08:46
Вопрос про SetWindowLong() yngwie Win Api 2 03.04.2009 11:55