请教大伙

snjun 2001-04-27 03:55:00
一般每个窗体在任务栏上都有一个小块块(不知如何表达)
能不能让任务栏上相应的小块块即不显示图标又无caption,
在vfp中很容易做到,但不知在delphi中如何完成
...全文
90 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
snjun 2001-04-28
  • 打赏
  • 举报
回复
to rh
这种办法可能不行,我试过
我的意思是任务栏上有一个空的按钮,无图标、无caption(这点好办),按钮能切换任务
始终它都有图标(不好办)
rh 2001-04-27
  • 打赏
  • 举报
回复
哦~~你的意思……
procedure TForm1.Button1Click(Sender: TObject);
begin
//ShowWindow(Application.Handle, SW_HIDE);
Application.Icon := nil;
Application.Title := '';
end;
wanwangzhiwang 2001-04-27
  • 打赏
  • 举报
回复
不知这样能不能满足你:
把窗体的Bordstyle设为bsDialog,另外把caption属性框置为空!
newyj 2001-04-27
  • 打赏
  • 举报
回复
找到一篇文章,要例子留下 伊妹儿


Windows 95 作为Wi n d o w s 家族的一个里程碑,不仅增加了系统的稳定性,更在易用性方面
下了很大的功夫,其中任务栏的引入可以说是易用性方面的典范。系统运行的应用程序可以在
任务栏的任务切换区有对应的按钮,用户可以简便、快捷地在应用程序间切换。通过任务栏的
状态指示区,可以很方便地查看当前系统时间、调节声音大小、切换输入法等。Windows 95 也
允许应用程序在状态指示区上放置图标,以指示应用程序目前的状态或者提醒用户某个事件的
发生。现在,越来越多的应用程序,如拨号软件、网络监视软件、杀毒软件、字典等都把自己
的图标加到状态指示区上。在用户享受如此方便快捷的服务的同时,程序员则更加关注此功能
的实现方法,以使自己的产品立于不败之地。
针对这个问题,我们提出分析及解决它的三个步骤如下。
1. 在状态指示区上安装、更改、卸载图标
Windows 95 是基于事件驱动机制的操作系统。任何一个控件都是通过发消息或对系统消息
的处理来实现功能的。状态指示区实际上也是一个标准控件,对它的控制和操纵与其他的标准
控件一样,也是通过发消息和处理消息进行的。应用程序通过系统功能调用S h e l l _ N o t i f y I c o n 向
状态指示区发消息,它的函数原型如下:
function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData)
: BOOL; stdcall;
其中参数d w M e s s a g e 是要发给状态指示区的消息,可以取以下三个值:
• NIM_ADD 在状态指示区上增加一个图标。
• NIM_MODIFY 修改一个状态指示区的图标。
• NIM_DELETE 删除状态指示区的一个图标。
L p D a t a 是指向T N o t i f y I c o n D a t a A 结构的指针,此结构是要增加的图标的信息。
PNotifyIconData = ^TNotifyIconDataA
TNotifyIconDataA = record
cbSize : DWORD;
Wnd : HWND;
uID : UINT;
uFlags : UINT;
uCallbackMessage : UINT;
hIcon : HICON;
s z Tip : array [0..63] of AnsiChar;
e n d ;
各字段的含义如表1 6 - 6 所示。
在安装图标时,需要对结构的每一个字段都赋值。而当更改、卸载图标时,有些字段则可
以不赋值。当更改图标信息时,除设置需要更改的内容外,要把c b S i z e 、W n d 、u I D 设置成正
确的值,还要按照更改的内容将u F l a g s 调到相应的位置。例如,只更改图标的提示信息时,把
c b S i z e , W n d , u I D 设置为正确的值,s z Ti p 赋值为要更改成的提示信息,u F l a g s 赋值为4 即可。需
要删除图标时,只需要把c b S i z e 、W n d 、u I D 设置成正确的值即可。
2. 对状态指示区图标上鼠标事件的响应
现在,我们已经在状态指示区上安装了自己的图标,但它并不产生任何实际效果。因为当
应用程序接收到鼠标事件后,除了可以显示提示信息外,没有产生任何动作。我们现在要做的
就是要响应图标上的鼠标事件。ഊ表16-6 TNotifyIconDataA 中各字段含义
字段含义
C b S i z e 记录T N o t i f y I c o n D a t a A 的大小,设置为SizeOf( TNotifyIconDataA)
W n d 接收状态指示区鼠标事件的窗口的句柄,例如: F o r m 1 . H a n d l e
U I D 图标的I D (状态指示区鼠标事件的w P a r a 参数的值)
U F l a g s 此条消息的有效范围(低三位有效), 取值如下:
NIF_MESSAGE: 0x1 // uCallbackMessage 参数有效
NIF_ICON: 0x2 // hIcon is valid 参数有效
NIF_TIP: 0x4 // szTip is valid 参数有效
U C a l l b a c k M e s s a g e 系统回送消息的I D
H I c o n 显示在状态指示区上的图标的句柄
S z Ti p 鼠标移动到图标上时系统显示的提示信息
当在图标上移动、点击时,状态指示区会向应用程序发送如下的消息:
messageID = uCallbackMessage
wParam = uID
lParam = mouse event (如: W M _ L B U T TO N D O W N )
只需在主窗口的定义中,声明一个过程来响应这个消息,在它的实现部分就可以对消息进
行处理了。
3. 隐藏任务切换区的应用程序按钮
完成了上面这些工作以后,已经可以在状态指示区成功地安装上图标,而且也可以响应图
标上的事件了。但在状态指示区显示应用程序图标的同时,任务切换区也存在此应用程序的按
钮,如何让它不出现在任务切换区上呢?这里又要提到一个系统调用S h o w Wi n d o w ,它的原型
如下:
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; stdcall;
其中参数的含义如表1 6 - 7 所示。
当一个应用程序的所有窗口都隐藏时,它
的任务按钮就不显示。在用户选取状态指示
区的图标时,再让某一个窗口激活就可以了。
例程S16_27 该例程(运行界面如图1 6 - 4 5
所示)说明了任务栏编程的基本过程。
程序实现的功能是:程序运行时在状态指示区上安装一个图标,用户右击此图标,则弹出
一个菜单。选取相应菜单项时,将执行该菜单项对应的程序,选取“关闭”菜单项时,卸载状
态指示区的图标。
图16-45 运行例程S16_28 时指示区图标和弹出菜单的两种状态
具体实现过程如下:
1) 新创建一个应用程序工程。创建两个窗体,窗体F o r m 1 为隐藏窗体,不显示出来,窗体
F o r m 2 为可以显示的窗体。
在F o r m 1 中放置一个T P o p u p M e n u 组件,参照图1 6 - 4 5 作图定制弹出菜单。三个菜单项的
422 基本第三部分Delphi 高级编程技术
下载
表16-7 ShowWi n d o w 函数中各参数的说明
参数说明
H W n d 要改变显示状态的窗口的句柄
N C m d S h o w 窗口要改变成为的显示状态
S W _ H I D E 隐藏本窗口,激活另一个窗口
S W _ S H O W 激活本窗口ഊN a m e 属性和C a p t i o n 属性如表1 6 - 8 所示。
在窗体F o r m 2 上添加一个M a i n M e n u 组件,并在其中设置一个C a p t i o n 属性为“关闭( C )”的
菜单命令。
表16-8 例程S 1 6 _ 2 7 中两个窗体及其组件的属性设置
控件名称属性设置控件名称属性设置
F o r m 1 Caption: 隐藏窗口A p p I t e m Caption: 显示应用程序窗口( & S ) . . .
BorderStyle: bsNone E n a b l e O r D i s a b l e Caption: 禁止使用( & D )
F o r m 2 Caption: 应用程序窗口E x i t I t e m Caption: 退出( & X )
2) 为了使用Windows API 函数S h e l l _ N o t i f y I c o n ,在U n i t 1 . p a s 文件的u s e s 语句中添加s h e l l a p i
单元,并为图标和消息定义一些常量。另外,在类T F o r m 1 的定义中,添加对任务栏的状态指
示区进行操作时要使用的一些函数和变量。
具体如下:
unit Unit1;
. . .
u s e s
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, shellapi ;
c o n s t
ICON_ID = 1;
MI_ICONEVENT = WM_USER + 1;
t y p e
TForm1 = class(TForm)
. . .
p r i v a t e
{ Private declarations }
NormalIcon, DisabledIcon:TIcon;
Status:Boolean; // 标识"允许使用"还是"禁止使用"
procedure InstallIcon;
procedure ChangeIcon(s:Boolean);
procedure UnInstallIcon;
procedure IconOnClick(var message: TMessage); message MI_ICONEVENT;
p u b l i c
. . .
i m p l e m e n t a t i o n
uses Unit2;
{$R *. D F M }
{ TForm1 }
procedure TForm1.ChangeIcon(s: Boolean);
v a r
IconData: TNotifyIconData;
b e g i n
IconData.cbSize := SizeOf(IconData);
第16 章章其他编程技术章名423 下载ഊIconData.Wnd := Handle;
IconData.uID := ICON_ID;
if s=False then // 禁止使用
b e g i n
IconData.hIcon := DisabledIcon.Handle;
S t a t u s : = F a l s e ;
A p p I t e m . E n a b l e d : = F a l s e ;
e n d
else // 允许使用
b e g i n
IconData.hIcon := Normalicon.Handle;
S t a t u s : = Tr u e ;
A p p I t e m . E n a b l e d : = Tr u e ;
e n d ;
IconData.uFlags := NIF_ICON;
S h e l l _ N o t i f y I c o n ( N I M _ M O D I F Y, @IconData);
e n d ;
procedure TForm1.IconOnClick(var message: TMessage);
v a r
p : TPoint;
b e g i n
// 如果按下的是鼠标左键,并且允许显示,则显示F o r m 2
if ( (message.lParam = WM_LBUTTONDOWN) and (Status=True) ) then
F o r m 2 . S h o w ;
// 如果按下的是鼠标右键,则显示弹出菜单
if (message.lParam = WM_RBUTTONDOWN) then
b e g i n
GetCursorPos( p );
PopupMenu1.Popup(p.x ,p.y );
e n d ;
e n d ;
// 安装图标
procedure TForm1.InstallIcon;
v a r
IconData: TNotifyIconData;
b e g i n
NormalIcon := TIcon.Create;
DisabledIcon := TIcon.Create;
NormalIcon.LoadFromFile( 'normal.ico' ); // 允许使用状态下的图标
DisabledIcon.LoadFromFile( 'disable.ico' ); // 禁止使用状态下的图标
IconData.cbSize := SizeOf( IconData );
IconData.Wnd := Handle;
IconData.uID := ICON_ID;
IconData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
IconData.uCallBackMessage := MI_ICONEVENT;
IconData.hIcon := NormalIcon.Handle;
I c o n D a t a . s z Tip := '这是任务栏的状态指示区上加图标的例程' ;
Shell_NotifyIcon( NIM_ADD, @IconData );
e n d ;
424 基本第三部分Delphi 高级编程技术
下载ഊ// 卸载图标
procedure TForm1.UnInstallIcon;
v a r
IconData: TNotifyIconData;
b e g i n
IconData.cbSize := SizeOf( IconData );
IconData.Wnd := Handle;
IconData.uID := ICON_ID;
Shell_NotifyIcon( NIM_DELETE, @IconData );
e n d ;
注意:在类T F o r m 1 中定义了函数或过程原型后,只要按下S h i f t + C t r l + C ,系统会自动添加
函数体或过程体。
3) 下面在F o r m 1 窗体的O n C r e a t e 事件、O n C l o s e 事件及O n A c t i v a t e 事件的处理过程中进行一
些初始化工作和清理工作。具体如下:
procedure TForm1.FormCreate(Sender: TO b j e c t ) ;
b e g i n
// 安装图标并隐藏主窗体
S t a t u s : = Tr u e ;
I n s t a l l I c o n ;
ChangeIcon( True );
S h o w Window( Application.Handle,SW_HIDE );
S e t WindowLong( Application.Handle,GWL_EXSTYLE,WS_EX_TO O LWINDOW );
e n d ;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
b e g i n
// 卸载图标并释放图标资源
U n I n s t a l l I c o n ;
N o r m a l I c o n . F r e e ;
D i s a b l e d I c o n . F r e e ;
e n d ;
procedure TForm1.FormActivate(Sender: TO b j e c t ) ;
b e g i n
// 隐藏F o r m 1
F o r m 1 . w i d t h : = 0 ;
F o r m 1 . H e i g h t : = 0 ;
S h o w Window( Application.Handle, SW_HIDE );
e n d ;
4) 现在添加弹出菜单的O n C l i c k 事件的处理过程如下:
procedure TForm1.AppItemClick(Sender: TO b j e c t ) ;
b e g i n
F o r m 2 . S h o w ;
e n d ;
procedure TForm1.EnableOrDisableClick(Sender: TO b j e c t ) ;
b e g i n
i f ( S t a t u s = Tr u e ) t h e n
第16 章章其他编程技术章名425 下载ഊb e g i n
ChangeIcon( False );
E n a b l e O r D i s a b l e . C a p t i o n : = '允许使用( & Y ) ' ;
e n d
e l s e
b e g i n
ChangeIcon( True );
E n a b l e O r D i s a b l e . C a p t i o n : = '禁止使用( & D ) ' ;
e n d ;
e n d ;
procedure TForm1.ExitItemClick(Sender: TO b j e c t ) ;
b e g i n
C l o s e ;
e n d ;
5) 最后添加F o r m 2 窗体中“关闭( C )”菜单的O n C l i c k 事件的处理过程如下:
procedure TForm2.C1Click(Sender: TO b j e c t ) ;
b e g i n
c l o s e ;
e n d ;
426 基本第三部分Delphi 高级编程技术
rh 2001-04-27
  • 打赏
  • 举报
