自己对DELPHI学习的一点体会

源代码在线查看: 建立简单的任务栏应用程序 (2001年4月8日).txt

软件大小: 771 K
上传用户: pipinooad
关键词: DELPHI
下载地址: 免注册下载 普通下载 VIP

相关代码

				建立简单的任务栏应用程序 (2001年4月8日) 
				
				网友更新  分类:数据库   作者: winfit(推荐)  推荐:winfit   阅读次数:243  
				(http://www.codesky.net)  
				
				--------------------------------------------------------------------------------
				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;
				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; 
				这个最重要的事情是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; 
				就象你看到的一样,庇没Уセ魍急晔保琖indows提示我们。注意我们不使用通常使用的wm_LButtonDown 消息,而使用wm_MyCallback message,详细的消息信息存储在LParam参数中。 
				当用户单击鼠标右键,我们创建一个菜单在桌面上
				 
				 
							

相关资源