六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

怎么創(chuàng)建容易的任務(wù)欄應(yīng)用程序

[摘要]Windows 95 和 Windows NT 4.0包含一個(gè)令人興奮的特性:任務(wù)欄。這個(gè)通常位于區(qū)域任務(wù)條右面的區(qū)域能包含小的圖標(biāo),這些圖標(biāo)能引出大的應(yīng)用程序或者菜單。本篇文章主要討論如何使用Delphi建立這樣的應(yīng)用程序。 在開始之前,請看下面的需要的接口方面的內(nèi)容: 從技術(shù)方面來說,一個(gè)任務(wù)...
Windows 95 和 Windows NT 4.0包含一個(gè)令人興奮的特性:任務(wù)欄。這個(gè)通常位于區(qū)域任務(wù)條右面的區(qū)域能包含小的圖標(biāo),這些圖標(biāo)能引出大的應(yīng)用程序或者菜單。本篇文章主要討論如何使用Delphi建立這樣的應(yīng)用程序。
在開始之前,請看下面的需要的接口方面的內(nèi)容:
從技術(shù)方面來說,一個(gè)任務(wù)欄應(yīng)用程序非常象普通的應(yīng)用程序,它有一個(gè)消息循環(huán),相應(yīng)Windows的消息來完成相應(yīng)的功能。

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

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;
這個(gè)窗口使用普通的窗口函數(shù)創(chuàng)建。注意這個(gè)窗口的類型是“ws_OverlappedWindow”,但是這個(gè)尺寸是0,并且它是隱藏的,所有,它將不會顯示出來。
下一步是加(注冊)我們的圖標(biāo)。這將需要使用Shell_NotifyIcon這個(gè)API函數(shù),這個(gè)函數(shù)實(shí)際上可以完成三個(gè)功能,這里只需要它的增加的特性。

Procedure AddTrayIcon;
Var IconData : TNotifyIconData;
Begin
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;
這個(gè)最重要的事情是TNotifyIconData的數(shù)據(jù)結(jié)構(gòu),它是一個(gè)設(shè)置Window句柄的數(shù)據(jù)結(jié)構(gòu),是一個(gè)記錄參數(shù),對我們來說,我們需要設(shè)置這個(gè)圖標(biāo)的窗口句柄(這將定義哪個(gè)窗口處理消息循環(huán)),回調(diào)消息號,圖標(biāo),工具提示等。一旦這個(gè)數(shù)據(jù)設(shè)置了,我們就可以增加一個(gè)圖標(biāo)到任務(wù)欄上了。為了完成這個(gè)工作,使用nim_Add程序。
現(xiàn)行我們已經(jīng)加了我們的圖標(biāo)到任務(wù)欄,下面需要決定如何處理消息。

Const
wm_MyCallback = wm_User+1000;
cm_Exit = 100; { we worry about... }
cm_About = 101; { ...these later }
這個(gè)實(shí)際的窗口處理過程也是相當(dāng)普通。幾個(gè)窗口消息(如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;
就象你看到的一樣,當(dāng)用戶單擊圖標(biāo)時(shí),Windows提示我們。注意我們不使用通常使用的wm_LButtonDown 消息,而使用wm_MyCallback message,詳細(xì)的消息信息存儲在LParam參數(shù)中。
當(dāng)用戶單擊鼠標(biāo)右鍵,我們創(chuàng)建一個(gè)菜單在桌面上。

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) <> 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;
上面的程序看起來有點(diǎn)復(fù)雜,你可以將它分成兩個(gè)部分來看:創(chuàng)建和顯示菜單。
列舉創(chuàng)建菜單是用Windows的外殼接口完成的。首先,我們使用SHGetDesktopForlder函數(shù)得到使用桌面的IShellFolder接口。使用這個(gè)接口,我們能得到另一個(gè)接口的實(shí)例:IEnumIDList。這個(gè)接口通常實(shí)現(xiàn)實(shí)際的列舉工作。我們簡單的重復(fù)調(diào)用這個(gè)函數(shù)直到錯誤值返回(例如:所有的菜單被列舉)。當(dāng)我們得到一個(gè)菜單,我們使用AddToMenu函數(shù)加它。

當(dāng)所有的菜單被列舉和創(chuàng)建后,現(xiàn)在我們需要運(yùn)行這個(gè)菜單。我們將找到的菜單保存到一個(gè)全局的List變量中,每一個(gè)菜單都擁有它的菜單號。這確保我們能得到它的索引。

OpenDesktopIcon(WParam-cm_About)

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

下面我們將處理運(yùn)行用戶選擇的菜單。

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 < 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函數(shù)ShellExecute做了所有的工作。

現(xiàn)在你應(yīng)該能用Delphi創(chuàng)建簡單的任務(wù)欄的程序了。


實(shí)際上,有一些免費(fèi)的元件可以供您直接使用,不過,因?yàn)槭褂肰CL,文件的大小將比較大,如果使用上面的方法,文件的大小將只要20K。當(dāng)然,現(xiàn)在文件的大小已經(jīng)不是我們該十分關(guān)注的問題了。


主站蜘蛛池模板: 自偷自偷自亚洲首页精品 | 日韩 欧美 综合 在线 制服 | 青青草原手机在线视频 | 最新精品女神在线观看 | 欧美一级在线视频 | 青草香蕉视频 | 最近中文字幕无免费视频 | 色综久久 | 欧美怡红院免费全视频 | 日本特黄a级高清免费酷网 日本特黄aaaaaaa大片 | 七七七久久久久人综合 | 午夜亚洲国产精品福利 | 欧美一区二区三区日韩免费播 | 四虎国产精品永免费 | 我想看一级黄色毛片 | 天天干天天曰天天操 | 日本中文字幕在线 | 雪白丰满丝袜长腿白嫩在线 | 日本不卡高清免费v | 四虎在线免费观看视频 | 中文字幕福利片 | 日本三级香港三级国产三级 | 色噜噜色偷偷男人的天堂 | 天堂福利视频 | 永久免费看的啪啪网站 | 日韩亚洲一区中文字幕在线 | 日本高清视频一区二区三区 | 特黄一级黄色片 | 亚洲第一男人网站 | 日本精品一区二区三区四区 | 色综合一区 | 日韩黄色一级大片 | 人人精品久久 | 欧美性猛交xxxx | 色成人综合 | 亚洲第1页| 亚洲 欧美 中文 日韩专区 | 午夜日韩视频 | 亚洲欧洲精品视频 | 婷婷狠狠五月天小说免费 | 香蕉久久a毛片 |