回复
ShowWindow(Application.Handle, SW_HIDE);
玄羽节拍器-一款简单易用的节拍器 第一次发帖,希望没有违规,对排版也不是很了解,大伙凑合凑合看看吧,要是实在难看我回头再看看咋美化吧23333 节拍器是利用摆的等时性控制节拍声来计时的仪器。取下节拍器面板,就看到一个标度尺。它标出摆振动时每分钟发出的节拍声次数(n)中有一摆杆,摆杆上有一可上下移动的摆锤。摆锤位置所对标尺数,就表示该摆每分钟振动的节拍数(一次全振动有两次节拍数),由此可算出摆的振动周期(T) T=(2×60)/n(秒) 源自百d百科: 节拍器 前段时间又回去看了遍轻音,然后就忍不住想要入手一把电吉他了。 刚好过完年手头有点压岁钱,就买了吧电吉他来练练手。 正好开始需要搭配节拍器练习了,然后又发现电脑端没有合适的节拍器(可能是我不会搜吧),手机端的又有广告,于是乎决定自动动手丰衣足食 节拍器支持以下拍号: 1/4、2/4、3/4、4/4、3/8、6/8 支持BPM最大最小值: 40-240 音调支持: 强音,次强音,弱音 节拍间隔计算公式为: 四分音符:60÷BPM*1000-变色间隔 八分音符:(60÷BPM*1000-变色间隔)÷2 60(秒)÷BPM*1000(单位换算为毫秒)-变色间隔(单位毫秒) (变色间隔:因为节拍器提供声音节奏的同时提供变色闪光打拍子,所以这里去掉显示颜色用的时间,以防影响后面的节拍间隔) 调用模块: 精易模块 (文本处理)、 超级模块(超级延时、线程) (其实模块可以只保留其中一个的,只是因为我这是自动加载模块,我也懒得去删除了,就这样用了) 写在最后:小弟我也是刚入门电吉他,对乐理和很多东西都不太了解,若是有大佬发现以上内容有什么问题还烦请和平指出,小弟也虚心请教(但是拒绝喷子和ETC) 为什么发布帖子过后吞了我好多内容。。。然后还得重新编辑。。。 以下是附件,包含源码(不含模块),编译好的节拍器(源码直接静态编译,无修改),调用音效(来源于互联网,已自行截去无用部分用于控制时长,侵删)

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