亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

怎樣建立簡單的任務欄應用程序

2019-11-17 05:11:35
字體:
來源:轉載
供稿:網友

   Windows 95 和 Windows NT 4.0包含一個令人興奮的特性:任務欄。這個通常位于區域任務條右面的區域能包含小的圖標,這些圖標能引出大的應用程序或者菜單。本篇文章主要討論如何使用Delphi建立這樣的應用程序。

  在開始之前,請看下面的需要的接口方面的內容:

  從技術方面來說,一個任務欄應用程序非常象普通的應用程序,它有一個消息循環,相應Windows的消息來完成相應的功能。

PRocedure RunTrayapplication;
Var Msg : TMsg;
Begin
CreateWindow;
AddTrayIcon;
While GetMessage(Msg,0,0,0) do Begin
TranslateMessage(Msg);
DispatchMessage(Msg);
End;
DeleteTrayIcon;
End;
  你能看到:所有需要做的工作是創建一個窗口,注冊一個圖標到任務欄,設置它的消息循環,最后關閉它。當然,必須還有增加其他代碼完成相應的功能,但是,它是真的不需要擔心。
  讓我們從窗口的創建開始。實際上,這個窗口是不是能在任務欄上能見到的窗口。相應的,這個窗口只是處理消息循環、其它父類的工作。任務窗口(Windows 95 & NT)句柄創建消息(例如鼠標單擊等)和將消息發到我們的窗口。

Procedure CreateWindow;
Var
WC : TWndClass;
W : hWnd;
Begin
With WC do Begin
Style := 0;
lpfnWndProc := @WndProc;
cbClsExtra := 0;
cbWndExtra := 0;
hIcon := 0;
hCursor := 0;
hbrBackground := 0;
lpszMenuName := nil;
lpszClassName := MyTrayIconClass;
hInstance := System.hInstance;
end;
RegisterClass(WC);
W := Windows.CreateWindow(MyTrayIconClass,MyVeryOwnTrayIconWindow,
ws_OverlappedWindow,0,0,0,0,0,0,hInstance,nil);
ShowWindow(W,sw_Hide);
UpdateWindow(W);
MainWindow := W;
End;
  這個窗口使用普通的窗口函數創建。注重這個窗口的類型是“ws_OverlappedWindow”,但是這個尺寸是0,并且它是隱藏的,所有,它將不會顯示出來。
  下一步是加(注冊)我們的圖標。這將需要使用Shell_NotifyIcon這個API函數,這個函數實際上可以完成三個功能,這里只需要它的增加的特性。

Procedure AddTrayIcon;
Var IconData : TNotifyIconData;
B n
With IconData do Begin
cbSize := SizeOf(IconData);
Wnd := MainWindow;
uID := 0;
uFlags := nif_Icon Or nif_Message Or nif_Tip;
UCallBackMessage := wm_MyCallBack;
hIcon := LoadIcon(hInstance,MYICON);
StrCopy(szTip,PChar(TrayIconTip));
End;
Shell_NotifyIcon(nim_Add,@IconData);
End;
  這個最重要的事情是TNotifyIconData的數據結構,它是一個設置Window句柄的數據結構,是一個記錄參數,對我們來說,我們需要設置這個圖標的窗口句柄(這將定義哪個窗口處理消息循環),回調消息號,圖標,工具提示等。一旦這個數據設置了,我們就可以增加一個圖標到任務欄上了。為了完成這個工作,使用nim_Add程序。
  現行我們已經加了我們的圖標到任務欄,下面需要決定如何處理消息。

Const
wm_MyCallback = wm_User+1000;
cm_Exit = 100; { we worry about... }
cm_About = 101; { ...these later }
  這個實際的窗口處理過程也是相當普通。幾個窗口消息(如wm_NCCreate)必須處理。然而,對我們來說,更重要的事情是處理wm_MyCallback和wm_Command消息:
Function WndProc(Window : hWnd; Msg,WParam,LParam : Integer): Integer; StdCall;
Begin
Result := 0;
Case Msg of
wm_NCCreate : Result := 1;
wm_Destroy : PostQuitMessage(0);
wm_Command : Begin { a command was chosen from the popup menu }
If (WParam = cm_Exit) Then
PostMessage(Window,wm_Destroy,0,0)
Else If (WParam = cm_About) Then
MessageBox(0,Shell Test Copyright ?+
Jani J?vinen 1996.,
About Shell Test,mb_OK)
Else OpenDesktopIcon(WParam-cm_About);
End;
wm_MyCallback : Begin { our icon was clicked }
If (LParam = wm_LButtonDown) Then
ShowIconPopupMenu
Else If (LParam = wm_RButtonDown) Then
ShowAboutPopupMenu;
End;
Else Result := DefWindowProc(Window,Msg,WParam,LParam);
End;
End;
  就象你看到的一樣,當用戶單擊圖標時,Windows提示我們。
