Вопрос по windows, winapi, c++ – Создание прозрачного дочернего окна поверх непрозрачного родительского окна (победа 32)

3

У меня есть программа, которая не написана мной. У меня нет источника, и разработчик этой программы разрабатывает самостоятельно. Он дает мнеHWND а такжеHINSTANCE ручки этой программы. Я создал дочернее окно на своем окне, используяwin32 апи. Первое, что мне нужно, чтобы это дочернее окно имело прозрачность в одной области и непрозрачное в другой области (например, отображение Heads Up (HUD) для игры), чтобы пользователь мог видеть вещи в обоих окнах.

Второе, что мне нужно, это направить весь ввод в родительское окно. Моё дочернее окно не требует ввода.

я знаю этоWS_EX_TRANSPARENT только заставляет ребенка рисовать в конце, как в алгоритме художников. я не могу использоватьWS_EX_LAYERED потому что это дочернее окно.

заранее спасибо :)

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

-- РЕДАКТИРОВАТЬ --------------------------- Привет ребят, Я все еще работаю над этим. пробуя разные способы с тем, что вы все предложили. Есть ли способ объединитьdirectX а такжеSetWindowRgn() функция илиdirectx сBitBlt() функция. Я думаю, что это поможет. В настоящее время я тестирую все вещи, как дочернее окно и многослойное окно.

да, и это также делает Hit Test прозрачным .. не видимость .. хе-хе Deamonpog
Если вы сделаете окно прозрачным, это позволит вам видеть только родительское окно. Вы пытаетесь сделать отверстие в родительском окне? Ben
Ну, вам нужен как минимум WS_EX_TRANSPARENT. Одна проблема, с которой вам придется столкнуться, заключается в том, что автор собирается стереть свое окно в сообщении WM_ERASEBKGND, и это приведет к удалению пикселей фона, которые вы получили из флага стиля. Таким образом, вам необходимо создать подкласс его оконной процедуры и подавить или заменить это сообщение. Хорошо ли работает то, что нарисовано с помощью WM_PAINT, - это открытый вопрос, который вам нужно выяснить для себя. Коэффициенты низкие, если он содержит какой-либо текст или графику с сглаженными краями. Размещение в качестве комментария, учитывая низкие шансы на успех. Hans Passant
Это уродливо, но вы можете создать рамку верхнего уровня над окном и отслеживать движение окна под ним. Затем настройте прозрачные области:codeguru.com/cpp/w-d/dislog/non-rectangulardialogs/article.php/… Pete
@HansPassant, WS_EX_TRANSPARENT - один из самых запутанных стилей окна. Это не делает окно прозрачным, оно просто меняет порядок рендеринга. Mark Ransom

Ваш Ответ

3   ответа
1

SetWindowRgn.

Кроме того, только то, что это не ваше окно, не означает, что вы не можете сделать его многоуровневым окном.

http://msdn.microsoft.com/en-us/library/ms997507.aspx

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

SetWindowRgn () заставляет экран рисовать только в определенной части экрана? Я попробовал это, и это могло бы помочь мне. Благодарю. :) Deamonpog
Я видел эту ссылку раньше и пробовал их тоже. но я боюсь, что если это повлияет на эту программу (игру) каким-то другим образом. Так что я пытаюсь не менять это окно, просто получать его ручки и другую информацию и манипулировать моим окном. спасибо за эту идею тоже :) Deamonpog
3

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

что я сделал,

Used (WS_EX_ TRANSPARENT | WS_EX_LAYERED | WS_EX_ TOOLWINDOW) and () on CreateWindowEx After creating the window, removed (WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE) from window styles and also removed (WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE | WS_EX_APPWINDOW) from extended window styles. This gives me a window with no borders and its also now shown in the taskbar. also the hittest is passed to whatever that is behind my window. Subclassed the window procedure of the other window and got the WM_CLOSE,WM_DESTROY, to send the WM_CLOSE or WM_DESTROY respectively to my window WM_SIZE,WM_MOVE, to resize and move my window according to the other window WM_LBUTTONUP,WM_RBUTTONUP,WM_MBUTTONUP, to make my window brought to the top, and still keep focus on the other window, so that my window doesn't get hidden behind the other window Made the directx device have two passes, In the first pass it draws all the elements in black on top of a white background and copy the backbuffer data to an another surface.( so it give a binary image of black & white ) In the second pass it draws the things normaly. An another thread is created to keep making the window transparency by reading that black & white surface, using SetWindowRgn function.

это работает отлично, единственное, это не очень делает вещи прозрачными. и другая проблема - дать альфа-смешение нарисованным объектам. но вы можете легко установить альфа (прозрачность), используя функцию SetLayeredWindowAttributes.

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

2

WS_EX_LAYERED задетские окна от Windows 8 и выше.

Для поддержки более ранних версий окон просто создайте многоуровневое окно в виде всплывающего окна (без хрома) и убедитесь, что оно расположено над окном игры в соответствующем месте. Большинство пользователей не перемещают окна, с которыми они работают все время, поэтому, хотя вам нужно будет следить за перемещением родительского окна и переставлять HUD, это не должно быть ограничителем показа.

Отсутствие фокусировки (в случае дочернего окна) или активации (в случае всплывающего окна) более интересно, но все же вполне выполнимо: - Операционная система фактически не назначает ни фокус, ни активацию автоматически; в окно, по которому щелкают - Windows WindowProc всегда фокусируется или активируется, вызываяSetFocusили какой-то вариантSetActiveWindow или жеSetForegroundWindow на себя. Здесь важно то, что если вы используете все сообщения мыши и мыши, не относящиеся к клиенту, не передавая их в DefWindowProc, ваш HUD никогда не будет красть активацию или фокус клавиатуры из окна игры в результате щелчка.

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

Похожие вопросы