2010-12-12 24 views
6

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

उत्तर

12

जैसा कि आपने कहा है, 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 क्षेत्र है। इसलिए, जब आप धुंध प्रभाव को उप-क्षेत्र में लागू करते हैं तो सावधान रहें।

जहां तक ​​मेरा संबंध है, यह इस प्रभाव को फॉर्म की खिड़की के अपेक्षाकृत बेकार के केवल उप-वर्ग में लागू करता है। ऐसा लगता है कि मुझे ऐसा लगता है कि यह एकमात्र ऐसा समय हो सकता है यदि आप एक मनमाना गैर-आयताकार आकार को ग्लासी के रूप में प्रस्तुत करना चाहते हैं, शेष शेष पारदर्शी शेष है।

+0

+1, लेकिन जब तक आप उसे क्षेत्र का उपयोग कैसे करें, तब तक अनुपयोगी नहीं है। –

+0

@ हंस: मैंने क्षेत्रों का एक उदाहरण जोड़ा, हालांकि जैसा कि मैंने इंगित किया है, कम से कम WinForms में, इसकी उपयोगिता बहुत सीमित है। –

+0

समय लेने और इस तरह के एक संक्षिप्त स्पष्टीकरण देने के लिए धन्यवाद, जैसा कि आपने सुझाव दिया था, यह काम करता था। एमएसडीएन के अलावा, मैं इस एपीआई के अन्य तरीकों के बारे में विवरण कहां प्राप्त कर सकता हूं ?? – Kushal

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

  • कोई संबंधित समस्या नहीं^_^