国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

組件制作之五(托盤組件)

2019-11-18 18:17:28
字體:
來源:轉載
供稿:網友
這將是最后一個組件了,目標定為非可視化,事實上非可視化組件要比可視化組件難做,因為是從TComponent繼承而來,就沒有了很多屬性和事件。而這些都要我們從頭來做過。

這個非可視化組件,我決定為托盤組件,其中用到的技術較多,我不如列一個表出來,然后再來講解好一點。另外,可能篇幅會多一些,請耐心看。

用到的技術:

1作為核心功能,當然是托盤的應用啦。

2?托盤組件怎么樣影響到主窗口最小化時隱藏

3?托盤如何處理消息

4?組件編輯器的用法

上面每一個技術都非常有趣,讓我們一個個來看吧:

?

一??托盤,是系統殼編程的一個功能,相信我們也看過很多啦,大概知道它用起來是什么樣子的。

那么它是如何實現的呢,

Windows定義了這樣一個結構來存放托盤的信息:

typedef?struct?_NOTIFYICONDATA?{?//?nid??

DWord?cbSize;

????HWND?hWnd;?

????UINT?uID;?

????UINT?uFlags;?

????UINT?uCallbackMessage;?

????HICON?hIcon;?

????char?szTip[64];?

}?NOTIFYICONDATA,?*PNOTIFYICONDATA;

cbSize是NOTIFYICONDATA結構的尺寸,我們一般用Sizeof就可以了

hWnd一個窗口句柄,用于檢索托盤消息的。然而我們的非可視組件并沒有窗口呀,這就是技術列表第三條要講的,這里從略

uID?唯?一標識托盤圖標的,我們可以隨便指定一個數,但如果同時有不同的圖標,則數應該不同

uFlags是NIF_ICON,NIF_MESSAGE,NIF_TIP中的一個或多個,我們全用就可以了。

uCallbackMessage;托盤消息,是我們自定義的消息,這里我們定義為:

????????????????const

??????????????????WM_TrayMsg=WM_USER+10;

hIcon托盤圖標句柄

szTip這個是托盤提示,當托盤出現時,鼠標移到哪里,就會出現該提示。

Delphi將這個結構重定義為TNotifyIconData,我們照這個來用就行了

?

我們應用托盤要用到API函數Shell_NotifyIcon,其中有兩個參數,第一個為

NIM_ADD,NIM_DELETE??,NIM_MODIFY中的一個,分別表示添加托盤(圖標出現)

修改托盤(比如圖標,提示),刪除(圖標消失)第二個參數是NOTIFYICONDATA的指針

嗯,托盤應該差不多了。

?

二?這個組件能夠決定主窗體最小化時,是否是正常最小化并沒有托盤圖標。還是最小化到屏幕之外,使我們看不見,且托盤區出現了圖標。這里有一個成員為FActive來決定。

那么我們是怎么樣影響到主窗體呢,也即怎么截獲窗體的最小化消息呢。

全局變量application有一個方法為PRocedure?HookMainWindow(Hook:?TWindowHook);

顧名思義,就是鉤到主窗口的所有消息。里面的參數是TWindowHook類型,它是一個方法指針,定義如下:

type?TWindowHook?=?function(var?Message:?TMessage):?Boolean?of?object;

我們要自己定義過程的,然后傳給HookMainWindow:

function?AppMsgHook(var?Msg:TMessage):Boolean;

Application.HookMainWindow(AppMsgHook);

這樣做之后,主窗口的所有消息都會經過AppMsgHook方法啦,最小化消息也不例外,則我們可以在里面截獲這個消息,并做一些操作:

?

做什么操作呢,先判斷組件是否為設計時,如果是,不進行操作,如果不是進行下一步

if?not?(csDesigning?in?ComponentState)?then

這樣的意圖是很明顯的,因為當設計時的主窗其實是Delphi的IDE,如果讓他處理該消息,其實是處理IDE的最小化消息,這時如果你最小化IDE,就會出現托盤啦。所以不能。

?

下一步是是否截獲了最小化消息,以及FActive是否為真:

if?(Msg.Msg=WM_SYSCOMMAND)?and(FActive)?then

兩樣都成立,執行里面的代碼,代碼中有解釋,這里只說兩個:

