当前位置:首页 » 软件开发
开发技术指南» 文章正文
    引言: 这将是最后一个组件了,目标定为非可视化,事实上非可视化组件要比可视化组件难做,因为是从TComponent继承而来,就没有了很多属性和事件。
 

 

 ·delphi的编码规范    »显示摘要«
    摘要: 1.规范简介 本规范主要规定delphi源程序在书写过程中所应遵循的规则及注意事项。编写该规范的目的是使公司软件开发人员的源代码书写习惯保持一致。这样做可以使每一个组员都可以理解其它组员的代码,以便于源代码的二次开发记忆系统的维护。 2.单元的格式 2.1 基本要求 2.1.1 缩进 缩进就是在当源程序的级改变时为增加可读性而露出的两个空格。缩进的规则为每一级缩进两个空格。......
 ·利用delphi中的画布画树    »显示摘要«
    摘要: 一直都听说delphi中画布使用简单方便。现在我就利用画布实现一个简单的树机构的图形表示。系统支持节点选择、移动、保存树、打开树等。为了实现的方便用到了递归与指针,虽然效率有点问题但是在快速解决问题还是蛮好的。 程序写的比较乱,欢迎交流:sss@pacia.com.cn 源代码如下: unit u_tree; interface uses windows, messages, ......


组件制作之五(托盘组件)
这将是最后一个组件了,目标定为非可视化,事实上非可视化组件要比可视化组件难做,因为是从tcomponent继承而来,就没有了很多属性与事件.而这些都要我们从头来做过.

【程序编程相关:在TDBGrid控件中为作修改过的记录进

【推荐阅读:建立、读取、存贮INI文件的方法《一》

这个非可视化组件,我决定为托盘组件,其中用到的技术较多,我不如列一个表出来,然后再来讲解好一点.另外,可能篇幅会多一些,请耐心看. 【扩展信息:建立、读取、存贮INI文件的方法《二》

用到的技术:

1作为核心功能,当然是托盘的应用啦.

2?托盘组件怎么样影响到主窗口最小化时隐藏

3?托盘如何处理消息

4?组件编辑器的用法

上面每一个技术都非常有趣,让我们一个个来看吧:

?

一??托盘,是系统壳编程的一个功能,相信我们也看过很多啦,大概知道它用起来是什么样子的.

那么它是如何实现的呢,

windows定义了这样一个结构来存放托盘的信息:

typedef?struct?_notifyicondata?{?//?nid??

dword?cbsize;

????hwnd?hwnd;?

????uint?uid;?

????uint?uflags;?

????uint?ucallbackmessage;?

????hicon?hicon;?

????char?sztip[64];?

}?notifyicondata,?*pnotifyicondata;

cbsize是notifyicondata结构的尺寸,我们一般用sizeof就可以了

hwnd一个窗口句柄,用于检索托盘消息的.然而我们的非可视组件并没有窗口呀,这就是技术列表第三条要讲的,这里从略

uid?唯?一标识托盘图标的,我们可以随便指定一个数,但如果同时有不同的图标,则数应该不同

uflags是nif_icon,nif_message,nif_tip中的一个或多个,我们全用就可以了.

ucallbackmessage;托盘消息,是我们自定义的消息,这里我们定义为:

????????????????const

??????????????????wm_traymsg=wm_user+10;

hicon托盘图标句柄

sztip这个是托盘提示,当托盘出现时,鼠标移到哪里,就会出现该提示.

delphi将这个结构重定义为tnotifyicondata,我们照这个来用就行了

?

我们应用托盘要用到api函数shell_notifyicon,其中有两个参数,第一个为

nim_add,nim_delete??,nim_modify中的一个,分别表示添加托盘(图标出现)

修改托盘(比如图标,提示),删除(图标消失)第二个参数是notifyicondata的指针

嗯,托盘应该差不多了.

?

二?这个组件能够决定主窗体最小化时,是否是正常最小化并没有托盘图标.还是最小化到屏幕之外,使我们看不见,且托盘区出现了图标.这里有一个成员为factive来决定.

那么我们是怎么样影响到主窗体呢,也即怎么截获窗体的最小化消息呢.

全局变量application有一个方法为procedure?hookmainwindow(hook:?twindowhook);

顾名思义,就是钩到主窗口的所有消息.里面的参数是twindowhook类型,它是一个方法指针,定义如下:

type?twindowhook?=?function(var?message:?tmessage):?boolean?of?object;

我们要自己定义过程的,然后传给hookmainwindow:

function?appmsghook(var?msg:tmessage):boolean;

application.hookmainwindow(appmsghook);

这样做之后,主窗口的所有消息都会经过appmsghook方法啦,最小化消息也不例外,则我们可以在里面截获这个消息,并做一些操作:

?

做什么操作呢,先判断组件是否为设计时,如果是,不进行操作,如果不是进行下一步

if?not?(csdesigning?in?componentstate)?then

这样的意图是很明显的,因为当设计时的主窗其实是delphi的ide,如果让他处理该消息,其实是处理ide的最小化消息,这时如果你最小化ide,就会出现托盘啦.所以不能.

?

下一步是是否截获了最小化消息,以及factive是否为真:

if?(msg.msg=wm_syscommand)?and(factive)?then

两样都成立,执行里面的代码,代码中有解释,这里只说两个:

setwindowlong(application.handle,gwl_exstyle?,ws_ex_toolwindow);

设置了这个属性后,窗口最小化就不会停在任务栏了,而是停在屏幕的某个位置,这个位置在哪里呢,由

placement.flags:=wpf_setminposition;

?????placement.ptminposition.x:=1050;

?????placement.ptminposition.y:=800;


...   下一页
 ·delphi多层开发方案比较    »显示摘要«
    摘要: 方案->......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE