2008-09-29 14 views
5

मैं डायरेक्टएक्स सामग्री को आकर्षित करना चाहता हूं ताकि यह डेस्कटॉप के शीर्ष पर चल रहा हो और किसी अन्य एप्लिकेशन को चल रहा हो। मुझे डायरेक्टएक्स सामग्री को सेमी-पारदर्शी बनाने में भी सक्षम होना चाहिए, इसलिए अन्य चीजें दिखाती हैं। क्या इसे करने का कोई तरीका है?मैं पारदर्शी विंडो में पारदर्शी डायरेक्टएक्स सामग्री कैसे आकर्षित करूं?

मैं प्रबंधित डीएक्स का उपयोग सी # के साथ कर रहा हूं।

+0

स्तरित विंडोज़ एक विकल्प नहीं हैं? –

+0

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

उत्तर

5

मुझे एक समाधान मिला जो ओरेगनगोस्ट द्वारा प्रदान किए गए लिंक से शुरू होने पर Vista पर काम करता है। सी # वाक्यविन्यास में यह मूल प्रक्रिया है। यह कोड फॉर्म से विरासत में प्राप्त कक्षा में है। एक बेजान देख आंशिक रूप से पारदर्शी पृष्ठभूमि होगा

//this will allow you to import the necessary functions from the .dll 
using System.Runtime.InteropServices; 

//this imports the function used to extend the transparent window border. 
[DllImport("dwmapi.dll")] 
static extern void DwmExtendFrameIntoClientArea(IntPtr hWnd, ref Margins pMargins); 

//this is used to specify the boundaries of the transparent area 
internal struct Margins { 
    public int Left, Right, Top, Bottom; 
} 
private Margins marg; 

//Do this every time the form is resized. It causes the window to be made transparent. 
marg.Left = 0; 
marg.Top = 0; 
marg.Right = this.Width; 
marg.Bottom = this.Height; 
DwmExtendFrameIntoClientArea(this.Handle, ref marg); 

//This initializes the DirectX device. It needs to be done once. 
//The alpha channel in the backbuffer is critical. 
PresentParameters presentParameters = new PresentParameters(); 
presentParameters.Windowed = true; 
presentParameters.SwapEffect = SwapEffect.Discard; 
presentParameters.BackBufferFormat = Format.A8R8G8B8; 

Device device = new Device(0, DeviceType.Hardware, this.Handle, 
CreateFlags.HardwareVertexProcessing, presentParameters); 

//the OnPaint functions maked the background transparent by drawing black on it. 
//For whatever reason this results in transparency. 
protected override void OnPaint(PaintEventArgs e) { 
    Graphics g = e.Graphics; 

    // black brush for Alpha transparency 
    SolidBrush blackBrush = new SolidBrush(Color.Black); 
    g.FillRectangle(blackBrush, 0, 0, Width, Height); 
    blackBrush.Dispose(); 

    //call your DirectX rendering function here 
} 

//this is the dx rendering function. The Argb clearing function is important, 
//as it makes the directx background transparent. 
protected void dxrendering() { 
    device.Clear(ClearFlags.Target, Color.FromArgb(0, 0, 0, 0), 1.0f, 0); 

    device.BeginScene(); 
    //draw stuff here. 
    device.EndScene(); 
    device.Present(); 
} 

अन्त में, डिफ़ॉल्ट सेटिंग के साथ एक फार्म: यह एक UserControl में अगर काम करने के लिए प्रतीत नहीं होता। फॉर्मबॉर्डर स्टाइल को "none" पर सेट करें और यह केवल 100% पारदर्शी होगा जिसमें केवल आपकी सामग्री सबकुछ से ऊपर हो रही है।

2

मुझे लगता है कि डेस्कटॉप विंडो प्रबंधक का उपयोग किए बिना कठिन होगा, यानी यदि आप Windows XP का समर्थन करना चाहते हैं। डीडब्लूएम के साथ, ऐसा लगता है कि यह rather easy है।

गति कोई मुद्दा नहीं है, तो आप एक सतह के लिए प्रतिपादन और फिर एक स्तरित खिड़की को प्रदान की गई छवि को कॉपी के साथ भाग मिल सकता है। हालांकि तेज होने की उम्मीद न करें।

+0

एक दर्द जो केवल dx9 के साथ काम करता है, क्योंकि Vista में DWM dx9 है। विंडोज 7 डीएक्स 10 का उपयोग करेगा, तो यह अच्छा होगा। –

1

WPF भी एक और विकल्प है।

माइक्रोसॉफ्ट द्वारा विकसित, विंडोज प्रेजेंटेशन फाउंडेशन (या डब्ल्यूपीएफ) विंडोज-आधारित अनुप्रयोगों में उपयोगकर्ता इंटरफेस को प्रस्तुत करने के लिए एक कंप्यूटर-सॉफ्टवेयर ग्राफिकल उपप्रणाली है।

+1

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। – fglez

+0

नोटिस बीटा के दौरान लगभग 4 साल पहले इसका उत्तर कैसे दिया गया था? प्रश्न और उत्तर वापस प्रयोगात्मक थे। यह निश्चित रूप से एक शानदार जवाब नहीं है, लेकिन यह एक जवाब है और उस पर एक व्यवहार्य है। लिंक सामग्री के रूप में मान्य है। –

3

आप या तो डायरेक्ट कॉम्पोजिशन, लेयरविंडोज़, डेस्कटॉपविंडोमेनगर या डब्ल्यूपीएफ का उपयोग कर सकते हैं। सभी तरीकों अपने फायदे और नुकसान के साथ आते हैं:

-DirectComposition सबसे कारगर है, लेकिन जरूरत है Windows 8 और 60Hz तक सीमित है।

-लेयरविंडो डीएक्सजीआई का उपयोग कर डायरेक्ट 2 डी-इंटरऑप के माध्यम से डी 3 डी के साथ काम करने के लिए मुश्किल हैं।

-WPF अपेक्षाकृत D3DImage के माध्यम से उपयोग करने के लिए आसान है, लेकिन यह भी 60Hz और DX9 और कोई MSAA तक सीमित है। डीएक्सजीआई के माध्यम से उच्च डीएक्स-संस्करणों के लिए इंटरऑप संभव है, एमएसएए का उपयोग तब भी किया जा सकता है जब एमएसएए-रेन्डर्ट लक्ष्य को मूल गैरएमएसएए सतह पर हल किया जाता है।

-DesktopWindowManager विंडोज विस्टा के बाद उच्च प्रदर्शन के लिए बहुत अच्छा है, लेकिन डायरेक्टएक्स-संस्करण डीडब्लूएम का उपयोग संस्करण (अभी भी Vista पर DX9) द्वारा सीमित है। उच्च DX-Versions के लिए वर्कअराउंड DXGI के माध्यम से संभव होना चाहिए जहां

यदि आपको प्रति पिक्सेल एप्ला की आवश्यकता नहीं है, तो आप अर्ध-पारदर्शी रूप के अस्पष्टता-मूल्य का भी उपयोग कर सकते हैं। मैं सी # और शार्पडीएक्स के साथ सभी वर्णित तकनीकों का उपयोग करने में सक्षम हूं, लेकिन डायरेक्ट कॉम्पोजिशन और लेयरविंडोज़ के मामले में थोड़ा सी ++ - रैपरकोड की आवश्यकता थी। शुरुआत के लिए मैं डब्ल्यूपीएफ के माध्यम से जाने का सुझाव दूंगा।

संबंधित मुद्दे