| Автор
| Сообщение |
|
|
|
Цитата |
|
Есть форма с нкоторыми компонентами на ней. Необходимо, чтобы, например, мышкой можно было выделить значки в папке за формой. При этом форма остаётся видима (для удобства можно изменить её прозрачность).
Если кто знает и делал такое, то киньте кусочек кода или на словах опишите, как это реализуется. Я пойму.
зы: никогда не любил на форумах отвечать: на слишкомп простые вопросы потому, что они слишком простые. А на сложные - времени писать и тестить код жалко )
ззы: будьте снисходительны.
зззы: можете не отвечать код требуется только для собственного развития, не более. |
|
| В начало |
|
 |
|
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
а ты "вырежи" в окне дырку.
как это сделать, поищи в интернете что-нибудь про создание окон произвольной формы. |
|
| В начало |
|
 |
 aka57
Я живу тут....

Возраст: 28
Знак зодиака: 
Зарегистрирован: 03.07.2003
Сообщения: 1287
|
|
|
Цитата |
|
| есть куча статей, как это сделать... |
|
| В начало |
|
 |
 aka57
Я живу тут....

Возраст: 28
Знак зодиака: 
Зарегистрирован: 03.07.2003
Сообщения: 1287
|
|
| В начало |
|
 |
 Шурик
Я живу тут....

Возраст: 42
Знак зодиака: 
Зарегистрирован: 15.01.2003
Сообщения: 1951
Откуда: Киев
|
|
|
Цитата |
|
Вариант 1
По событиям мыши как-то пересылать их "тем, кто ниже".
Правда это только идея. Какому окну посылать не совсем понятно.
Вариант 2
Посмотри реализацию THintWindow (модуль Controls). Для окошка хинта как раз это и делается. Кажется это:
| Код: | procedure THintWindow.WMNCHitTest(var Message: TWMNCHitTest);
begin
Message.Result := HTTRANSPARENT;
end; |
По идее это могло бы указываться ещё где-то в параметрах окна. Но там я такого не нашёл. _________________ Ответ готов, готов ли твой вопрос? |
|
| В начало |
|
 |
 aka57
Я живу тут....

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

Возраст: 42
Знак зодиака: 
Зарегистрирован: 15.01.2003
Сообщения: 1951
Откуда: Киев
|
|
|
Цитата |
|
"Идентификатор окна" - это ты о 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.
П.С.
Извиняюсь за лирические отступления. Не сразу понял, что хотел сказать Альберт. _________________ Ответ готов, готов ли твой вопрос? |
|
| В начало |
|
 |
|
|
|
Цитата |
|
Спасибо большое за ответы.
На вышенаписанное могу сказать:
1: изменять форму формы (извините за тафтологию) категорически не подходит. Потому что интерфейс страдает. И вообще не серьёзно это.
2: насчёт сообщений. разобрался. Спасибо большое. Пока что работает.
зы: пойду за бубном, шаманить буду, чтобы и дальше работало а ещё за пивком... |
|
| В начало |
|
 |
|