如何实现在windows系统盒的图标单击一次关闭窗口,再单击一次又打开窗口?? (100分)

  • 主题发起人 主题发起人 wudaqi
  • 开始时间 开始时间
W

wudaqi

Unregistered / Unconfirmed
GUEST, unregistred user!
我在做一个realplay播放器,如何实现在windows系统盒的图标单击一次关闭窗口,再单击一次又打开窗口?
另外如何实现在播放的屏幕上单击使它全屏显示?
 
没明白:关闭了以后单击哪里?
 
我曾经做过这样的功能,想不出有什么好的方法就用一个全局变量存储窗体的状态,再根据这个全局变量判断是要最小化到系统栏还是恢复程序窗口。
 
无论窗体打开或关闭,但那个图标就一直存在是吗?如果是这样的话,你可以判断一下当前窗体,在单击事件里这样写,试试看行不行?
if not assigned(form_name) then

begin

form_name:=tform_name.Create(application);
form_name.Show;
end
else

form_name.close;
 
加上上面一段代码还是无法实现此功能。
 
哦,那你再试试这一段怎么样
if Owner is TWinControl
then

if Application.MainForm <> nil
then

if Application.MainForm.Visible then

begin

Application.MainForm.Visible := False;
ShowWindow(Application.Handle, SW_HIDE);
end
else

begin

ShowWindow(Application.Handle, SW_RESTORE);
Application.MainForm.Visible := True;
if Application.MainForm.WindowState = wsMinimized
then
Application.MainForm.WindowState := wsNormal;
end;

end;

end;
 
哪位高手,请帮助解决一下!只要解决两个问题中的一个我就把分数加给他。
 
你做一个Form,BorderStyle=bsNone,并且最大化,这不就有全屏的效果了吗
你在离线大富翁里搜索“托盘”应该能搜索到你要的东西,
下面是我搜出来的,你试试行不行
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ShellAPI;

const
WM_TRAYNOTIFY = WM_USER+100;
//任务区小图标自定义消息

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure TrayNotifyMessage(var Sender: TMessage);
message WM_TRAYNOTIFY;
procedure MarkTaskBarIcon(Sender: TObject);
public
{ Public declarations }
end;


var
Form1: TForm1;
tnd : TNOTIFYICONDATA;
implementation

{$R *.DFM}

procedure TForm1.MarkTaskBarIcon(Sender: TObject);
begin

Form1.Visible := False;
tnd.cbSize := sizeof(tnd);
tnd.Wnd := Handle;
tnd.uID := 128;
tnd.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
tnd.uCallbackMessage := WM_TRAYNOTIFY;
tnd.hIcon := Application.Icon.Handle;
StrPCopy(tnd.szTip,Application.Title);
Shell_NotifyIcon(NIM_ADD,@tnd);
end;


procedure TForm1.TrayNotifyMessage(var Sender: TMessage);
begin

if Sender.LParam = WM_LBUTTONDBLCLK then

begin

Shell_NotifyIcon(NIM_DELETE,@tnd);
Form1.Visible := True;
Application.Restore;
Application.BringToFront;
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin

Application.OnMinimize := MarkTaskBarIcon;
end;


end.


 
我這裡有一個控件,特別好用,就是實現托盤的,可以給你分享
 
在Public里申明:
procedure IconTray(var Msg:TMessage);
message MyMsg;

加入下列代码:
procedure TForm1.IconTray(var Msg:TMessage);
var pt:TPoint;
begin

inherited;
//如果点击的是鼠标左键
if Msg.LParam = wm_lbuttondown then

begin

Form1.Visible:=not Form1.Visible;
Application.ShowMainForm:=not Application.ShowMainForm;
end;

end;
 
to 比尔.丐痴:
你這個一運行就報錯:[Error] Unit1.pas(20): Undeclared identifier: 'myMsg'
 
我把程序中有关的部分粘上请高手看看如何修改才能解决问题。
procedure TForm1.mousemessage(var message: tmessage);
var
mousept: TPoint;
begin

inherited;
if message.LParam = wm_rbuttonup then
begin
//用鼠标右键点击图标
getcursorpos(mousept);
//获取光标位置
popupmenu1.popup(mousept.x, mousept.y);
//在光标位置弹出选单
end;

