delphi 开发
句柄,是个什么东西,它有什么用呢,为什么要使用句柄?
[明了地解释一下,深层的东西不太理解]高手们,快快现身吧~~~
解决方案 »
- 关于DBGrid排序的代码,请帮忙看下!
- 开发好了一个数据库系统怎么制作安装包??
- 问个弱弱的问题
- 如保通过程序把SQL存储过程导出,生成SQL脚本
- 急问DbGrid!!!
- 请大家都来讨论一下开发“环保程序”的心得和经验。 来者有分...
- 请问fastreport与teechart之间安装的问题??
- BDE连接ORACLE数据库后,控件query却不可用insert或edit进行插入操作?requeslive已设为true.sql server数据库时可以.
- 关于汉字处理的小问题
- 今天忽得杭州的百年老店“胡庆余堂”四字的题者,现在才知为什么有此字的牌匾都没有题者的署名
- 求助,复制文件问题!
- 关于BMP位图的疑问,就是作为按钮上的图标,一个弱智问题
procedure TForm3.FormCreate(Sender: TObject);
var
H:HWND ;
begin
H:=TreeView1.Handle ;
SetWindowLong(h,GWL_STYLE,GetWindowLong(h,GWL_STYLE )or TVS_CHECKBOXES );
with TreeView1 do
begin
Align :=alLeft ;
Items.Add(nil,'AAA');
Items.Add(nil,'BBB');
Items.Add(nil,'CCC');
Items.AddChild(Items [2],'111');
Items.AddChild(Items [2],'222');
Items.AddChild(Items [2],'333');
end;
end;不是太理解~~~
Delphi从Windows 引入了不少数据类型,其中句柄最重要。这种数据类型名为THandle,该类型在Windows 单元中定义: type
THandle = LongWord; 句柄数据类型通过数字实现,但并不当数字用。在Windows 中,句柄是一个系统内部数据结构的引用。例如,当你操作一个窗口,或说是一个Delphi 窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此,你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口极小化为图标,等等。实际上许多Windows API 函数把句柄作为它的第一个参数,如GDI (图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等等,不仅仅局限于窗口函数,。 换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等等。Delphi中很少需要直接使用句柄,因为句柄藏在窗体、位图及其他Delphi对象的内部。当你要调用Delphi不支持的Windows API 函数时,句柄才会有用。 现在举一个简单的Windows句柄例子,完善这节内容。例WHandle 程序的窗体很简单,只有一个按钮。正如下面主窗体文本所定义的那样,我在代码中添加了窗体的OnCreate 事件和按钮的OnClick 事件: object FormWHandle: TFormWHandle
Caption = 'Window Handle '
OnCreate = FormCreate
object BtnCallAPI: TButton
Caption = 'Call API '
OnClick = BtnCallAPIClick
end
end
窗体一创建,程序就会通过窗体本身的Handle 属性,获取窗体对应的窗口句柄。调用IntToStr ,把句柄数值转换为一个字符串,然后再把它添加到窗体标题中,如图9.1: procedure TFormWHandle.FormCreate(Sender: TObject);
begin
Caption := Caption + ' ' + IntToStr (Handle);
end;
因为FormCreate 是窗体类的方法,它可直接访问同类的其他属性和方法。因此,在这个过程中我们能够直接访问窗体的Caption 属性和Handle 属性。 图 9.1: 例 WHandle 显示窗体句柄,每次运行程序得到的句柄值不同 如果你多此次执行该程序,通常会获得不同的句柄值。这个值实际上是由Windows 操作系统确定并返回给应用程序的。(句柄从来不是由程序决定的,而且句柄没有预定义值,句柄是由系统决定的,每执行一次程序,产生一个新值。) 当你单击按钮,程序将调用Windows API 函数SetWindowText,它会根据第一个传递参数改变窗口的标题。更准确地说,所用的API 函数其第一个参数是需要修改窗体的句柄: procedure TFormWHandle.BtnCallAPIClick(Sender: TObject);
begin
SetWindowText (Handle, 'Hi ');
end;
这段代码与前面所讲的事件处理程序等效,它通过给窗体的Caption 属性赋一个新值,改变窗体的标题。
Delphi从Windows 引入了不少数据类型,其中句柄最重要。这种数据类型名为THandle,该类型在Windows 单元中定义: type
THandle = LongWord; 句柄数据类型通过数字实现,但并不当数字用。在Windows 中,句柄是一个系统内部数据结构的引用。例如,当你操作一个窗口,或说是一个Delphi 窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此,你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口极小化为图标,等等。实际上许多Windows API 函数把句柄作为它的第一个参数,如GDI (图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等等,不仅仅局限于窗口函数,。 换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等等。Delphi中很少需要直接使用句柄,因为句柄藏在窗体、位图及其他Delphi对象的内部。当你要调用Delphi不支持的Windows API 函数时,句柄才会有用。 现在举一个简单的Windows句柄例子,完善这节内容。例WHandle 程序的窗体很简单,只有一个按钮。正如下面主窗体文本所定义的那样,我在代码中添加了窗体的OnCreate 事件和按钮的OnClick 事件: object FormWHandle: TFormWHandle
Caption = 'Window Handle '
OnCreate = FormCreate
object BtnCallAPI: TButton
Caption = 'Call API '
OnClick = BtnCallAPIClick
end
end
窗体一创建,程序就会通过窗体本身的Handle 属性,获取窗体对应的窗口句柄。调用IntToStr ,把句柄数值转换为一个字符串,然后再把它添加到窗体标题中,如图9.1: procedure TFormWHandle.FormCreate(Sender: TObject);
begin
Caption := Caption + ' ' + IntToStr (Handle);
end;
因为FormCreate 是窗体类的方法,它可直接访问同类的其他属性和方法。因此,在这个过程中我们能够直接访问窗体的Caption 属性和Handle 属性。 图 9.1: 例 WHandle 显示窗体句柄,每次运行程序得到的句柄值不同 如果你多此次执行该程序,通常会获得不同的句柄值。这个值实际上是由Windows 操作系统确定并返回给应用程序的。(句柄从来不是由程序决定的,而且句柄没有预定义值,句柄是由系统决定的,每执行一次程序,产生一个新值。) 当你单击按钮,程序将调用Windows API 函数SetWindowText,它会根据第一个传递参数改变窗口的标题。更准确地说,所用的API 函数其第一个参数是需要修改窗体的句柄: procedure TFormWHandle.BtnCallAPIClick(Sender: TObject);
begin
SetWindowText (Handle, 'Hi ');
end;
这段代码与前面所讲的事件处理程序等效,它通过给窗体的Caption 属性赋一个新值,改变窗体的标题。
中的h就是句柄,而且h:=TreeView1.Handle ;
也就是说可以写成
SetWindowLong(TreeView1.Handle ,GWL_STYLE,GetWindowLong(TreeView1.Handle ,GWL_STYLE )or TVS_CHECKBOXES );
再看SetWindowLong函数,
函数SetWindowLong中的第一个参数为句柄参数,其实就是让函数知道给谁加复选框。
如果你不写句柄,那么这个复选框给谁加呢。
句柄起了识别作用。
那上边都有详细说明的
MSDN上也有
怎样知道哪些是Delphi支持的Windows API 函数,哪些是不支持的?
并不是Delphi不能使用某些Windows API 函数
而是Delphi没自行实现(封装)的功能,还可以直接使用对应的Windows API 函数来实现
而在DELPHI中,它帮你做了一些常用API的封装,并且对一般开发用户来讲,使用难度已大大降低
有兴趣可看一下windows.pas单元(好久不用delphi了,应该是这个)