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