Delphi使用普通类对象创建接受window消息(使用Classes.AllocateHWnd为对象创建一个尺寸为0的窗口,从而有了Handle)good

在delphi中,有时候我们希望对象可以接收windows消息,怎么办呢?因为要接收windows消息起码要有windows Handle,难道要建立的一个可见窗口?那样似乎太差强人意了。delphi提供了一个函数Classes.AllocateHWnd。分析AllocateHWND发现delphi CreateWindowEx一个尺寸为0的窗口,窗口是生成了,Handle也有了,但窗口的消息要处理吧,否则怎么说让对象接收Windows消息呢,但我们都知道类函数和Windows消息处理函数是不一样的,类函数的地址应该是Self+函数的偏移。这个delphi也帮我们处理好了,在AllocateHWnd内部将我们传入的对象函数通过MakeObjectInstance转换为普通函数,然后我们就可以在对象内部处理Windows消息了。

简写代码如下:

TMyHandleWinMessage = class

private

FWinHandle: HWND;

procedure WndProc(var Msg: TMessage);

public

constructor Create;

destructor Destroy; override;

end;

Create 实现:

FWinHandle = Classes.AllocateHWnd(WndProc);

Destroy实现:

if FWinHandle <> 0 then  Classes.DeallocateHWnd(FWinHandle);  // 必须释放系统核心对象

WndProc实现:

在这里处理你感兴趣的消息,否则交给Windows处理。

With Msg do

if Msg = XXX then  // 你打算处理的消息

begin

//

end

else

Result := DefWindowProc(FWinHandle, Msg, wParam, lParam);

http://blog.csdn.net/shandiantianying/article/details/9786425

时间: 2024-10-11 07:41:59

Delphi使用普通类对象创建接受window消息(使用Classes.AllocateHWnd为对象创建一个尺寸为0的窗口,从而有了Handle)good的相关文章

Delphi对象的秘密:在Delphi中的类实例实际上是指向堆中的类实例数据的3 2位指针

在Delphi中的类实例实际上是指向堆中的类实例数据的32 位指针 当访问对象的域.方法和属性时,编译器会自动产生一些代码来处理这个指针.因此对于新手来说,对象就好像是一个静态变量.这意味着,Delphi无法像C++那样在应用程序的数据段中为类分配内存,而只能在堆中分配内存. 所以Delphi的对象实例需要最后自己调用Free()方法来释放,而不能在作用域结束之后被自动释放

Delphi之TComponent类【转】

原文:http://www.cnblogs.com/spider518/archive/2010/12/27/1917527.html TComponent类 TComponent类直接由TPersistent派生.TComponent的独特特征是它的属性能够在设计期间通过ObjectInspector来控制,能够拥有其他组件.非可视组件也是从TComponent派生的,因此它们也继承了在设计期间可以被控制的能力.TComponent派生的非可视对象的典型例子是TTimer组件.TTimer组件

转:学习笔记: Delphi之线程类TThread

学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时间. TThread-简单的开始 在Delphi的VCL中封装了一个TThread类用于多线程的开发,这样比较符合面向对象的思想,同时又可以提

Delphi之TComponent类

TComponent类 TComponent类直接由TPersistent派生.TComponent的独特特征是它的属性能够在设计期间通过ObjectInspector来控制,能够拥有其他组件.非可视组件也是从TComponent派生的,因此它们也继承了在设计期间可以被控制的能力.TComponent派生的非可视对象的典型例子是TTimer组件.TTimer组件是不可视组件,但它仍可以在组件面板上得到.TComponent定义了几个重要的属性和方法,在随后的段落中将加以描述. 1.TCompon

Delphi中线程类TThread 实现多线程编程

作者:Rogee出处:Http://Rogee.cnblogs.com/心得:BLOG是什么,它是一个记录学习过程的东西 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchronize的用法就完了.然而这并不是多线程编程的全部,我写此文的目的在于对此作一个补充. 线程本质上是进程中一段并发运行的代码.一个进程至少有一个线程,即所谓的主线程.同时还可以

ExtJs window(二)点击按钮打开一个window,window重复创建的问题

例1:点击按钮打开一个window,window重复创建的问题重点分析:这个问题是初学者经常会犯错的地方,一般来说简单的代码不会产生此问题,但是如果以后代码复杂以后,这个问题如果发生调试起来会非常麻烦!!第一种,窗体无id,对此点击问题:modal属性背景置灰,从而使触发该窗体的按钮只能按一次第二种,窗体存在id,通过id判断窗体是否被创建 Ext.onReady(function(){ //例1:点击按钮打开一个window,window重复创建的问题 //重点分析:这个问题是初学者经常会犯错

Django中视图总结[urls匹配,HttpRequest对象,HttpResponse对象,对象序列化接受及案例]

视图的功能: 接收请求,进行处理,返回应答. 视图返回的内容为: HttpResponse的对象或子对象 render 返回的是HttpResponse的对象 JsonResponse是HttpResponse的子类 HttpResponseRedirect也是HttpResonse的子类 redirect是HttpResponseRedirect的一个简写 总结:所以视图返回的内容一般为:render,redirect,JsonResponse,Httpresponse 定义视图函数分为两步

3、ObjectARX开发创建直线、圆、圆弧和修改对象属性

一.本节课程 Arx二次开发创建直线.圆.圆弧和修改对象属性 二.本节要讲解的知识点 1.如何应用C++ ARX二次开发创建直线. 2.如何应用C++ ARX二次开发创建圆. 3.如何应用C++ ARX二次开发创建圆弧. 4.如何修改对象的属性. 5.腾讯课堂云幽学院详细的内容讲解. 三.具体内容 1.创建一条直线,直线的起点是(0,0,0),直线的终点(100,100,0). 2.表:表是数据库的组成单位,一个数据库至少含有一个表. 3.记录:记录是表的组成单位,一个表可能含有多个记录,也可能

Netty源码分析第8章(高性能工具类FastThreadLocal和Recycler)----&gt;第5节: 同线程回收对象

Netty源码分析第八章: 高性能工具类FastThreadLocal和Recycler 第五节: 同线程回收对象 上一小节剖析了从recycler中获取一个对象, 这一小节分析在创建和回收是同线程的前提下, recycler是如何进行回收的 回顾第三小节的demo中的main方法: public static void main(String[] args){ User user1 = RECYCLER.get(); user1.recycle(); User user2 = RECYCLER