[]难者不会,会者不难,的小问题!!!
何鲁青 2006-01-18 10:23:20 作了一个小程序,实现了最小化到“任务栏”的功能,而且能够响应任务栏图标的消息并弹出PopMunu来了,但是我不知道怎么样去捕获PopUpMenu的菜单某项被点下的消息。
我的关键代码如下:
const WM_BARICON: Cardinal = WM_USER+100;//自定义的消息响应任务栏的操作
1、捕获最小化的程序
procedure WMSysCommand(var Message: TMessage); message WM_SYSCOMMAND;//声明在TForm
//////////////////
procedure TFrmMain.WMSysCommand(var Message: TMessage);//这里是实现
var
lpData:PNotifyIconData;
begin
if Message.WParam = SC_ICON then
begin
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;
lpData.Wnd := Handle;
// lpData.hIcon := Icon.Handle;
// lpData.hIcon := LoadIcon(0, IDI_QUESTION);
lpData.hIcon := Application.Icon.Handle;
lpData.uCallbackMessage := WM_BARICON;
lpData.uID :=0;
lpData.szTip := '家庭财富小管家';
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_ADD,lpData);
dispose(lpData);
Visible := False;
end
else
inherited;
end;
2、处理任务栏消息的程序
procedure TFrmMain.FrmMainWndProc(var Message: TMessage);
var lpData: PNotifyIconData;
CurPoint: TPoint;
begin
if Message.Msg = WM_BARICON then
begin
if (Message.LParam = WM_LBUTTONDOWN) then
begin
//如果用户点击任务栏图标则将图标删除并恢复窗口。
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;
lpData.Wnd := Handle;
lpData.hIcon := Application.Icon.Handle;
lpData.uCallbackMessage := WM_BARICON;
lpData.uID :=0;
lpData.szTip := '家庭财富小管家';
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_DELETE,lpData);
dispose(lpData);
Visible := True;
end
else if (Message.LParam = WM_RBUTTONUP) then
begin
GetCursorPos(CurPoint);
SetForegroundWindow(handle);
TrackPopupMenu(PopTree.Handle, TPM_RIGHTALIGN + TPM_LEFTBUTTON,
CurPoint.X, CurPoint.Y, 0, Handle, nil);
end;
end
else
begin
WndProc(Message);
end;
end;
----------------------------------------------------------------------
看到别人的实现这种功能的时候,是通过API函数自动创建的MENU但是小弟比较懒。
于是就用了一个delphi中的一个PopUpMenu的控件((PopTree)。然后调用TrackPopupMenu将他弹出。
但是,当我在PopTree的菜单OnClick事件当中写代码的时候,发现这些代码根本就没有被执行,后来
我捕获一下发向窗口的消息,发现根本就没有菜单被按下的消息被投递。
不知道是怎么回事了,还望各位大虾多多指教。