无标题窗体的移动及其简单美化
????? 先看效果圖吧。
????? 最近做Web,發(fā)現(xiàn)網(wǎng)頁三劍客總是會(huì)留下一些“最近打開項(xiàng)目”這樣的痕跡在軟件的界面上,心里總是覺得很不舒服,于是萌發(fā)了寫一個(gè)清除器的念頭。說動(dòng)手就動(dòng)手吧!
???? DW、FW、Fl 的這些痕跡都是存在于注冊表中的,簡單原理就是刪除注冊表里的值就ok了,這些應(yīng)該沒有什么好說的,所以我就不說了。今天我們主要來講一下無標(biāo)題欄的窗體拖動(dòng)問題和使用圖片來簡單的美化界面的問題。
????? 可能有很多人都認(rèn)為無標(biāo)題欄窗體的移動(dòng)是非常簡單的,網(wǎng)上很多的朋友也給出了一些方法,大多說人給出的方法是在窗體的privite部分創(chuàng)建一個(gè)私有過程 procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;就像這樣的過程,這個(gè)原理就是發(fā)送消息給系統(tǒng),欺騙鼠標(biāo)點(diǎn)擊的地方(也就是窗體的客戶區(qū))是窗體的標(biāo)題欄,然而經(jīng)過我的測試如果窗體上有其他的控件,比如一個(gè)TButton,那么TButton的事件是不會(huì)被觸發(fā)的,不論采用哪種方式都是難以觸發(fā)的,最少我的測試如此。所以此思路不可以。還有的人給出了使用MouseMove等一系列事件來進(jìn)行窗體的Top和Left進(jìn)行運(yùn)算的。
???? 上面第一種該方法不適合,人比較懶不想打太多的代碼,所以第二種方法也就不適合了。
???? 好了,不說廢話了,我們一步一步來吧:
???? 1。首先建一個(gè)窗體,將BorderStyle屬性設(shè)置為bsSingle
?????2。放一個(gè)TImage,載入一張圖片,如下圖
3。用PS打開TImage中載入的圖片,來獲取顏色
3。然后雙擊Form1下的Color屬性值,在彈出的顏色對(duì)話框中點(diǎn)擊“規(guī)定自定義顏色”,然后在紅、綠、藍(lán)后面的方框里填寫上PS的拾色器里面的R、G、B后面對(duì)應(yīng)的數(shù)值,如下圖:
4。點(diǎn)擊“添加到自定義顏色”,再在“自定義顏色”的方框上點(diǎn)擊自己定義好的顏色,這時(shí)自定義的顏色會(huì)出現(xiàn)了一個(gè)一個(gè)黑色的邊框,然后確定。這樣,窗體的簡單美化就完成了。
5。選擇TImage組件,選擇Events選項(xiàng)卡,選擇OnMouseDown事件,為其添加代碼如下:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0);
end;
???? 這里我解釋一下:
?????ReleaseCapture 釋放鼠標(biāo)的捕獲狀態(tài)
?????Perform(WM_NCLBUTTONDOWN, HTCAPTION, 0); 發(fā)送鼠標(biāo)左鍵獲取到的狀態(tài)為窗體的標(biāo)題欄的系統(tǒng)消息,其達(dá)到欺騙操作系統(tǒng)所點(diǎn)擊的地方是窗體的標(biāo)題欄。
????? 這樣一個(gè)既可以拖動(dòng)又可以響應(yīng)其他組件的無標(biāo)題欄窗體就完成了。
????? 如果你還有耐心的話,也可以繼續(xù)為窗體添加一些特效,比如窗體時(shí)圓角的、像MSN那樣慢慢滾動(dòng)上來的消息框一樣讓你的窗體滾動(dòng)上來,這里我就不截圖了,直接給出代碼:
procedure TForm1.FormCreate(Sender: TObject);var
Hnd: THandle;
begin
Hnd := CreateRoundRectRGN(0, 0, Width, Height, 15, 15);
SetWindowRGN(Handle, Hnd, True);
AnimateWindow(Handle, 1000, AW_SLIDE + AW_VER_NEGATIVE);
end;
【說明】1。先定義一個(gè)句柄變量Hnd;2。使用Win API函數(shù)CreateRoundRectRGN創(chuàng)建圓角矩形區(qū)域;3。使用API函數(shù)SetWindowRGN設(shè)置窗體為圓角的;4。AnimateWindow這個(gè)函數(shù)用來設(shè)置窗體的出場方式(這里的表述可能不太精確,還請(qǐng)見諒)這個(gè)函數(shù)有很多參數(shù)的,具體自己查吧。
?????最后我們再來編寫程序的關(guān)閉時(shí)的漸隱效果,還是使用AnimateWindow函數(shù)來實(shí)現(xiàn)的,不過這個(gè)函數(shù)只是讓窗體隱藏了,并沒有真正的關(guān)閉,所以你還得使用一句關(guān)閉代碼來關(guān)閉窗體,好了不費(fèi)話了,直接給代碼了:
AnimateWindow(Handle, 2000, AW_SLIDE + AW_BLEND + AW_HIDE);Application.Terminate;
???? 到此這篇文章就結(jié)束了,對(duì)于了解Win API 函數(shù)的高手來說很簡單了,請(qǐng)不要見笑,謝謝!
?
轉(zhuǎn)載于:https://www.cnblogs.com/spider518/archive/2011/11/22/2258576.html
總結(jié)
以上是生活随笔為你收集整理的无标题窗体的移动及其简单美化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 友元实例:友元类及友元函数
- 下一篇: centos 支持 ntfs格式