![]() |
Создание "сквозной" формы средствами WinAPI
Под сквозным понимаю пропускающее сквозь себя сообщения мыши и драгндропа в любой области, независимо от цвета заполнения. Никто не подскажет как можно подобное осуществить?
Предполагается, что окно будет полупрозрачным и будет осуществлять функцию вывода текстовой и графической информации. |
garkin123 самое простое это найти перед запуском программы выделенное окно с помощью функции GetForegroundWindow(), а на события мыши и Драг & Дропа (в некоторой русскоязычной литературе данный термин заменяют одним словом - "Буксирования", подразумевая что мышь буксир выделенного объекта) выделять с помощью функции SetForegroundWindow() то окно по хендлу, таким образом сообщения будут на сквозь проходить.
|
Цитата:
И вопрос, что из себя представляют события "буксировки" и как их перехватывать средствами WinAPI, просто максимум, что я знаю об этом это то, что эти процессы осуществляются при помощи OLE. И правильно ли я понял, что не существует способа задать окну такой стиль, чтобы оно перестало учавствовать/мешать в итерациях пользователя с компьютером, при этом отображаясь на экране? |
garkin123, да, такая идея. В этом случаи нужно будет искать хендл окна, которое перекрыто, опираясь на показания Z-Ordera. Что бы учитывать, что перекрытых окон может быть несколько, нужно будет оперировать координатами.
События буксировки такие же как и остальные события (если быть точным, окно получает зажатую и опушенную клавишу мыши в момент передачи объекта), нужно будет сделать своё окно буксиро-приёмным и получать на себя объекты, а потом отправить его другому окну. Абсолютно верно, достаточно подробно данный вопрос описан в книге Inside OLE by Kraig Brockschmidt (на русском не встречал). Есть уже и 2я редакция. Вкратце на данную тему есть туториал, правда тоже на английском языке OLE Drag and Drop Если кто знает такой, то пусть отпишется, буду благодарен. P.S. Есть WS_DISABLED, но он клики на себя берёт, но в отличии от других "ENABLED" стилей по заголовку окна не видна передача событий мыши. |
В общем, как и многие вещи в нашей жизни, после долгих поисков и уже было начавшегося процесса написания функции для вывода через рисование в контекст экрана и во время поиска информации для оного, обнаружились две строчки кода, в корне меняющие все и делающие бесполезной всю выполненную работу.
WS_EX_TRANSPARENT:=0x20 && WS_EX_LAYERED := 0x80000 |
garkin123, :clapping: :up
P.S. Для полной прозрачности можно добавить ещё и WS_EX_TOPMOST, что б само окно при прохождении событий не терялось из виду. Без WS_EX_LAYERED не получилась бы визуальная прозрачность выставляемая функцией SetLayeredWindowAttributes() Можно отметить тему решённой :) |
так все таки тема нерешена? или garkin123 все же сделал что хотел и если сделал то опиши как)
|
hackroute, тема действительно решена. WS_EX_TRANSPARENT это расширенный стиль окна, который нужно задавать в первый параметр функции CreateWindowEx - в результате будет создано сквозное окно.
Если трудности с построением WIN32 приложения, то каркас можно посмотреть в этой теме. |
Время: 12:18. |
Время: 12:18.
© OSzone.net 2001-