Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.239.148] |
|
Сообщ.
#1
,
|
|
|
Можно ли сделать окно так, чтобы с одной стороны его было видно на экране, а с другой стороны - чтобы курсор за него не цеплялся, т.е. как будто его нет?
ЗЫ. Чушь наверное спрашиваю, но интересно |
Сообщ.
#2
,
|
|
|
Чего-то я не понимаю. Нужно чтобы размары окна можно было менять с одной стороны (как в WinAmp)?
Если нет, то с какой тогда стороны? |
Сообщ.
#3
,
|
|
|
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; ... procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest); begin Message.Result := HTTRANSPARENT; end; Это нужно? |
Сообщ.
#4
,
|
|
|
Цитата Rouse_,8.12.04, 13:41 @ procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; ... procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest); begin Message.Result := HTTRANSPARENT; end; Это нужно? Да наверное нет. Мне нужно, чтобы курсор "проваливался" через окно в нижележащее окно. Т.е. чтобы мое окно было просто видно, но никаким иным способом оно себя не проявляло. Для чего? Ну например, висят на экране часы (полупрозрачные), и иногда мешают, т.к. нужно нажать что-нибудь под ними. Приходится двигать. |
Сообщ.
#5
,
|
|
|
M Тема перенесена из Delphi -> Delphi: Общие вопросы. |
Сообщ.
#6
,
|
|
|
М-да... Скорее всего, нельзя. Буду делать "убегающее" окно. Хотя круто было-бы
|
Сообщ.
#7
,
|
|
|
Думаю, что можно. Перехватывать нажатие кнопки мыши в пределах формы, определять экранные координаты, искать, какое окно расположено под ним в пределах этих координат. Ну и соответственно передавать нажатие этому окну.
Добавлено Вот я только точно не знаю как реализовать поиск окна по координатам. Хотя способы есть. Многие программы это умеют! |
Сообщ.
#8
,
|
|
|
Цитата Ну и соответственно передавать нажатие этому окну. Но наверное, не просто окну, а в конкретное "место" окна. А это получается еще интереснее... |
Сообщ.
#9
,
|
|
|
Цитата s-mike,8.12.04, 14:26 @ Вот я только точно не знаю как реализовать поиск окна по координатам. Хотя способы есть. Многие программы это умеют! Может быть кто-то нам подскажет? |
Сообщ.
#10
,
|
|
|
Цитата s-mike,8.12.04, 14:26 @ Вот я только точно не знаю как реализовать поиск окна по координатам. Хотя способы есть. Многие программы это умеют! GetWindowFromPoint Хотя есть ещё функция, более надёжная. Названия, к сожалению, не помню. Но, кажется, Song знает (когда-то, в какой-то теме видел его пост про это). В любом случае, можно попытать Поиск. |
Сообщ.
#11
,
|
|
|
GetWindowFromPoint возвращает нэндл окна находящегося впереди всех в данной точке, поэтому для данной задачи не подойдет...
|
Сообщ.
#12
,
|
|
|
Только WindowFromPoint(), без Get.
Цитата Curve,8.12.04, 21:36 @ Но, кажется, Song знает (когда-то, в какой-то теме видел его пост про это). В любом случае, можно попытать Поиск. не помню Может и говорил. |
Сообщ.
#13
,
|
|
|
Как показала тема "Прозрачность" для мышки WindowFromPoint не пашет, поскольку возвращает координаты как раз того окна, по которому и был произведен щелчок, что не представляет никакой ценности.
Но я нашел другое решение. Смотрите пост "Прозрачность" для мышки (сообщение #577723). |
Сообщ.
#14
,
|
|
|
s-mike, там твоё бесценное решение было разделено в тему Прозрачная форма раздела FAQ. По сему и не смог тебе плюсик поставить. Ставлю здесь Спасибо!
Добавлено Упс Пишет Цитата Обнаружена ошибка Вы в недавнее время уже меняли рейтинг этого пользователя. До следующего изменения должно пройти 1 дней |
Сообщ.
#15
,
|
|
|
Стоп, а если задавать WindowStyle как TRANSPARENT (точное название константы сейчас не вспомню)? Насколько помню, у меня как раз такое и получалось, когда я пробовал делать прозрачное местами окно. Копни MSDN на тему window styles / extended styles.
|
Сообщ.
#16
,
|
|
|
Да, действительно в МСДНе об этом написано. Цитирую:
Цитата Hit testing of a layered window is based on the shape and transparency of the window. This means that the areas of the window that are color-keyed or whose alpha value is zero will let the mouse messages through. If the layered window has the WS_EX_TRANSPARENT extended window style, the shape of the layered window will be ignored and the mouse events will be passed to the other windows underneath the layered window. |
Сообщ.
#17
,
|
|
|
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT );
|
Сообщ.
#18
,
|
|
|
Идея: ловить нажатие нашим окном, создавать в нём дырку в 1 пиксель и передавать нажатие ниже
|
Сообщ.
#19
,
|
|
|
Scorpy, а ты не идеи подкидывай, а реализуй и код покажи.
|
Сообщ.
#20
,
|
|
|
Цитата Scorpy @ Идея: ловить нажатие нашим окном, создавать в нём дырку в 1 пиксель и передавать нажатие ниже Класс - обожаю безбашенные идеи )) Лови плюс |
Сообщ.
#21
,
|
|
|
Цитата а ты не идеи подкидывай, а реализуй и код покажи. как-то так procedure TForm1.HandleMessage(var Msg: tagMSG;var Handled: Boolean); Var P,PP:TPoint; S,SS,R:HRGN; begin Inherited; {Case Msg.message Of WM_MOUSEFIRST..WM_MOUSELAST: Begin} PP:=Mouse.CursorPos; P:=ScreenToClient(PP); R:=CreateRectRgn(P.X,P.Y,P.X+1,P.Y+1); SS:=CreateRectRgn(0,0,Width,Height); S:=CreateRectRgn(0,0,Width,Height); CombineRgn(S,SS,R,RGN_XOR); SetWindowRgn(Handle,S,True); SendMessage(WindowFromPoint(PP),Msg.message,Msg.wParam,Msg.lParam); DeleteObject(R); DeleteObject(S); DeleteObject(SS); Handled:=True; { End; End;} end; procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMessage:=HandleMessage; end; сильно не пинайте, с регионами второй раз сталкиваюсь ЗЫ надобно доделать: пересылать не все сообщения/сообщения не только мыши (я думаю) ЗЫЫ Окно fsStayOnTop |
Сообщ.
#22
,
|
|
|
Scorpy, надо хотя бы тестировать свой код перед тем, как кидать на форум.
|
Сообщ.
#23
,
|
|
|
Цитата s-mike надо хотя бы тестировать свой код перед тем, как кидать на форум. а что не так? у меня работает ЗЫ забыл, пример был для BorderStyle:=bsNone новый вариант, для любого BorderStyle: procedure TForm1.HandleMessage(var Msg: tagMSG;var Handled: Boolean); Var P:TPoint; S,R:HRGN; begin Inherited; Case Msg.message Of WM_MOUSEFIRST..WM_MOUSELAST: Begin P.X:=ScreenToClient(Msg.pt).X+ClientOrigin.X-Left; P.Y:=ScreenToClient(Msg.pt).Y+ClientOrigin.Y-Top; R:=CreateRectRgn(P.X,P.Y,P.X+1,P.Y+1); S:=CreateRectRgn(0,0,Width,Height); CombineRgn(S,S,R,RGN_XOR); SetWindowRgn(Handle,S,True); SendMessage(WindowFromPoint(Msg.pt),Msg.message,Msg.wParam,Msg.lParam); DeleteObject(R); DeleteObject(S); Handled:=True; End; End; end; procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMessage:=HandleMessage; end; сообщения неклиентской части ловить лень |
Сообщ.
#24
,
|
|
|
Scorpy, отлично! Лови +!
|
Сообщ.
#25
,
|
|
|
Хе - а я с локальным хуком парился
Молодец, лови и от меня заслуженный + |