SetWindowLong(Application.Handle,GWL_EXSTYLE?,WS_EX_TOOLWINDOW);

設置了這個屬性后,窗口最小化就不會停在任務欄了,而是停在屏幕的某個位置,這個位置在哪里呢,由

placement.flags:=WPF_SETMINPOSITION;

?????placement.ptMinPosition.x:=1050;

?????placement.ptMinPosition.y:=800;

?????SetWindowPlacement(Application.Handle,@placement);

決定,具體的看代碼,自己查幫助吧,這里不多說

?

而上說的設置SetWindowLong后,問題來了,窗口最小化的風格一變了,當你把Factive設為False,再最小化窗口,此時是沒有托盤圖標,但窗口還是最小化到屏幕的那個位置去了,我們看不到,又不能使其恢復(沒有托盤)。怎么辦呢,

原來還有一個GetWindowLong函數會返回當前風格的值,我們可以在控件的構造函數中這樣調用

OldStyleEX:=GetWindowLong(Application.Handle,GWL_EXSTYLE);

這時,OldStyleEX:就保存了窗口原來最小化的風格了,窗口最小化,調用SetWindowLong,設置了新的最小風格。而當我們觸發托盤事件,使窗體恢復大小時,我們在處理函數中調用

SetWindowLong(Application.Handle,GWL_EXSTYLE?,OldStyleEX);

這樣,窗口又回到了原來的風格,這時我們設Factive為False,則窗口就能正常最小化了。

?

到控件被釋放時,我們一定要調用Application.UnhookMainWindow(AppMsgHook);來解除鉤子

?

其實這里也有一個不完善的地方,應該再設一個成員變量,確定設置托盤時,窗口是正常最小化,還是最小化到看不見。而我沒有這么做,直接如果FActive為True,最小化會出現托盤圖標,并且窗口最小化到看不見。不過影響不大,有興趣的朋友看了之后可以幫我完善一下,也當做自己的練習嗎。

?

三?托盤如果處理消息,上面說到,要設置托盤結構,一定要有一個窗口句柄,才能檢索托盤消息,那么這個句柄是什么呢,非可視組件沒有窗口句柄呀。

?

如果你有看過TTimer的
Samples改為Wind。然后保存

接著,在IDE中點File-》New-》Other…

彈出來的New?Items對話框,選中New頁面,并選中其中的Package,

這里彈出一個新建的包編輯器。

先在IDE中點File-》Save。將包編輯器保存。保存在組件的單元所在的文件夾中

我的所有組件單元都放在Delphi7/MyCom文件夾中。因此這個包當然也保存在這里。

?

然后,點包編輯器上邊的Add,將所有的組件單元加進去,當然也保括上面說的組件編輯器單元啦。

加進去后,點包編輯器上邊的Compile,編譯完畢,再點Insall。

成功,看看面板。所有以前做過的組件全在Wind面板中了。

而這時候,我的任務也完畢了。

?

?

結語

?

這次的組件之旅終于走完了,也許有人會笑我淺薄,認為這么簡單的東西,有必要拿出來么。也許是比較簡單吧,但一定有人會需要的,相信我的文章會給他們幫助的。因為這些是我曾經學到的知道,遇到的問題并解決它。所以我個人覺得是很珍貴的。并且經過寫這幾篇,我把這些知識記得更牢了。這種利己利人的事,何樂而不為呀。

在此,謝謝大家的閱讀,也許下次還有機會再見面,不過現在要說再見了。祝你們愉快。

上一篇:自定義DataSet,并寫入數據

下一篇:組件制作之四(定制外觀)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 剑阁县| 康保县| 开封市| 洛阳市| 乌兰浩特市| 河曲县| 友谊县| 淅川县| 溆浦县| 丰镇市| 利津县| 巨鹿县| 东台市| 搜索| 民乐县| 龙里县| 孟津县| 沭阳县| 迁西县| 广水市| 方山县| 大渡口区| 孝感市| 泸西县| 吴桥县| 分宜县| 泌阳县| 林周县| 革吉县| 绿春县| 衡南县| 海林市| 阿鲁科尔沁旗| 镇康县| 普宁市| 五寨县| 平山县| 乡宁县| 黔西县| 平武县| 蒲江县|