मैं डीडब्लूएम एपीआई के साथ वीबी.NET 2010 ऐप में अपने रूपों में एरो ग्लास देखने की कोशिश कर रहा हूं, लेकिन जैसा कि फ़ंक्शन कॉल बताता है, यह क्लाइंट क्षेत्र में फ़्रेम को देखता है, और यदि फॉर्म की कोई सीमा नहीं है, तो कुछ भी नहीं होगा और फॉर्म अदृश्य हो जाएगा। तो, क्या मुझे एरो कांच किसी भी रूप में बिना किसी सीमा के मिल सकता है .... ??मैं बिना सीमा के विंडोज फॉर्म पर एयरो ग्लास कैसे प्राप्त कर सकता हूं?
उत्तर
जैसा कि आपने कहा है, DwmExtendFrameIntoClientArea
सचमुच खिड़की के फ्रेम के पारदर्शी ग्लास प्रभाव को अपने ग्राहक क्षेत्र में फैलाता है, जिसका अर्थ है कि यदि आपके फॉर्म का FormBorderStyle
"कोई नहीं" पर सेट है, तो आपकी विंडो प्रभावी रूप से अदृश्य हो जाएगी।
इसके बजाय, आपको DwmEnableBlurBehindWindow
API का उपयोग करने की आवश्यकता है, जो बिना किसी फ्रेम/सीमा के विंडो के ग्लास ब्लर प्रभाव को सक्षम करता है। इसमें दो पैरामीटर लगते हैं। पहला (hWnd
) उस फ़ॉर्म के हैंडल है जिसे आप प्रभाव के पीछे धुंध लागू करना चाहते हैं। दूसरा (pBlurBehind
) संदर्भ द्वारा पारित एक संरचना है जिसमें प्रभाव के लिए डेटा या पैरामीटर शामिल हैं।
इसलिए, आपको DWM_BLURBEHIND
structure को परिभाषित करना होगा, जिसमें स्वयं चार सदस्य शामिल हैं। पहला (dwFlags
) constant values का थोड़ा सा संयोजन है जो इंगित करता है कि इस संरचना के कौन से सदस्य सेट किए गए हैं। दूसरा (fEnable
) इंगित करता है कि क्या आप धुंध प्रभाव को सक्षम या अक्षम करना चाहते हैं। तीसरा (hRgnBlur
) आपको क्लाइंट क्षेत्र के भीतर एक विशेष क्षेत्र निर्दिष्ट करने की अनुमति देता है जिससे धुंध प्रभाव लागू किया जाएगा; इसे Nothing
पर सेट करने से संकेत मिलता है कि पूरे ग्राहक क्षेत्र में धुंध प्रभाव होगा। चौथा (fTransitionOnMaximized
) आपको यह निर्दिष्ट करने की अनुमति देता है कि अधिकतम रंग मिलान करने के लिए फ़ॉर्म का रंगीकरण संक्रमण होना चाहिए या नहीं।
<StructLayout(LayoutKind.Sequential)> _
Private Structure DWM_BLURBEHIND
Public dwFlags As Integer
Public fEnable As Boolean
Public hRgnBlur As IntPtr
Public fTransitionOnMaximized As Boolean
End Structure
Private Const DWM_BB_ENABLE As Integer = &H1
Private Const DWM_BB_BLURREGION As Integer = &H2
Private Const DWM_BB_TRANSITIONONMAXIMIZED As Integer = &H4
<DllImport("dwmapi.dll", PreserveSig:=False)> _
Private Shared Sub DwmEnableBlurBehindWindow(ByVal hWnd As IntPtr, ByRef pBlurBehind As DWM_BLURBEHIND)
End Sub
और फिर यहाँ कैसे आप एक विशेष फार्म पर इस समारोह कहेंगे का एक सरल उदाहरण है:
यहाँ आप इस सुविधा का उपयोग करने के लिए अपने कोड में शामिल करने की आवश्यकता है कि अंतिम एपीआई घोषणाओं हैं:
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
''#Set the form's border style to None
Me.FormBorderStyle = FormBorderStyle.None
''#Whatever region that you fill with black will become the glassy region
''# (in this example, the entire form becomes transparent)
Me.BackColor = Color.Black
''#Create and populate the blur-behind structure
Dim bb As DWM_BLURBEHIND
bb.dwFlags = DWM_BB_ENABLE
bb.fEnable = True
bb.hRgnBlur = Nothing
''#Enable the blur-behind effect
DwmEnableBlurBehindWindow(Me.Handle, bb)
End Sub
अगर इसके बजाय, आप केवल प्रपत्र की एक विशेष उपक्षेत्र के प्रभाव के पीछे कलंक लागू करना चाहते हैं, तो आप hRgnBlur
सदस्य के लिए एक वैध क्षेत्र की आपूर्ति करने की आवश्यकता होगी, औरको DWM_BB_BLURREGION
फ्लैग जोड़नेसदस्य।
आप उस क्षेत्र को संभालने के लिए Region.GetHrgn
method का उपयोग कर सकते हैं, जिसे आप hRgnBlur
सदस्य के रूप में निर्दिष्ट करना चाहते हैं। उदाहरण के लिए, ऊपर कोड के बजाय, आप उपयोग कर सकते हैं निम्नलिखित:
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
''#Set the form's border style to None
Me.FormBorderStyle = FormBorderStyle.None
''#Fill the entire form with black to make it appear transparent
Me.BackColor = Color.Black
''#Create a region corresponding to the area of the form you want to render as glass
Using g As Graphics = Me.CreateGraphics
Dim glassRect As New Rectangle(0, 0, 100, 150)
Using rgn As New Region(glassRect)
''#Create and populate the blur-behind structure
Dim bb As DWM_BLURBEHIND
bb.dwFlags = DWM_BB_ENABLE Or DWM_BB_BLURREGION
bb.fEnable = True
bb.hRgnBlur = rgn.GetHrgn(g)
''#Enable blur-behind effect
DwmEnableBlurBehindWindow(Me.Handle, bb)
End Using
End Using
End Sub
सूचना कैसे, तब भी जब एक विशेष उपक्षेत्र को निर्दिष्ट कलंक-पीछे प्रभाव लागू करने, मैं अभी भी पूरा फ़ॉर्म की पृष्ठभूमि का रंग काला करने के लिए सेट करने के लिए ? यह उस क्षेत्र का कारण बनता है जिसे हमने एक गिलास धुंध-पीछे प्रभाव के साथ प्रस्तुत करने के लिए निर्दिष्ट किया है, और शेष रूप पारदर्शी दिखाई देने के लिए। बेशक, आप शेष फॉर्म के पृष्ठभूमि रंग को अपने इच्छित रंग में सेट कर सकते हैं (हालांकि आयत को भरना सुनिश्चित करें जिसे आप रंगीन काले रंग के साथ ग्लास के रूप में दिखाना चाहते हैं), लेकिन यह आंशिक रूप से पारदर्शी के रूप में दिखाई देगा , बस ग्लास धुंध के पीछे प्रभाव के बिना। MSDN बताता है कि क्यों यह मामला है:
जब आप nonblurred क्षेत्र के लिए कलंक-पीछे खिड़की से एक उपक्षेत्र के प्रभाव , विंडो के अल्फ़ा चैनल प्रयोग किया जाता है लागू होते हैं।यह में एक अनपेक्षित पारदर्शिता का कारण बन सकता है जो खिड़की के nonblurred क्षेत्र है। इसलिए, जब आप धुंध प्रभाव को उप-क्षेत्र में लागू करते हैं तो सावधान रहें।
जहां तक मेरा संबंध है, यह इस प्रभाव को फॉर्म की खिड़की के अपेक्षाकृत बेकार के केवल उप-वर्ग में लागू करता है। ऐसा लगता है कि मुझे ऐसा लगता है कि यह एकमात्र ऐसा समय हो सकता है यदि आप एक मनमाना गैर-आयताकार आकार को ग्लासी के रूप में प्रस्तुत करना चाहते हैं, शेष शेष पारदर्शी शेष है।
+1, लेकिन जब तक आप उसे क्षेत्र का उपयोग कैसे करें, तब तक अनुपयोगी नहीं है। –
@ हंस: मैंने क्षेत्रों का एक उदाहरण जोड़ा, हालांकि जैसा कि मैंने इंगित किया है, कम से कम WinForms में, इसकी उपयोगिता बहुत सीमित है। –
समय लेने और इस तरह के एक संक्षिप्त स्पष्टीकरण देने के लिए धन्यवाद, जैसा कि आपने सुझाव दिया था, यह काम करता था। एमएसडीएन के अलावा, मैं इस एपीआई के अन्य तरीकों के बारे में विवरण कहां प्राप्त कर सकता हूं ?? – Kushal