View Full Version : سوال: ساخت حالت Glass برای فرمها
sinashahab
چهارشنبه 24 شهریور 1389, 00:02 صبح
سلام دوستان
من می خواستم بدونم چطوری فرمم رو در WPF به این شکل در بیارم :
http://programming.ramiz.ir/images/stories/Glass.png
اگه میشه بگید با MS Blender چطوری این کارو بکنم .
ممنون:تشویق::تشویق:
mahdi7s
چهارشنبه 24 شهریور 1389, 15:54 عصر
این مربوط به api ای به نام desktop windows manager هست که قابلیت Aero رو به فرم ها می ده و ربطی به ویندوز فرم یا WPF هم نداره ...
لینک زیر نحوه انجام این کار در WPF رو نشون داده:
http://msdn.microsoft.com/en-us/library/ms748975.aspx
موفق باشید
sinashahab
چهارشنبه 24 شهریور 1389, 19:16 عصر
یه چیز تو این مایه ها پیدا کردم .
http://www.codeproject.com/KB/expression/Aero_Style__No_code_.aspx
کسی می تونه اینو برای من توضیح بده .
مثلا مراحل کارشو کامل توضیح بده . با MS Blend هست.
من توی WPF خیلی مبتدی هستم .
مهدی فرزاد
پنج شنبه 25 شهریور 1389, 00:46 صبح
این مربوط به api ای به نام desktop windows manager هست که قابلیت Aero رو به فرم ها می ده و ربطی به ویندوز فرم یا WPF هم نداره ...
لینک زیر نحوه انجام این کار در WPF رو نشون داده:
http://msdn.microsoft.com/en-us/library/ms748975.aspx
موفق باشید
سلام
با WPF و به وسیله blend خیلی راحت میشه درست کرد
الان یک نمونه آماده میکنم و میگذارم
مهدی فرزاد
پنج شنبه 25 شهریور 1389, 00:51 صبح
سلام
این نمونه رو الان با Blend درست کردم ببین
خیلی سادست
شما باید یک استایل جدید برای فرم بسازید و در اون هرجایی رو که میخواید شیشه ای بشه اوپسیدی رنگ بکگراند رو کم کنید دقت کنید اوپسیدی رنگ رو باید کم کنید نه اوپسیدی کنترل و همچنین اگه استایل جدید تعریف نکنید این حالت شیشه ای روی خود فرم اصلی اعمال نمیشه پس استایل فراموش نشه
نومنه من رو با بلند باز کنید و بررسی کنید
و هرجاش رو نفهمیدید بپرسید توضیح میدم
sinashahab
پنج شنبه 25 شهریور 1389, 01:57 صبح
خیلی خوب بود.
این رو XP هم جواب میده .
sinashahab
جمعه 26 شهریور 1389, 20:20 عصر
این مربوط به api ای به نام desktop windows manager هست که قابلیت Aero رو به فرم ها می ده و ربطی به ویندوز فرم یا WPF هم نداره ...
لینک زیر نحوه انجام این کار در WPF رو نشون داده:
http://msdn.microsoft.com/en-us/library/ms748975.aspx
موفق باشید
خیلی ممنون .
حالا این روش آقا مهدی هم خوب بود ولی مثل حالت Aero خود ویندوز ویستا یا 7 نبود.
حالا برخی از این پنجره ها در قسمت شیشه ای خودشون دکمه یا هر کنترل دیگه ای دارن .
اونا این کارو چیجوری می کنن .:لبخند:
از این کار ماکروسافت خوشم میاد . حتما این قابلیت توی VS های بعدی هست ولی حالا ما که 2010 یا 2008 هستیم باید اینقدر روش کار کنیم و وقتی بهش پی می بریم خود ماکروسافت توی VS این قابلیت رو می زاره:لبخند:.(مثل BigInteger)
راستی من برخی تفکرها رو که میگن WPF از API جدا هست رو شنیدم. می خواستم بدونم چرا این تفکر به وجود اومده ؟!:متفکر: مثل برای همین حالت شیشه ای. هر چقدر هم خودتون روش کار کنید و خیلی قشنگ درست کنید ولی باید قبول کنید کارتون به اندازه ی مال MS قشنگ نمیشه.(200 نفر متخصص پشت این کار بودن!!) پس مجبوریم از API استفاده کنیم .
می خواستم بدونم من اشتبا فکرارو خوندم یا همین تفکر هست :لبخند:.
sinashahab
دوشنبه 29 شهریور 1389, 16:28 عصر
ببخشید اینقدر سوال می کنم.
میشه کدی قرار بدید که با API یا هر کامپوننت یا هر چیزه دیگه بشه کل فرم رو به حالت شیشه ای کامل در آورد ؟
اگه این بشه بقیش حله !:چشمک:
shahrdar
دوشنبه 29 شهریور 1389, 19:15 عصر
دوست عزيز خيلی سادست
اين کلاس
Imports System.Runtime.InteropServices
Imports System.Windows.Interop
Public Class AeroAccess
<DllImport("dwmapi.dll", PreserveSig:=False)> _
Private Shared Sub DwmExtendFrameIntoClientArea(ByVal hwnd As IntPtr, ByRef margins As MARGINS)
End Sub
<DllImport("dwmapi.dll", PreserveSig:=False)> _
Private Shared Function DwmIsCompositionEnabled() As Boolean
End Function
Public Shared Function ExtendGlassFrame(ByVal window As Window, ByVal margin As Thickness) As Boolean
If Not DwmIsCompositionEnabled() Then
Return False
End If
Dim hwnd As IntPtr = New WindowInteropHelper(window).Handle
If hwnd = IntPtr.Zero Then
Throw New InvalidOperationException("The Window must be shown before extending glass.")
End If
' Set the background to transparent from both the WPF and Win32 perspectives
window.Background = Brushes.Transparent
HwndSource.FromHwnd(hwnd).CompositionTarget.Backgr oundColor = Colors.Transparent
Dim margins As New MARGINS(margin)
DwmExtendFrameIntoClientArea(hwnd, margins)
Return True
End Function
End Class
Structure MARGINS
Public Sub New(ByVal t As Thickness)
Left = CInt(t.Left)
Right = CInt(t.Right)
Top = CInt(t.Top)
Bottom = CInt(t.Bottom)
End Sub
Public Left As Integer
Public Right As Integer
Public Top As Integer
Public Bottom As Integer
End Structure
Public Enum DWMWINDOWATTRIBUTE
DWMWA_NCRENDERING_ENABLED = 1
' [get] Is non-client rendering enabled/disabled
DWMWA_NCRENDERING_POLICY
' [set] Non-client rendering policy
DWMWA_TRANSITIONS_FORCEDISABLED
' [set] Potentially enable/forcibly disable transitions
DWMWA_ALLOW_NCPAINT
' [set] Allow contents rendered in the non-client area to be visible on the DWM-drawn frame.
DWMWA_CAPTION_BUTTON_BOUNDS
' [get] Bounds of the caption ***on area in window-relative space.
DWMWA_NONCLIENT_RTL_LAYOUT
' [set] Is non-client content RTL mirrored
DWMWA_FORCE_ICONIC_REPRESENTATION
' [set] Force this window to display iconic thumbnails.
DWMWA_FLIP3D_POLICY
' [set] Designates how Flip3D will treat the window.
DWMWA_EXTENDED_FRAME_BOUNDS
' [get] Gets the extended frame bounds rectangle in screen space
DWMWA_LAST
End Enum
' Non-client rendering policy attribute values
Public Enum DWMNCRENDERINGPOLICY
DWMNCRP_USEWINDOWSTYLE
' Enable/disable non-client rendering based on window style
DWMNCRP_DISABLED
' Disabled non-client rendering; window style is ignored
DWMNCRP_ENABLED
' Enabled non-client rendering; window style is ignored
DWMNCRP_LAST
End Enum
Public Class GlassHelper
Public Const DWMWA_NCRENDERING_ENABLED As UInteger = 1
' [get] Is non-client rendering enabled/disabled
Public Const DWMWA_NCRENDERING_POLICY As UInteger = 2
' [set] Non-client rendering policy
Public Const DWMWA_TRANSITIONS_FORCEDISABLED As UInteger = 3
' [set] Potentially enable/forcibly disable transitions
Public Const DWMWA_ALLOW_NCPAINT As UInteger = 4
' [set] Allow contents rendered in the non-client area to be visible on the DWM-drawn frame.
Public Const DWMWA_CAPTION_BUTTON_BOUNDS As UInteger = 5
' [get] Bounds of the caption button area in window-relative space.
Public Const DWMWA_NONCLIENT_RTL_LAYOUT As UInteger = 6
' [set] Is non-client content RTL mirrored
Public Const DWMWA_FORCE_ICONIC_REPRESENTATION As UInteger = 7
' [set] Force this window to display iconic thumbnails.
Public Const DWMWA_FLIP3D_POLICY As UInteger = 8
' [set] Designates how Flip3D will treat the window.
Public Const DWMWA_EXTENDED_FRAME_BOUNDS As UInteger = 9
' [get] Gets the extended frame bounds rectangle in screen space
Public Const DWMWA_LAST As UInteger = 10
<DllImport("dwmapi.dll", PreserveSig:=False)> _
Private Shared Sub DwmExtendFrameIntoClientArea(ByVal hwnd As IntPtr, ByRef margins As MARGINS)
End Sub
<DllImport("dwmapi.dll", PreserveSig:=False)> _
Private Shared Sub DwmSetWindowAttribute(ByVal hwnd As IntPtr, ByVal dwAttribute As UInteger, ByVal pvAttribute As IntPtr, ByVal cbAttribute As IntPtr)
End Sub
<DllImport("dwmapi.dll", PreserveSig:=False)> _
Private Shared Function DwmIsCompositionEnabled() As Boolean
End Function
Private Structure MARGINS
Public Sub New(ByVal t As Thickness)
Left = CInt(t.Left)
Right = CInt(t.Right)
Top = CInt(t.Top)
Bottom = CInt(t.Bottom)
End Sub
Public Left As Integer
Public Right As Integer
Public Top As Integer
Public Bottom As Integer
End Structure
Public Shared Function ExtendGlassFrame(ByVal window As Window, ByVal margin As Thickness) As Boolean
If Not DwmIsCompositionEnabled() Then
Return False
End If
Dim hwnd As IntPtr = New WindowInteropHelper(window).Handle
If hwnd = IntPtr.Zero Then
Throw New InvalidOperationException("The Window must be shown before extending glass.")
End If
' Set the background to transparent from both the WPF and Win32 perspectives
window.Background = Brushes.Transparent
HwndSource.FromHwnd(hwnd).CompositionTarget.Backgr oundColor = Colors.Transparent
Dim margins As New MARGINS(margin)
DwmExtendFrameIntoClientArea(hwnd, margins)
'DWMNCRENDERINGPOLICY ncrp = DWMNCRENDERINGPOLICY.DWMNCRP_DISABLED;
'hwnd = new WindowInteropHelper(window).Handle;
'DwmSetWindowAttribute(hwnd, DWMWA_NCRENDERING_POLICY, (IntPtr)ncrp, (IntPtr)sizeof(int));
Return True
End Function
End Class
اينم کپی کن تو کلاس پنجره
Protected Overloads Overrides Sub OnSourceInitialized(ByVal e As EventArgs)
MyBase.OnSourceInitialized(e)
AeroAccess.ExtendGlassFrame(Me, New Thickness(-1))
End Sub
100% کار ميکنه
sinashahab
دوشنبه 29 شهریور 1389, 20:13 عصر
خیلی ممنون.
من دو تا سوال دارم ولی به این ربطیی زیاد نداره :
1.OnSourceInitialized از کجا اومد ؟
2.enum یعنی چی ؟
خیلی ممنون بابت این :چشمک:
sinashahab
دوشنبه 29 شهریور 1389, 21:39 عصر
دیدن اینم خالی از لطف نیست.
http://programming.ramiz.ir/index.php?option=com_content&view=article&id=99:1389-06-29-17-32-00&catid=47:-c&Itemid=57
خیلی ممنن از دوستانی که منو در ساخت این نمونه کمک کردن.:چشمک:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.