Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Создание "сквозной" формы средствами WinAPI (http://forum.oszone.net/showthread.php?t=138725)

garkin123 26-04-2009 17:51 1104784

Создание "сквозной" формы средствами WinAPI
 
Под сквозным понимаю пропускающее сквозь себя сообщения мыши и драгндропа в любой области, независимо от цвета заполнения. Никто не подскажет как можно подобное осуществить?
Предполагается, что окно будет полупрозрачным и будет осуществлять функцию вывода текстовой и графической информации.

Admiral 27-04-2009 02:00 1105109

garkin123 самое простое это найти перед запуском программы выделенное окно с помощью функции GetForegroundWindow(), а на события мыши и Драг & Дропа (в некоторой русскоязычной литературе данный термин заменяют одним словом - "Буксирования", подразумевая что мышь буксир выделенного объекта) выделять с помощью функции SetForegroundWindow() то окно по хендлу, таким образом сообщения будут на сквозь проходить.

garkin123 27-04-2009 14:23 1105404

Цитата:

Цитата Admiral
а на события мыши и Драг & Дропа »

То есть само окно должно получать эти события, смещая по ним фокус на SetForegroundWindow? И будет ли этот способ работать, если "сквозное" окно находится над несколькими другими, разрешая доступ к ним всем, учитывая так же что они будут иногда сменять друг друга?

И вопрос, что из себя представляют события "буксировки" и как их перехватывать средствами WinAPI, просто максимум, что я знаю об этом это то, что эти процессы осуществляются при помощи OLE.

И правильно ли я понял, что не существует способа задать окну такой стиль, чтобы оно перестало учавствовать/мешать в итерациях пользователя с компьютером, при этом отображаясь на экране?

Admiral 27-04-2009 19:45 1105716

garkin123, да, такая идея. В этом случаи нужно будет искать хендл окна, которое перекрыто, опираясь на показания Z-Ordera. Что бы учитывать, что перекрытых окон может быть несколько, нужно будет оперировать координатами.

События буксировки такие же как и остальные события (если быть точным, окно получает зажатую и опушенную клавишу мыши в момент передачи объекта), нужно будет сделать своё окно буксиро-приёмным и получать на себя объекты, а потом отправить его другому окну.
Абсолютно верно, достаточно подробно данный вопрос описан в книге Inside OLE by Kraig Brockschmidt (на русском не встречал). Есть уже и 2я редакция.
Вкратце на данную тему есть туториал, правда тоже на английском языке OLE Drag and Drop

Если кто знает такой, то пусть отпишется, буду благодарен.
P.S.
Есть WS_DISABLED, но он клики на себя берёт, но в отличии от других "ENABLED" стилей по заголовку окна не видна передача событий мыши.

garkin123 28-04-2009 17:50 1106488

В общем, как и многие вещи в нашей жизни, после долгих поисков и уже было начавшегося процесса написания функции для вывода через рисование в контекст экрана и во время поиска информации для оного, обнаружились две строчки кода, в корне меняющие все и делающие бесполезной всю выполненную работу.

WS_EX_TRANSPARENT:=0x20
&&
WS_EX_LAYERED := 0x80000

Admiral 29-04-2009 03:27 1106880

garkin123, :clapping: :up
P.S. Для полной прозрачности можно добавить ещё и WS_EX_TOPMOST, что б само окно при прохождении событий не терялось из виду.
Без WS_EX_LAYERED не получилась бы визуальная прозрачность выставляемая функцией SetLayeredWindowAttributes()
Можно отметить тему решённой :)

hackroute 14-11-2009 22:59 1270481

так все таки тема нерешена? или garkin123 все же сделал что хотел и если сделал то опиши как)

Admiral 14-11-2009 23:41 1270491

hackroute, тема действительно решена. WS_EX_TRANSPARENT это расширенный стиль окна, который нужно задавать в первый параметр функции CreateWindowEx - в результате будет создано сквозное окно.
Если трудности с построением WIN32 приложения, то каркас можно посмотреть в этой теме.


Время: 12:18.

Время: 12:18.
© OSzone.net 2001-