手机管理网站,明星网站开发项目介绍,网页设计各个部分的尺寸,如何看网站建立时间为什么要这样做#xff1f;有时候我们需要一个非窗口组件(比如一个非继承自TWinContrl的组件)可以接受Windows消息。要接受消息就需要一个窗口句柄#xff0c;但是非窗口组件却没有句柄。这篇文章将讲述怎么让一个没有句柄的组件如何通过一个隐藏的窗口接受消息这是怎么做到的…为什么要这样做有时候我们需要一个非窗口组件(比如一个非继承自TWinContrl的组件)可以接受Windows消息。要接受消息就需要一个窗口句柄但是非窗口组件却没有句柄。这篇文章将讲述怎么让一个没有句柄的组件如何通过一个隐藏的窗口接受消息这是怎么做到的例如我的剪贴板查看组件就是一个不可视的组件。这个窗体可以接收提供信息关于更改剪贴板的消息。Delphi库里面的AllocateHWnd函数可以帮助我们创建一个隐藏的窗口同时与之相关的DeallocateHWnd函数可以释放当我们使用完的隐藏窗口。 这个隐藏的窗口将命令窗口过程。 通常当Windows调用一个stdcall函数时AllocateHWnd函数能让我们像窗体过程一样的使用方法。 我们通过一个引用allocatehwnd函数所需的方法来并将它注册为一个窗口过程的方法来解决问题。 在这个被注册的方法内部我们可以处理我们感兴趣的消息同时传递给Windows下面的代码清单2停工了一个如何使用AllocateHWnd函数的框架。尽管如此我们的代码清单1定义一个组件类的轮廓 ------------------代码清单1------------------type {******************************* Our class derived from TComponent or another ancestor class ********************************} TMyClass class(TComponent) private fHWnd: HWND; {******************************* field to store the window handle 存储窗口句柄的字段 ********************************} ... protected procedure WndMethod(var Msg: TMessage); virtual; {******************************* window proc - called by Windows 窗口过程(window proc) 由windows系统调用 to handle messages passed to our hidden window 该窗口过程是用来处理传递到我们的隐藏窗口的 ********************************} ... public constructor Create(AOwner: TComponent); override; {******************************* create hidden window here: store handle in fHWnd 在这里创建隐藏窗体并且把它的句柄存储在fHWnd字段。 ********************************} destructor Destroy; override; {******************************* free hidden window here 销毁隐藏窗口过程 ********************************} ... end;------------------代码清单1------------------ 同时下面将是实现部分的详细代码 ------------------代码清单2------------------constructor TMyClass.Create(AOwner: TComponent);begin inherited Create(AOwner); ... //创建一个隐藏窗体并且用WndMethod过程 fHWnd : AllocateHWnd(WndMethod); ...end;destructor TMyClass.Destroy;begin ... //销毁隐藏窗口 DeallocateHWnd(fHWnd); ... inherited Destroy;end;procedure TMyClass.WndMethod(var Msg : TMessage);var Handled: Boolean;begin //假定我们可以处理消息 Handled : True; case Msg.Msg of WM_SOMETHING: DoSomething; //处理消息的代码 WM_SOMETHINGELSE: DoSomethingElse; //处理另一个消息的代码 //这里处理其他的消息 else //我们不再处理消息 Handled : False; end; if Handled then //我们在消息记录里处理消息 Msg.Result : 0 else //我们通过DefWindowProc函数 //不处理的消息同时记录结果 Msg.Result : DefWindowProc(fHWnd, Msg.Msg, Msg.WParam, Msg.LParam);end;------------------代码清单2------------------ 原文Of course, we could just use the Windows API to create a window the hard way and provide a windows procedure. But it is more difficult to use a method as a window procedure if we do it this way. The clever features about AllocateHWnd are that (a) it creates the hidden window for us and (b) it allows us to use a method, rather than a simple procedure, as the window procedure – and a method is more useful since it has access to the classs private data. 译文当然我们仅使用 Windows API提供的比较难的方式创建了一个window窗口并提供窗口过程。但是如果我们采用这种方式那么把一个方法作为窗口过程来使用的话将是困难的。 关于AllocateHWnd灵活的特性有a它创建一个隐藏窗口给我们使用b它允许我们使用一个方法而不是一个简单的过程(procedure)作为该窗口过程——当使用这个方法来访问该类的私有数据的时候更加有用。 后记第一次翻译文章可能有些地方理解的不是很透彻所以附录原文地址如下.原文http://www.delphidabbler.com/articles?article1转载于:https://www.cnblogs.com/yzryc/p/6397393.html