資源描述:
《winform窗體界面設計技巧-不規(guī)則、可改變大小、邊框半透明效果》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、網(wǎng)上也看過很多做.NET窗體的例子,我只是把網(wǎng)上的這些東西綜合了一下,主要有下面這些特點:1、邊框是半透明的,透明度可根據(jù)需要自己更改;2、可以改變窗體的大小,改變后樣式不變;3、窗體的邊框是不規(guī)則的;4、重點解決了窗體會出現(xiàn)閃爍的問題,在窗體移動的時候也不會閃爍;5、使用方便,只要將AlphaFormPanel拖動到一般的窗體上就可以實現(xiàn)換膚;?設計思路說明:一、.NET下處理一個窗體部分透明我所知道的有兩種方法:?????1、用一張支持Alhpa通道的圖片來處理半透明,這種方式處理出來的效果會很好,甚至可
2、以用一張動態(tài)的圖片來做背景。相信有人看過那個游動的魚的程序,魚的邊緣是半透明的,就是用這種方式做的。這種方式整個窗體都是通過UpdateLayeredWindow畫出來的,如果要在上面加控件的話,所有的控件都要自己來繪制,顯然在具體的項目中用這種方式的話會大大增加開發(fā)的難度。有興趣的人可以看看這個程序:??/Files/liutao409/游動的魚.rar關鍵的代碼就是根據(jù)這種支持Alhpa通道的圖片來繪制窗體[DllImport("user32.dll",ExactSpelling=true,SetLast
3、Error=true)]publicstaticexternintUpdateLayeredWindow(IntPtrhwnd,IntPtrhdcDst,refPointpptDst,refSizepsize,IntPtrhdcSrc,refPointpptSrc,Int32crKey,ref?BLENDFUNCTIONpblend,Int32dwFlags);publicvoidSetBits(Bitmapbitmap){???if(!haveHandle)return;if(!Bitmap.IsCanon
4、icalPixelFormat(bitmap.PixelFormat)
5、!Bitmap.IsAlphaPixelFormat(bitmap.PixelFormat))thrownewApplicationException("圖片必須是32位帶Alhpa通道的圖片。");??????????IntPtroldBits=IntPtr.Zero;??????????IntPtrscreenDC=Win32.GetDC(IntPtr.Zero);??????????IntPtrhBitmap=IntPtr.Zero
6、;??????????IntPtrmemDc=Win32.CreateCompatibleDC(screenDC);??????try?????????{????????????Win32.PointtopLoc=newWin32.Point(Left,Top);????????????Win32.SizebitMapSize=newWin32.Size(bitmap.Width,bitmap.Height);????????????Win32.BLENDFUNCTIONblendFunc=newWin32.
7、BLENDFUNCTION();???????????Win32.PointsrcLoc=newWin32.Point(0,0);?????????????hBitmap=bitmap.GetHbitmap(Color.FromArgb(0));?????????????oldBits=Win32.SelectObject(memDc,hBitmap);?????????????blendFunc.BlendOp=Win32.AC_SRC_OVER;?????????????blendFunc.SourceC
8、onstantAlpha=255;?????????????blendFunc.AlphaFormat=Win32.AC_SRC_ALPHA;?????????????blendFunc.BlendFlags=0;?????????????Win32.UpdateLayeredWindow(Handle,screenDC,reftopLoc,refbitMapSize,memDc,refsrcLoc,0,refblendFunc,Win32.ULW_ALPHA);???????????}???????fina
9、lly???????????{???????????????if(hBitmap!=IntPtr.Zero)???????????????{???????????????????Win32.SelectObject(memDc,oldBits);???????????????????Win32.DeleteObject(hBitmap);???????????????}???????????????