注重我們不使用通常使用的wm_LButtonDown 消息,而使用wm_MyCallback message,具體的消息信息存儲在LParam參數中。
  當用戶單擊鼠標右鍵,我們創建一個菜單在桌面上。

Type
TIconData = Array[1..100] of String;
Var
IconData : TIconData;
Procedure ShowIconPopupMenu;
Var
ShellFolder : IShellFolder;
EnumIDList : IEnumIDList;
Result : hResult;
Dummy : ULong;
ItemIDList : TItemIDList;
Pntr : PItemIDList;
StrRet : TStrRet;
PopupMenu : hMenu;
ItemID : Integer;
Pos : TPoint;
Procedure AddToMenu(Item : String);
Var S : String;
Begin
IconData[ItemID-cm_About] := Item;
S := ExtractFileName(Item);
If (System.Pos(.,S) $#@60;$#@62; 0) Then SetLength(S,System.Pos(.,S)-1);
AppendMenu(PopupMenu,mf_Enabled Or mf_String,ItemID,PChar(S));
Inc(ItemID);
End;
begin
PopupMenu := CreatePopupMenu;
ItemID := cm_About+1;
SHGetDesktopFolder(ShellFolder);
ShellFolder.EnumObjects(MainWindow,SHCONTF_NONFOLDERS,EnumIDList);
Pntr := @ItemIDList;
Result := EnumIDList.Next(1,Pntr,Dummy);
While (Result = NoError) do Begin
ShellFolder.GetDisplayNameOf(Pntr,SHGDN_FORPARSING,@StrRet);
With StrRet do AddToMenu(String(CStr));
Result := EnumIDList.Next(1,Pntr,Dummy);
End;
EnumIDList.Release;
ShellFolder.Release;
GetCursorPos(Pos);
AppendMenu(PopupMenu,mf_Separator,0,);
AppendMenu(PopupMenu,mf_Enabled Or mf_String,cm_Exit,E&xit);
SetForegroundWindow(MainWindow);
TrackPopupMenu(PopupMenu,tpm_LeftAlign Or tpm_LeftButton,
Pos.X,Pos.Y,0,MainWindow,nil);
DestroyMenu(PopupMenu);
end;
  上面的程序看起來有點復雜,你可以將它分成兩個部分來看:創建和顯示菜單。
  列舉創建菜單是用Windows的外殼接口完成的。首先,我們使用SHGetDesktopForlder函數得到使用桌面的IShellFolder接口。使用這個接口,我們能得到另一個接口的實例:IEnumIDList。這個接口通常實現實際的列舉工作。我們簡單的重復調用這個函數直到錯誤值返回(例如:所有的菜單被列舉)。當我們得到一個菜單,我們使用AddToMenu函數加它。

  當所有的菜單被列舉和創建后,現在我們需要運行這個菜單。我們將找到的菜單保存到一個全局的List變量中,每一個菜單都擁有它的菜單號。這確保我們能得到它的索引。

OpenDesktopIcon(WParam-cm_About)

  當然,WParam中儲存了用戶單擊鼠標的菜單的菜單號(ID)。

  下面我們將處理運行用戶選擇的菜單。

Procedure OpenDesktopIcon(Number : Integer);
Var
S : String;
I : Integer;
begin
S := IconData[Number];
I := ShellExecute(0,nil,PChar(S),nil,nil,sw_ShowNormal);
If (I $#@60; 32) Then Begin
S := Could not open selected item "+S+". +
Result was: +IntToStr(I)+.;
MessageBox(0,PChar(S),Shell Test,mb_OK);
End;
end;
  上面,Win 32 API函數ShellExecute做了所有的工作。

  現在你應該能用Delphi創建簡單的任務欄的程序了。

  實際上,有一些免費的元件可以供您直接使用,不過,因為使用VCL,文件的大小將比較大,假如使用上面的方法,文件的大小將只要20K。當然,現在文件的大小已經不是我們該十分關注的問題了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲激情视频网站| 久久精品免费电影| 在线观看国产欧美| 亚洲午夜av电影| 97精品国产97久久久久久免费| 久久影视三级福利片| 欧美日韩精品国产| 欧美肥臀大乳一区二区免费视频| 亚洲最大福利视频网站| 欧美主播福利视频| 欧美理论电影在线观看| 另类图片亚洲另类| 成人免费网站在线| 57pao国产精品一区| 日韩欧美在线字幕| 国产精品观看在线亚洲人成网| 92国产精品久久久久首页| 中文字幕日韩欧美在线| 91免费国产视频| 日日骚av一区| 97人洗澡人人免费公开视频碰碰碰| 亚洲欧美在线免费| 亚洲精品www久久久久久广东| 2020久久国产精品| 亚洲精品日韩久久久| 精品少妇一区二区30p| 成人激情av在线| 久久久久久噜噜噜久久久精品| 国产欧美久久久久久| 亚州欧美日韩中文视频| 欧美日韩另类在线| 亚洲国产成人精品久久| 久久伊人精品视频| 欧美视频在线免费看| xxxxx成人.com| 色yeye香蕉凹凸一区二区av| 国产拍精品一二三| 91九色单男在线观看| 国产午夜精品全部视频播放| 亚洲欧洲一区二区三区久久| 中文字幕v亚洲ⅴv天堂| 日韩电影第一页| 日韩精品在线视频观看| 久久九九有精品国产23| 亚洲视频在线观看| 中文亚洲视频在线| 国产日产久久高清欧美一区| 国产美女久久久| 亚洲精品720p| 亚洲网站在线看| 欧美色道久久88综合亚洲精品| 日韩动漫免费观看电视剧高清| 成人h片在线播放免费网站| 91精品久久久久久久久不口人| 久久99久国产精品黄毛片入口| 欧美一级电影在线| 日韩成人xxxx| 精品久久久久国产| 国产精品美女久久久久久免费| 欧美激情va永久在线播放| 亚洲成人a级网| 亚洲第一福利网站| 欧美日韩国产中文字幕| 日韩美女写真福利在线观看| 日本一区二区在线播放| 国产mv免费观看入口亚洲| 欧美另类精品xxxx孕妇| 亚洲自拍另类欧美丝袜| 亚洲区一区二区| 一个人www欧美| 日韩高清免费在线| 欧美极品欧美精品欧美视频| 国产日韩欧美在线观看| 2020国产精品视频| 国外成人在线播放| 色偷偷88888欧美精品久久久| 久久久久久网址| 亚洲成人激情图| 日韩视频免费观看| 亚洲日韩中文字幕在线播放| 在线日韩av观看| 国模精品视频一区二区| 中文字幕视频一区二区在线有码| 欧美一区二区.| 欧美国产第一页| 欧美午夜丰满在线18影院| 国产精品露脸自拍| 7m第一福利500精品视频| 亚洲午夜性刺激影院| 久久免费视频在线观看| 中文字幕少妇一区二区三区| 久久成人国产精品| 隔壁老王国产在线精品| 色青青草原桃花久久综合| 亚洲欧美日韩久久久久久| 亚洲国产精品久久精品怡红院| 国产成人精品一区二区三区| 色偷偷噜噜噜亚洲男人| 亚洲人成电影网站色xx| 中日韩美女免费视频网站在线观看| 少妇av一区二区三区| 久久久国产成人精品| 精品亚洲夜色av98在线观看| 97视频人免费观看| 最近2019年好看中文字幕视频| 亚洲欧美激情另类校园| 国产91精品久久久久| 欧美最猛性xxxxx亚洲精品| 国产精品视频白浆免费视频| 欧美日本在线视频中文字字幕| 欧美激情视频网| 亚洲色图15p| 国产亚洲精品va在线观看| 97国产成人精品视频| 亚洲天堂男人天堂女人天堂| 在线观看成人黄色| 国产精品旅馆在线| 国产玖玖精品视频| 久久久av亚洲男天堂| 欧美有码在线视频| 57pao成人永久免费视频| 精品成人国产在线观看男人呻吟| 欧美—级高清免费播放| 色婷婷久久av| 精品久久久91| 国产黑人绿帽在线第一区| 91高清免费视频| 91免费在线视频网站| 久久激情视频免费观看| 日本精品久久中文字幕佐佐木| 欧美成年人在线观看| 91av在线免费观看视频| 精品国产一区久久久| 久久色精品视频| 久久久精品2019中文字幕神马| 成人精品久久一区二区三区| 中文字幕在线看视频国产欧美| 日韩久久精品电影| 日韩欧美高清在线视频| 日韩av中文字幕在线免费观看| 九九精品视频在线| 国产在线视频欧美| 国产精品成人av在线| 国产精品尤物福利片在线观看| 姬川优奈aav一区二区| 久久久久久999| 欧美亚洲国产成人精品| 日本成人精品在线| 国产成人中文字幕| 国产激情999| 国产在线不卡精品| 国产成人拍精品视频午夜网站| 国产中文字幕日韩| 成人国产精品久久久久久亚洲| 国语自产在线不卡| 国产人妖伪娘一区91| 色偷偷av亚洲男人的天堂| 国产91精品久| 性视频1819p久久| 国产精品69久久久久| 欧美在线视频一二三| 日韩人体视频一二区| www.xxxx欧美| 欧洲精品毛片网站|