PDA

Показать полную графическую версию : Создание "сквозной" формы средствами WinAPI


garkin123
26-04-2009, 17:51
Под сквозным понимаю пропускающее сквозь себя сообщения мыши и драгндропа в любой области, независимо от цвета заполнения. Никто не подскажет как можно подобное осуществить?
Предполагается, что окно будет полупрозрачным и будет осуществлять функцию вывода текстовой и графической информации.

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

garkin123
27-04-2009, 14:23
а на события мыши и Драг & Дропа »То есть само окно должно получать эти события, смещая по ним фокус на SetForegroundWindow? И будет ли этот способ работать, если "сквозное" окно находится над несколькими другими, разрешая доступ к ним всем, учитывая так же что они будут иногда сменять друг друга?

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

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

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

События буксировки такие же как и остальные события (если быть точным, окно получает зажатую и опушенную клавишу мыши в момент передачи объекта), нужно будет сделать своё окно буксиро-приёмным и получать на себя объекты, а потом отправить его другому окну.
Абсолютно верно, достаточно подробно данный вопрос описан в книге Inside OLE by Kraig Brockschmidt (http://www.freebookspot.ws/Comments.aspx?Element_ID=3290) (на русском не встречал). Есть уже и 2я редакция.
Вкратце на данную тему есть туториал, правда тоже на английском языке OLE Drag and Drop (http://www.catch22.net/tuts/dragdrop)

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

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

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

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

hackroute
14-11-2009, 22:59
так все таки тема нерешена? или garkin123 все же сделал что хотел и если сделал то опиши как)

Admiral
14-11-2009, 23:41
hackroute, тема действительно решена. WS_EX_TRANSPARENT это расширенный стиль окна, который нужно задавать в первый параметр функции CreateWindowEx - в результате будет создано сквозное окно.
Если трудности с построением WIN32 приложения, то каркас можно посмотреть в этой теме (http://forum.oszone.net/thread-147764.html).




© OSzone.net 2001-2012