這個窗口使用普通的窗口函數創建。注意這個窗口的類型是“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;