C++ Builder处理惩罚Windows 讯息(Message)
副标题#e#
媒介
固然C++Builder为一RAD式的程式成长东西,程式设计师在大大都环境下不需剖析Windows讯息的细节,只要将心思放在软体元件的事件处理惩罚函式即可。然而由於Windows功课系统终究是一个以讯息驱动的系统,因此架构其上的的应用程式自然无法自外於系统之外,在遭碰着C++Builder没有界说的事件时,Windows讯息处理惩罚本领仍然是C++Builder程式人不行或缺的本领。
不行否定地,C++Builder所提供的事件处理惩罚本领已具备了某一水平的完备性,然而我们也必需认可,在C++Buider建构的VCL瑰丽新世界中,仍然难免有丧家之犬。譬喻利用者自定讯息的处理惩罚,Winsock讯息的处理惩罚及一些Windows讯息如WM_NC**** 系列的讯息都是C++Builder的物件模子所未包括的。
在本文中我将汇报你如何故C++Builder来处理惩罚Windows讯息,并透过此一本领,来告竣在一般VCL元件所无法做到的成果。
何谓Window讯息(Message)
各人都知道 Windows是一套以讯息驱动(Message Driven)的功课系统。然而对於讯息自己却讳莫如深,只知其然而不知其所以然,固然C++Builder将某些Windows讯息封装於事件 (Event)系统中,但身为一个Windows程式设计师,实有须要相识Windows的讯息系统。
所谓讯息是由Windows功课系统送往程式的事件。它是系统中各个物件相同的方法,举例来说,当移动滑鼠、按下滑鼠键、改变视窗巨细时,Windows城市送出讯息以通知程式。虽然,为了要分辨事件的内容,Windows系统中界说了很多的讯息,如WM_PAINT,WM_CHAR等等。
当事件产生时,Windows会判定该事件必需由谁人程式吸收,然後将事件以讯息的方法送往程式的视窗中。固然在Windows系统中包括了数以百计的事件,可是功课系统并没有为各个事件设计差异的讯息布局,而是以一个一般性的布局来描写讯息,这个布局在C++Builder就称是TMessage.
虽然,跟着事件的差异,对於讯息的表明也有所差异,在C++Builder中也为各类常用的讯息界说了专属的布局,你可以直接利用它们来表明讯息。这些讯息界说在C++Builder目次下的Includevclmessages.hpp中,你可以抉择要自行表明TMessage参数或是直接将其转换成专属的布局。很抽象吗? 我举个例子吧,以WM_NCHITTEST讯息来说,C++Builder为它界说了TWMNCHitTest的专属布局,所以你可以直接经过它来获得XPos、YPos等值。可能你也可以直接由TMessage的LParam取得其值,端看你利用的利便。仔细调查TMessage及TWMNCHitTest两个布局,你会发明它们是等价的,也就是说它们的巨细是一致的,因此你可以直接用强制转型相互转换(这有点雷同union的要领)。
#p#副标题#e#
struct TMessage
{ Cardinal Msg;
union
{ struct
{ Word WParamLo;
Word WParamHi;
Word LParamLo;
Word LParamHi;
Word ResultLo;
Word ResultHi;
};
struct
{ long WParam;
long LParam;
long Result;
};
};
};
struct TWMNCHitTest
{ Cardinal Msg;
long Unused;
union
{ struct
{ Windows::TSmallPoint Pos;
long Result;
};
struct
{ short XPos;
short YPos;
};
};
} ;
在收到讯息後,程式必需处理惩罚该讯息,若是不处理惩罚,则可直接将它交给Windows的内定处理惩罚措施来处理惩罚之,若是程式需要传回值,也可以在此时传回,Windows会将该值传回给呼唤方。如此就完成了讯息通报的措施。