Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Завтра :

День славянской письменности и культуры


Невидимость формы для мышки


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
Mol4un
Гость







СообщениеСб, 04-Июн-2005 11:25    Заголовок сообщения: Невидимость формы для мышки
Цитата

Есть форма с нкоторыми компонентами на ней. Необходимо, чтобы, например, мышкой можно было выделить значки в папке за формой. При этом форма остаётся видима (для удобства можно изменить её прозрачность).
Если кто знает и делал такое, то киньте кусочек кода или на словах опишите, как это реализуется. Я пойму.

зы: никогда не любил на форумах отвечать: на слишкомп простые вопросы потому, что они слишком простые. А на сложные - времени писать и тестить код жалко )
ззы: будьте снисходительны.
зззы: можете не отвечать :) код требуется только для собственного развития, не более.
В начало
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеСб, 04-Июн-2005 13:48 
Цитата

а ты "вырежи" в окне дырку. :)
как это сделать, поищи в интернете что-нибудь про создание окон произвольной формы.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж aka57
Я живу тут....


Возраст: 28
Знак зодиака: Стрелец
Зарегистрирован: 03.07.2003
Сообщения: 1287

СообщениеСб, 04-Июн-2005 15:04 
Цитата

есть куча статей, как это сделать...
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж aka57
Я живу тут....


Возраст: 28
Знак зодиака: Стрелец
Зарегистрирован: 03.07.2003
Сообщения: 1287

СообщениеСб, 04-Июн-2005 15:11 
Цитата

например:

http://sources.ru/delphi/gui/create_round_form.shtml
http://sources.ru/delphi/gui/nonrectangular_forms_and_controls.shtml
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Шурик
Я живу тут....


Возраст: 42
Знак зодиака: Овен
Зарегистрирован: 15.01.2003
Сообщения: 1951
Откуда: Киев
СообщениеСб, 04-Июн-2005 17:47 
Цитата

Вариант 1

По событиям мыши как-то пересылать их "тем, кто ниже".
Правда это только идея. Какому окну посылать не совсем понятно.

Вариант 2

Посмотри реализацию THintWindow (модуль Controls). Для окошка хинта как раз это и делается. Кажется это:

Код:
procedure THintWindow.WMNCHitTest(var Message: TWMNCHitTest);
begin
  Message.Result := HTTRANSPARENT;
end;


По идее это могло бы указываться ещё где-то в параметрах окна. Но там я такого не нашёл.

_________________
Ответ готов, готов ли твой вопрос?
В начало
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Пол:Муж aka57
Я живу тут....


Возраст: 28
Знак зодиака: Стрелец
Зарегистрирован: 03.07.2003
Сообщения: 1287

СообщениеСб, 04-Июн-2005 19:28 
Цитата

HitTest это по-моему компонентная затея. Так как некоторые контролы могут не иметь свой идентификатор окна (например, SpeedButton), то и события получать не могут. За сим контрол с идентификатором, допустим, при получении клика спрашивает свои подчиненные контролы - нужен ли им этот клик. Хотя точно я не помню. Поправте, если где ошибся
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Шурик
Я живу тут....


Возраст: 42
Знак зодиака: Овен
Зарегистрирован: 15.01.2003
Сообщения: 1951
Откуда: Киев
СообщениеСб, 04-Июн-2005 21:51 
Цитата

"Идентификатор окна" - это ты о TWinControl.Handle?
Хэндлы имеют только потомки TWinControl-а. Они существуют как системные оконные объекты. Они регистрируются в системе (TWinControl.CreateWnd, CreateParams). Там получают хэндл и указывают системе свою функцию обработки событий. Как "законным" окнам им могут приходить системные сообщения. В том числе и сообщения от мыши.

Теперь о TControl. Этот объект -- и есть "компонентная затея" на уровне Делфи. Он не имеет своего хэндла, может визуально существовать только в пределах какого-то WinControl-а, который является ему Parent-ом. Для рисования TControl.Canvas.Handle берётся из родительского WinControl-а. Фактически для системы существуют только WinControl-ы, а делфийские TControl-ы поддерживаются на них средствами объектной можели Борланда.

Теперь ближе к обсуждаемому вопросу.

WMNCHitTest - это обработчик системного оконного сообщения. Он определён не на уровне Делфи, а на уровне системы. Через обработку этого события окно указывает системе свою геометрию для мыши.

Вот только после всех рассуждений об оконных контролах у меня появляется закономерный вопрос. Если на форме есть другие WinControl-ы, кто должен отвечать на WM_NCHITTEST? Тот, кто выше или сперва форма, а потом все, кто выше. Или только форма? В HintWindow всё просто -- там один оконный контрол и всё. Ну, в этом уже не столь сложно разобраться эксперементально.

Да, кажется я только написав всё это понял, что хотел сказать Альберт.

А, ну вот в исходниках и ответ:
Код:
procedure TWinControl.WndProc(var Message: TMessage);
...
    WM_NCHITTEST:
      begin
        inherited WndProc(Message);
        if (Message.Result = HTTRANSPARENT) and
      (ControlAtPos(ScreenToClient(SmallPointToPoint(TWMNCHitTest(Message).Pos)), False) <> nil)
   then
            Message.Result := HTCLIENT;
        Exit;
      end;

Окно прозрачно для мыши, если оно "сказало" HTTRANSPARENT и на нём нет контролов, реагирующих на мышь.
Насколько понял из исходников процедуры ControlAtPos, "видимые" для мыши контролы должны быть Enabled и выдавать на CM_HITTEST (делфийское, не системное сообщение) ненулевой результат. По умолчанию CMHitTest выдаёт HTCLIENT.

П.С.
Извиняюсь за лирические отступления. Не сразу понял, что хотел сказать Альберт.

_________________
Ответ готов, готов ли твой вопрос?
В начало
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Mol4un
Гость







СообщениеВс, 05-Июн-2005 13:28 
Цитата

Спасибо большое за ответы.
На вышенаписанное могу сказать:
1: изменять форму формы (извините за тафтологию) категорически не подходит. Потому что интерфейс страдает. И вообще не серьёзно это.
2: насчёт сообщений. разобрался. Спасибо большое. Пока что работает. Счастлив

зы: пойду за бубном, шаманить буду, чтобы и дальше работало :) а ещё за пивком...
В начало
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100