社区
Delphi
帖子详情
点击最小化按钮问题,参与者有分!!!
zhuaibing
2002-05-30 07:54:21
当我点击最小化按钮,如何使他在右下角的状态栏中出现一个小图标????
(希望给出详细代码!!!谢谢各位网友)
参与者有分!!!
答中者,重奖!!!!!!
...全文
83
6
打赏
收藏
点击最小化按钮问题,参与者有分!!!
当我点击最小化按钮,如何使他在右下角的状态栏中出现一个小图标???? (希望给出详细代码!!!谢谢各位网友) 参与者有分!!! 答中者,重奖!!!!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xiaoxiao197821
2002-05-30
打赏
举报
回复
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ShellAPI,
StdCtrls;
const MY_MESSAGE = WM_USER + 100;
type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
procedure OnIconNotify(var Message: TMessage);
message MY_MESSAGE;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.OnIconNotify(var Message: TMessage);
const
Busy: Boolean = false;
begin
if not Busy then begin
Busy := true;
if Message.LParam=WM_LBUTTONDOWN then
if Application.MessageBox('Are you sure','Exit',MB_YESNO)=IDYES then Close;
Busy := false;
end;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
hide;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
nid: TNotifyIconData;
begin
nid.cbSize := sizeof(nid); // nid±äÁ¿µÄ×Ö½ÚÊý
nid.Wnd := Handle; // Ö÷´°¿Ú¾ä±ú
nid.uID := 0;// ÄÚ²¿±êʶ£¬¿ÉÉèΪÈÎÒâÊý
nid.hIcon := Application.Icon.Handle; // Òª¼ÓÈëµÄͼ±ê¾ä±ú£¬¿ÉÈÎÒâÖ¸?
nid.hIcon := Application.Icon.Handle; // Òª¼ÓÈëµÄͼ±ê¾ä±ú£¬¿ÉÈÎÒâÖ¸?
nid.szTip := 'This is a test application'; // Ìáʾ×Ö·û´®
nid.uCallbackMessage := MY_MESSAGE; // »Øµ÷º¯ÊýÏûÏ¢
nid.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE; // Ö¸Ã÷ÄÄЩ×Ö¶ÎÓÐ?
if not Shell_NotifyIcon(NIM_ADD,@nid) then begin
ShowMessage('Failed!');
Application.Terminate;
end;
{½«³ÌÐòµÄ´°¿ÚÑùʽÉèΪTOOL´°¿Ú£¬¿É±ÜÃâÔÚÈÎÎñÌõÉϳöÏÖ}
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
nid: TNotifyIconData;
begin
nid.cbSize := sizeof(nid); // nid±äÁ¿µÄ×Ö½ÚÊý
nid.cbSize := sizeof(nid); // nid±äÁ¿µÄ×Ö½ÚÊý
nid.uID := 0; //ÄÚ²¿±êʶ£¬Óë¼ÓÈëСͼ±êʱµÄÊýÒ»ÖÂ
nid.Wnd := Handle; //Ö÷´°¿Ú¾ä±ú
Shell_NotifyIcon(NIM_DELETE,@nid); //È¥µôСͼ±ê
Shell_NotifyIcon(NIM_DELETE,@nid); //È¥µôСͼ±ê
end;
end.
newnewworm
2002-05-30
打赏
举报
回复
taidy() 兄,例子不错!
改天试试!
一点点凋落
2002-05-30
打赏
举报
回复
Rx控件包有个RxTrayIcon控件,把它放在form上就可以实现要求了
可以自己定义事件,用起来简便。
sogh
2002-05-30
打赏
举报
回复
unit TestForm;
interface
uses
Windows, Classes, Forms, Controls, StdCtrls, ExtCtrls;
type
TZoomAction = (zaMinimize, zaMaximize);
TfrmTest = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmTest: TfrmTest;
implementation
{$R *.DFM}
procedure ZoomEffect(theForm: TForm; theOperation: TZoomAction);
var
rcStart: TRect;
rcEnd: TRect;
rcTray: TRect;
hwndTray : hWnd;
hwndChild: hWnd;
begin
{ 获取系统的Tray区域的边界矩形 }
hwndTray := FindWindow('Shell_TrayWnd', nil);
hwndChild := FindWindowEx(hwndTray, 0, 'TrayNotifyWnd', nil);
GetWindowRect(hwndChild, rcTray);
{ 检查最大化/最小化状态以交换开始/结束矩形 }
if theOperation = zaMinimize then
begin
rcStart := theForm.BoundsRect;
rcEnd := rcTray;
end
else
begin
rcEnd := theForm.BoundsRect;
rcStart := rcTray;
end;
{ 这里会发生一些奇妙的事... }
DrawAnimatedRects(theForm.Handle, IDANI_CAPTION, rcStart, rcEnd)
end;
procedure TfrmTest.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ZoomEffect(Self, zaMinimize);
end;
procedure TfrmTest.FormShow(Sender: TObject);
begin
ZoomEffect(Self, zaMaximize);
end;
end.
taidy
2002-05-30
打赏
举报
回复
不好意思,贴错了,下面是这个例子!
系统状态栏图标是指在Windows桌面系统下边的任务栏右边区域内显示的小图标,通常包括时间和输入法,另外,还会包括一些应用程序,如金山词霸或其它一些杀毒软件等的小图标。通常用鼠标右键点击这些小图标时会弹出菜单,通过选择这些菜单可以灵活地实现程序的各项功能。
下面本文以一个具体的例子,详细介绍一下利用Delphi实现系统状态栏图标的步骤和方法。
首先,介绍一下本实例要实现的功能:程序开始运行时会在系统状态栏生成一个小图标,同时会打开应用程序窗口,并在任务栏上显示相应的程序窗口;当用户关闭应用程序窗口时,该窗口和任务栏上相应的应用程序窗口都会消失,但应用程序并没有退出;当用户用鼠标左健单击该图标时,会再次打开应用程序窗口,同时在任务栏上显示应用程序窗口;当用户用鼠标右键单击系统状态栏中应用程序的小图标时,会弹出菜单,选择菜单项“退出”可以完全退出应用程序。
一、 实现步骤
1. 创建一个应用程序,在主窗体上增加一个TpopupMenu组件。并为该弹出菜单组件增加菜单项Exit,标题为“退出”。
2. 在Uses中添加ShellAPI,因为在系统状态栏中增加图标时需调用ShellAPI函数Shell_NotifyIconA。该函数需要2个参数,其中一个是TnotifyIconDataA结构,需在主窗体中增加TnotifyIconDataA类型全局变量ntida。
3. 定义消息mousemsg,并编写主窗体的mousemessage消息处理函数,此函数说明在图标上用鼠标左键单击时,会打开应用程序窗口;用鼠标右键单击时,会弹出一个菜单。
下面给出步骤2和3的实现代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Menus, shellapi;
const
mousemsg = wm_user + 1; //自定义消息,用于处理用户在图标上点击鼠标的事件
iid = 100; //用户自定义数值,在TnotifyIconDataA类型全局变量ntida中使用。
type
TForm1 = class(TForm)
......
private
//自定义消息处理函数,处理鼠标点击图标事件
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));
end;
message.Result := 0;
end
4. 编辑TForm1.FormCreate(Sender: TObject)
应用程序开始运行时,在系统状态栏上生成图标显示,代码如下:
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 := 'Icon'; //当鼠标停留在系统状态栏该图标上时,出现该提示信息
shell_notifyicona(NIM_ADD, @ntida); //在系统状态栏增加一个新图标
end;
5. 编辑Tform1.OnClose
当用户关闭应用程序窗口时,该窗口和任务栏上相应的应用程序窗口都消失,但程序并没有退出。代码如下:
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,
GetWindowLong(Application.handle, GWL_EXSTYLE)
or WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW);
end;
6. 编辑弹出菜单Exit
当用户点击该菜单时完全退出应用程序。代码如下:
procedure TForm1.ExitClick(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 := 'Icon';
shell_notifyicona(NIM_DELETE, @ntida); //删除已有的应用程序图标
Application.Terminate; //中断应用程序运行,退出应用程序
end;
二、 技术要点
1.程序中在增加或删除系统状态栏图标时,需调用ShellAPI函数Shell_NotifyIconA,该函数有两个参数,其中一个是TnotifyIconDataA结构,在前面的程序注释中已经对其进行了介绍;另一个参数是dwMessage,通过不同的取值表示是增加图标、修改图标或删除图标。
2.通过调用一组API函数,实现在任务栏上显示或隐藏应用程序窗口。这些函数分别为ShowWindow、SetWindowLong和GetWindowLong。其中,ShowWindow用于设置指定窗口的显示状态;SetWindowLong和GetWindowLong分别用于改变和检索指定窗体的一个属性。
taidy
2002-05-30
打赏
举报
回复
This is a sample
为了更有效地利用显示器的空间,多数程序员都有过这样的经验,即通过Windows任务栏属性对话框,在“任务栏选项”页中将任务栏设置为“自动隐藏”,并且为了在需要任务栏时操作方便,选择任务栏“总在最前”。完成上述设置后,当程序员编辑文档或编写代码时,任务栏会自动隐藏,增加了显示器的可利用空间;而当程序员需要操作任务栏时,只需将鼠标移动到任务栏所在位置的显示器边缘上,这时任务栏就会自动出现。但如果任务栏没有设置成“总在最前”,此时任务栏就不会自动弹出。
要控制Windows任务栏的隐藏和显示,可以通过调用一组API函数来实现。这组API函数分别是:
(1) FindWindow函数
该函数通过指定的类名和窗口名来检索指定的高层窗口句柄,如果检索成功,则返回窗口句柄,否则返回空;另外,需注意改函数不能用于查找子窗口。函数如下:
HWND FindWindow(LPCTSTR lpClassName, //类名指针
LPCTSTR lpWindowName //窗口名指针
);
(2) ShowWindow函数
该函数用于设置指定窗口的显示状态。函数如下:
BOOL ShowWindow(HWND hWnd, //指定窗口的句柄
Int nCmdShow //指定窗口的显示状态,可以设置为SW_HIDE,SW_SHOW等
);
(3) SetWindowPos函数
该函数用于设置指定窗口的大小、显示位置和显示顺序等信息。函数如下:
BOOL SetWindowPos(
HWND hWnd, // 指定窗口的句柄
HWND hWndInsertAfter, // 指定窗口的显示顺序,可以设为如下一组值:HWND_BOTTOM、HWND_NOTOPMOST、HWND_TOP、HWND_TOPMOST
int X, // 指定窗口的横坐标位置
int Y, // 指定窗口的纵坐标位置
int cx, // 指定窗口的宽度
int cy, // 指定窗口的长度
UINT uFlags // 指定窗口的尺寸和位置标记,可以取一组值或这些值的组合
);
下面本文以一个具体的例子,详细介绍一下在Delphi 5.0中实现Windows任务栏显示和隐藏的步骤。
1. 创建一个应用程序,在主窗体上增加二个TButton组件和一个TcheckBox组件。设置其中一个TButton组件的Caption属性为“隐藏Windows的任务栏”,设置另一个TButton组件的Caption属性为“显示Windows的任务栏”,设置TcheckBox组件的Caption属性为“总在最前”。
2. 编辑TForm1.Button1Click(Sender: TObject)
隐藏Windows的任务栏,代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
wndHandle: THandle; //用于存储指定窗口的句柄
wndClass: array[0..50] of Char; //用于存储类名
begin
strPCopy(@wndClass[0], 'Shell_TrayWnd'); //获取任务栏类名
wndHandle := FindWindow(@wndClass[0],nil); //获取任务栏窗口的句柄
ShowWindow(wndHandle, SW_Hide); //隐藏Windows任务栏
button2.Enabled := True; //设置“显示Windows任务栏”按钮变为可操作状态
button1.Enabled := False; //设置“隐藏Windows任务栏”按钮变为不可操作状态
end;
3. 编辑TForm1.Button2Click(Sender: TObject)
显示Windows的任务栏,并判断“总在最前”TcheckBox组件是否选中,如果选中,则任务栏总是显示在最前方,否则任务栏显示在最底层。代码如下:
procedure TForm1.Button2Click(Sender: TObject);
var
wndHandle: THandle;
wndClass: array[0..50] of Char;
begin
strPCopy(@wndClass[0], 'Shell_TrayWnd');
wndHandle := FindWindow(@wndClass[0],nil);
ShowWindow(wndHandle, SW_SHOW); //显示Windows的任务栏
//判断“总在最前”复选框是否选中
if CheckBox1.checked then //如果选中,则设置任务栏为最顶层窗口
SetWindowPos(wndHandle, HWND_TOPMOST, r.top, r.left, r.bottom, r.right, SWP_NOMOVE)
Else //否则,设置任务栏为最底层窗口
SetWindowPos(wndHandle, HWND_BOTTOM, r.top, r.left, r.bottom, r.right, SWP_NOMOVE);
//设置按钮的操作状态
button2.Enabled := False;
button1.Enabled := True;
end;
4. 打开Windows任务栏属性对话框,不选中“自动隐藏”和“总在最前”两个复选框,并确定后关闭该对话框。运行上述创建的应用程序,即可控制Windows任务栏的显示和隐藏。
C# 实战项目——制作仿QQ软件
QQ 大家都用过,在现在这个互联网时代,越来越多的人使用 QQ 进行沟通交流,本章将使用 C# 制作一个仿 QQ 的聊天软件 —— Q 友。通过本课程学习,你将学到以下知识点:1、Form窗体关键属性、方法和事件的应用 2、如何触发窗体和控件的事件3、ListView控件和ImageList组件的结合使用 4、数据库及数据表的创建5、使用C#操作SQL Server数据库 6、Timer定时器组件的使用7、如何判断是否按下键 8、自定义
最小化
和关闭
按钮
同时将提供完整的项目开发流程,手把手的带你做完一个完整的项目。
【Qt UI相关】Qt中如何控制 窗口的最大化、
最小化
和关闭
按钮
?一文带你掌握用法
窗口的最大化、
最小化
和关闭
按钮
通常是由操作系统的窗口管理器控制的,而不是由应用程序控制的。这些
按钮
的行为(例如
点击
最大化
按钮
会将窗口的大小调整为屏幕的大小)是由窗口管理器实现的,应用程序通常不能改变这些行为。 在 Qt 中,你可以通过 QWidget::setWindowFlags 函数来设置窗口的一些属性,包括是否显示最大化、
最小化
和关闭
按钮
。但是,这些属性的实际效果可能会受到窗口管理器的限制。例如,一些窗口管理器可能会忽略 Qt::WindowMaximizeButtonHint 标志,总是显示最大化
动态顺序图可视化控件
本文介绍了一个Windows .NET控件,用于以UML顺序图的形式动态可视化对象及其交互。该控件具有类似于调试器的中断功能。另外,它提供了一个实际使用的示例,其中实时拦截和可视化了应用程序的执行。 下载源1.2 MB 介绍 顺序图是UML图的基本类型之一。他们的重点是对系统进行动态建模。它们允许描述系统与环境
参与者
之间或系统
参与者
之间随着时间的推移的交互作用。它们清晰的图形布局有助于快...
MFC实现简单的,会抽奖程序
马上就开年会了,行政的提需求要弄个简单的抽奖程序。然后花了小半天时间匆匆写了个程序。功能单一。如需增加功能,可自行下载源代码来修改。 先放效果图: 程序使用VS2013编写。一共有三个
按钮
,两个隐藏
按钮
,分别在左上角和右上角,左上角
按钮
作用是
最小化
,右上角功能是关闭程序。
点击
开始
按钮
名字开始滚动。参与抽奖的名单写在names.txt里,可替换背景图。 源码下载地址:h
语音识别技术:2018年主要
参与者
的完整指南
目录 语音识别技术在哪里使用? 有哪些变量可以决定任何给定的语音识别技术的准确度? 词典: 基于SRT目的的词典变化: 统计 最常用的算法是神经网络,隐马尔可夫模型(HMM),动态时间规整(DTW),深度学习和端到端自动语音识别。 不同类型的语音识别技术 扬声器相关应用 扬声器独立应用 主要语音识别技术应用于2018年 语音识别技术特点: 亚马逊Alexa - 比较...
Delphi
5,388
社区成员
262,729
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章