if message.LParam = wm_lbuttonup then
begin
//用鼠标左键点击图标
//显示应用程序窗口
// 说明:我是希望在这里单击一次左键打开窗口,再单击一次关闭窗口。
ShowWindow(Handle, SW_SHOW);
//在任务栏上显示应用程序窗口
ShowWindow(Application.handle, SW_SHOW);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
not (GetWindowLong(Application.handle, GWL_EXSTYLE)
or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW));
realaudio1.doplay;
end;


end;

 
还需要在uses里加入ShellAPI,并在前面加入一常数变量
const
MyMsg = WM_USER + 1;
 
運行之後右下角沒有圖標呀
 
我把完整的原程序粘上,请高手看看该如何解决?目前我只能通过按钮实现全屏效果,还无法通过点击realplay画面来实现。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, RealAudioObjects_TLB, StdCtrls, FileCtrl,shellapi,
Menus;
const
mousemsg=wm_user+1;
iid=100;
type
TForm1 = class(TForm)
RealAudio1: TRealAudio;
DriveComboBox1: TDriveComboBox;
DirectoryListBox1: TDirectoryListBox;
FileListBox1: TFileListBox;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
Button1: TButton;
procedure FileListBox1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
procedure N1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
{ Private declarations }
procedure mousemessage(var message: tmessage);
message
mousemsg;

public
{ Public declarations }
end;


var
Form1: TForm1;
ntida: TNotifyIcondataA;
implementation

{$R *.dfm}
procedure TForm1.mousemessage(var message: tmessage);
var
mousept: TPoint;
//鼠标点击位置
begin

inherited;
if message.LParam = wm_rbuttonup then
begin
//用鼠标右键点击图标
getcursorpos(mousept);
//获取光标位置
popupmenu1.popup(mousept.x, mousept.y);
//在光标位置弹出选单
end;

if message.LParam = wm_lbuttonup then
begin
//用鼠标左键点击图标
//显示应用程序窗口
ShowWindow(Handle, SW_SHOW);
//在任务栏上显示应用程序窗口
ShowWindow(Application.handle, SW_SHOW);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
not (GetWindowLong(Application.handle, GWL_EXSTYLE)
or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW));
realaudio1.doplay;
end;


end;


procedure TForm1.FileListBox1Click(Sender: TObject);
begin

  //单击列表文件名就自动播放
realaudio1.Source:=FileListBox1.FileName;
realaudio1.DoPlay;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin

ntida.cbSize := sizeof(tnotifyicondataa);
//指定ntida的长度
ntida.Wnd := handle;
//取应用程序主窗体的句柄
ntida.uID := iid;
//用户自定义的一个数值,在uCallbackMessage参数指定的消息中使
ntida.uFlags := nif_icon + nif_tip +
nif_message;
//指定在该结构中uCallbackMessage、hIcon和szTip参数都有效
ntida.uCallbackMessage := mousemsg;
//指定的窗口消息
ntida.hIcon := Application.Icon.handle;
//指定系统状态栏显示应用程序的图标句柄
ntida.szTip := 'real播放器';
//当鼠标停留在系统状态栏该图标上时,出现该提示信息
shell_notifyicona(NIM_ADD, @ntida);
//在系统状态栏增加一个新图标

end;


procedure TForm1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin

Action := caNone;
//不对窗体进行任何操作
ShowWindow(Handle, SW_HIDE);
//隐藏主窗体
//隐藏应用程序窗口在任务栏上的显示
ShowWindow(Application.Handle, SW_HIDE);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
not (GetWindowLong(Application.handle, GWL_EXSTYLE)
or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW));
realaudio1.DoPlayPause; //关闭窗口暂停手播放
end;


procedure TForm1.N1Click(Sender: TObject);
begin

//为ntida赋值,指定各项参数
ntida.cbSize := sizeof(tnotifyicondataa);
ntida.wnd := handle;
ntida.uID := iid;
ntida.uFlags := nif_icon + nif_tip + nif_message;
ntida.uCallbackMessage := mousemsg;
ntida.hIcon := Application.Icon.handle;
ntida.szTip := 'real播放器';
shell_notifyicona(NIM_DELETE, @ntida);
//删除已有的应用程序图标
Application.Terminate;
//中断应用程序运行,退出应用程序

end;


procedure TForm1.Button1Click(Sender: TObject);
begin

realaudio1.SetFullScreen;
//画面全屏显示
end;

end.

 

Similar threads

S
回复
0
查看
768
SUNSTONE的Delphi笔记
S
S
回复
0
查看
681
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部