⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap04.htm

📁 经典的C入门教程,想学习VC的朋友们可以看一下
💻 HTM
字号:
<html>

<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
<meta NAME="GENERATOR" CONTENT="Microsoft FrontPage 3.0">
<title>以C++ Builder处理Windows 讯息(Message)</title>
<link rel="stylesheet" href="../../../include/style.css">
</head>

<body>
<font SIZE="2">

<p><small><a href="../../../index.htm">首页</a> &gt;&gt; <a href="../../program.htm">程序设计</a> 
  &gt;&gt; <a href="../cbuilder.htm">C++ Builder</a>&nbsp; &gt;&gt;&nbsp; </small>以C++ 
  Builder处理Windows 讯息(Message)-前言<br>
</p>

<p align="left"><!--webbot bot="ImageMap" rectangle=" (40,1) (71, 23)  chap41.htm" rectangle=" (4,1) (36, 23)  ../ch3/chap391.htm" src="../ch1/NextBack.gif" width="72" height="24" alt="NextBack.gif (743字节)" border="0" startspan --><MAP NAME="FrontPageMap"><AREA SHAPE="RECT" COORDS="40, 1, 71, 23" HREF="chap41.htm"><AREA SHAPE="RECT" COORDS="4, 1, 36, 23" HREF="../ch3/chap391.htm"></MAP><a href="../../../_vti_bin/shtml.exe/program/C++/ch4/chap04.htm/map"><img ismap usemap="#FrontPageMap" border="0" height="24" alt="NextBack.gif (743字节)" src="../ch1/NextBack.gif" width="72"></a><!--webbot bot="ImageMap" endspan i-checksum="34987" --></p>
</font>

<p align="center"><strong><font size="3">以C++ Builder处理Windows 讯息(Message)</font></strong><font SIZE="2"><br>
</font></p>

<p><font SIZE="2" color="#FF0000">&middot;前言</font></p>

<p><font SIZE="2">虽然C++Builder为一RAD式的程式发展工具,程式设计师在大多数情况下不需理会Windows讯息的细节,只要将心思放在软体元件的事件处理函式即可。然而由於Windows作业系统终究是一个以讯息驱动的系统,因此架构其上的的应用程式自然无法自外於系统之外,在遭遇到C++Builder没有定义的事件时,Windows讯息处理能力仍然是C++Builder程式人不可或缺的能力。 
</font></p>

<p><font SIZE="2">不可否认地,C++Builder所提供的事件处理能力已具备了某一程度的完备性,然而我们也必须承认,在C++Buider建构的VCL美丽新世界中,仍然不免有漏网之鱼。例如使用者自定讯息的处理,Winsock讯息的处理及一些Windows讯息如WM_NC**** 
系列的讯息都是C++Builder的物件模型所未包含的。</font></p>

<p><font SIZE="2">在本文中我将告诉你如何以C++Builder来处理Windows讯息,并透过此一能力,来达成在一般VCL元件所无法做到的功能。 
</font></p>

<p><font SIZE="2" color="#FF0000">何谓Window讯息(Message)</font></p>

<p><font SIZE="2">大家都知道 Windows是一套以讯息驱动(Message Driven)的作业系统。然而对於讯息本身却讳莫如深,只知其然而不知其所以然,虽然C++Builder将某些Windows讯息封装於事件 
(Event)系统中,但身为一个Windows程式设计师,实有必要了解Windows的讯息系统。 
</font></p>

<p><font SIZE="2">所谓讯息是由Windows作业系统送往程式的事件。它是系统中各个物件沟通的方式,举例来说,当移动滑鼠、按下滑鼠键、改变视窗大小时,Windows都会送出讯息以通知程式。当然,为了要辨别事件的内容,Windows系统中定义了许多的讯息,如WM_PAINT,WM_CHAR等等。 
</font></p>

<p><font SIZE="2">当事件发生时,Windows会判断该事件必须由那个程式接收,然後将事件以讯息的方式送往程式的视窗中。虽然在Windows系统中包含了数以百计的事件,但是作业系统并没有为各个事件设计不同的讯息结构,而是以一个一般性的结构来描述讯息,这个结构在C++Builder就称是TMessage。 
</font></p>

<p><font SIZE="2">当然,随着事件的不同,对於讯息的解释也有所不同,在C++Builder中也为各种常用的讯息定义了专属的结构,你可以直接使用它们来解释讯息。这些讯息定义在C++Builder目录下的Include\vcl\messages.hpp中,你可以决定要自行解释TMessage参数或是直接将其转换成专属的结构。很抽象吗? 
我举个例子吧,以WM_NCHITTEST讯息来说,C++Builder为它定义了TWMNCHitTest的专属结构,所以你可以直接经由它来得到XPos、YPos等值。或者你也可以直接由TMessage的LParam取得其值,端看你使用的方便。仔细观察TMessage及TWMNCHitTest两个结构,你会发现它们是等价的,也就是说它们的大小是一致的,因此你可以直接用强制转型互相转换(这有点类似union的方法)。 
</font></p>

<p><font SIZE="2">struct TMessage</font> </p>

<p><font SIZE="2">{</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; Cardinal Msg;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; union</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; {</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Word 
WParamLo;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Word 
WParamHi;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Word 
LParamLo;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Word 
LParamHi;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Word 
ResultLo;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Word 
ResultHi;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long 
WParam;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long 
LParam;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long 
Result;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; };</font> </p>

<p><font SIZE="2">};</font> </p>

<p><font SIZE="2">struct TWMNCHitTest</font> </p>

<p><font SIZE="2">{</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; Cardinal Msg;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; long Unused;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; union</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; {</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
Windows::TSmallPoint Pos;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long 
Result;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; short 
XPos;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; short 
YPos;</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</font> </p>

<p><font SIZE="2">&nbsp;&nbsp;&nbsp; };</font> </p>

<p><font SIZE="2">} ;</font></p>

<p><font SIZE="2">在收到讯息後,程式必须处理该讯息,若是不处理,则可直接将它交给Windows的内定处理程序来处理之,若是程式需要传回值,也可以在此时传回,Windows会将该值传回给呼叫方。如此就完成了讯息传递的程序。 
</font></p>

<p><font SIZE="2">复杂吗?一点也不!了解Windows讯息系统的运作後,我们来看看可以利用它来做些什麽有趣的事吧!</font></p>

<p align="right"><font SIZE="2"><!--webbot bot="ImageMap" rectangle=" (40,1) (71, 23)  chap41.htm" rectangle=" (4,1) (36, 23)  ../ch3/chap391.htm" src="../ch1/NextBack.gif" width="72" height="24" alt="NextBack.gif (743字节)" border="0" startspan --><MAP NAME="FrontPageMap1"><AREA SHAPE="RECT" COORDS="40, 1, 71, 23" HREF="chap41.htm"><AREA SHAPE="RECT" COORDS="4, 1, 36, 23" HREF="../ch3/chap391.htm"></MAP><a href="../../../_vti_bin/shtml.exe/program/C++/ch4/chap04.htm/map1"><img ismap usemap="#FrontPageMap1" border="0" height="24" alt="NextBack.gif (743字节)" src="../ch1/NextBack.gif" width="72"></a><!--webbot bot="ImageMap" endspan i-checksum="56250" --></font></p>
<font SIZE="2">

<p><small><a href="../../../index.htm">首页</a> &gt;&gt; <a href="../../program.htm">程序设计</a> 
  &gt;&gt; <a href="../cbuilder.htm">C++ Builder</a>&nbsp; &gt;&gt;&nbsp; </small>以C++ 
  Builder处理Windows 讯息(Message)-前言</p>
</font>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -