資源描述:
《C#中窗體Form的美化窗體圓角的處理》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、C#中窗體Form的美化VS足夠強(qiáng)大,強(qiáng)大到只需動(dòng)動(dòng)鼠標(biāo)就可以寫出個(gè)基本的界面出來,但是其自帶的控件都是千篇一律的樣式,對(duì)于追求完美的我而言,實(shí)在是忍不下去了,只好自己親自動(dòng)手對(duì)其進(jìn)行改造----繼承已有的控件,再對(duì)其相關(guān)的消息或事件進(jìn)行處理。窗體Form作為界面的主體部分,必先對(duì)其進(jìn)行美化,在窗體自繪的過程中,需要使用到GDI+,如若對(duì)GDI+不是很了解的同學(xué)可移步我的CSDN博客或者搜索下相關(guān)的介紹。這篇文章將要介紹到的內(nèi)容:·窗體圓角的處理·無(wú)邊框窗體大小的改變與移動(dòng)·窗體邊框的繪制與邊框陰影的實(shí)現(xiàn)·系統(tǒng)按鈕的繪制與事件處理·窗體標(biāo)題欄的繪制·解決窗體閃爍的問題實(shí)現(xiàn)效果演示
2、:代碼下載一:窗體圓角的處理對(duì)于無(wú)邊框窗體圓角矩形的處理,我這里采用的是使用API函數(shù)CreateRoundRectRgn,相比于自己用GDI+寫的處理圓角的函數(shù),效果要稍微好點(diǎn),至少線條在圓角處過渡的比較平滑,為了便于復(fù)用,我把其封裝到窗體自繪輔助類RenderHlper的SetFormRoundRectRgn函數(shù)中:ViewCode//////設(shè)置窗體的圓角矩形//////需要設(shè)置的窗體///圓角矩形的半徑publicstat
3、icvoidSetFormRoundRectRgn(Formform,intrgnRadius){inthRgn=0;hRgn=Win32.CreateRoundRectRgn(0,0,form.Width+1,form.Height+1,rgnRadius,rgnRadius);Win32.SetWindowRgn(form.Handle,hRgn,true);Win32.DeleteObject(hRgn);}此處需要把所需要的API函數(shù)引用到類Win32中,引用的時(shí)候注意添加System.Runtime.InteropServices命名空間:ViewCode[DllImp
4、ort("gdi32.dll")]publicstaticexternintCreateRoundRectRgn(intx1,inty1,intx2,inty2,intx3,inty3);[DllImport("user32.dll")]publicstaticexternintSetWindowRgn(IntPtrhwnd,inthRgn,BooleanbRedraw);[DllImport("gdi32.dll",EntryPoint="DeleteObject",CharSet=CharSet.Ansi)]publicstaticexternintDeleteObject(
5、inthObject);重寫窗體的OnSizeChanged事件,并在此事件中調(diào)用SetFormRoundRectRgn,此處的Radius參數(shù)為定義的窗體圓角半徑屬性:ViewCodeprotectedoverridevoidOnSizeChanged(EventArgse){base.OnSizeChanged(e);RenderHelper.SetFormRoundRectRgn(this,Radius);}二:無(wú)邊框窗體大小的改變與移動(dòng)當(dāng)把窗體的FormBorderStyle屬性調(diào)整為FormBorderStyle.None時(shí),此時(shí),窗體的大小改變不了,同時(shí)窗體不能移動(dòng)。
6、要想實(shí)現(xiàn)無(wú)邊框窗體大小的改變與移動(dòng),可采用如下方法:(1)重寫窗體的過程WndProc:主要是對(duì)WM_NCHITTEST消息進(jìn)行處理,根據(jù)事件的發(fā)生位置來進(jìn)行不同方向箭頭的調(diào)整,窗體大小改變與移動(dòng)的函數(shù):ViewCode//調(diào)整窗體大小privatevoidWmNcHitTest(refMessagem){intwparam=m.LParam.ToInt32();PointmouseLocation=newPoint(RenderHelper.LOWORD(wparam),RenderHelper.HIWORD(wparam));mouseLocation=PointToClie
7、nt(mouseLocation);if(WindowState!=FormWindowState.Maximized){if(CanResize==true){if(mouseLocation.X<5&&mouseLocation.Y<5){m.Result=newIntPtr(Win32.HTTOPLEFT);return;}if(mouseLocation.X>Width-5&&mouseLocation.Y<5){m.Result=newIntPtr(Win32.HTTO