Я создаю пользовательский интерфейс, используя чистый Direct2D и C # с SharpDX. Этот пользовательский интерфейс должен быть удобным и красивым, но при этом эффективным.
Для демонстрации я создал прототип с использованием хакерских недокументированных API (см. этот вопрос), но я никоим образом не собираюсь с этим работать, поскольку обратная совместимость является первой и главной причиной:
var accent = new User32.AccentPolicy { AccentState = AccentState };
int accentStructSize = Marshal.SizeOf(accent);
// allocate space for the struct
IntPtr accentPtr = Marshal.AllocHGlobal(accentStructSize);
Marshal.StructureToPtr(accent, accentPtr, false);
// set composition data
var data = new User32.WindowCompositionAttributeData {
Attribute = User32.WindowCompositionAttribute.WCA_ACCENT_POLICY,
SizeOfData = accentStructSize,
Data = accentPtr
};
// change window composition attributes and release resources
User32.SetWindowCompositionAttribute(Handle, ref data);
Marshal.FreeHGlobal(accentPtr);
Я знаю, что мгновенным ответом на это будет использование WPF, но я довольно ограничен необработанными вызовами Direct2D, так как я намереваюсь переместить всю логику пользовательского интерфейса в DLL для внедрения в приложения DirectX ( который, хотя и не уверен, как я собираюсь это сделать, выходит за рамки этого вопроса.)
В Windows 8.1 существует DirectComposition, который обеспечивает эффективное наложение альфа-канала поверх прозрачных окон.
Но в Windows Vista и 7 такого нет (даже с обновлением платформы).
Есть ли способ использовать чистый код Direct2D/DirectX без хакерского кода, чтобы этот пользовательский интерфейс работал во всех версиях Windows (предпочтительно Vista SP2 и выше)?
SharpDX.Direct3D11.BlendStateDescription
для смешивания при рендеринге различных текстур (соответствуетD3D11_BLEND_DESC
) — это будет то, что вы будете использовать, если перехватите рендеринг приложения DirectX как текстуру, а затем выполните повторный рендеринг в окно (перехват возможен, но это хак). Это не мой опыт, но похоже, чтоSetLayeredWindowAttributes
позволяет вам установить непрозрачность окна, если вы хотите создать окно, которое следует за приложением, которое вы подключаете, но не быть полностью непрозрачным. Это менее хакерски, поскольку вам не нужно перехватывать вызовы рендеринга исходного приложения. - person NextInLine   schedule 21.02.2018