📄 bcb_a14.htm
字号:
<p><font color="#000000"> 假定表单名为MainForm,设置MainForm::OnCreate()函数:</font> </p>
<p><font color="#000000"> 1. 用GetSystemMenu(MainForm->Handle,false)取得系统菜单句柄;</font>
</p>
<p><font color="#000000"> 2. 用AppendMenu,DeleteMenu,ModifyMenu函数修改系统菜单,把新的ID号赋于自定义的菜单项。
<br>
这时运行程序,可以看到系统菜单也被修改,但自定义的菜单项却不能被响应。</font>
</p>
<p><font color="#000000">二、拦截WM_SYSCOMMAND消息以响应自定义的菜单项 <br>
在表单头文件内(如Unit1.h)</font> </p>
<p><font color="#000000"> 1. 在表单类定义末尾加入消息响应表,取得WM_SYSCOMMAND消息的处理权 <br>
BEGIN_MESSAGE_MAP <br>
MESSAGE_HANDLER(WM_SYSCOMMAND,TMessage,OnWMSysCommand) <br>
END_MESSAGE_MAP(TForm)</font> </p>
<p><font color="#000000"> 2. 在表单类定义的private区内加入消息处理函数声明 <br>
private: // User declarations
<br>
void __fastcall OnWMSysCommand(TMessage& Message);</font> </p>
<p><font color="#000000"> 在表单文件内(如Unit1.h)</font> </p>
<p><font color="#000000"> 3. 写出消息响应函数 <br>
void __fastcall TForm1::OnWMSysCommand(TMessage& Message) <br>
{ <br>
if(Message.WParam==ID_SysMenu_MyItem) <br>
{ <br>
// Your Code Here, Do Something <br>
} <br>
TForm::Dispatch(&Message); <br>
} <br>
</font> </p>
<p><font color="#000000">三、完整程序示例</font> </p>
<p><font color="#000000">实例二:给跟踪栏增加OnStartTrack和OnEndTrack事件</font> </p>
<p><font color="#000000"> 当跟踪栏用于进度控制时,OnStartTrack和OnEndTrack很可能是你需要的事件。比如在控制多媒体播放进度的场合,当用户移动滑块时,你需要OnStartTrack事件让播放停止,需要OnEndTrack事件定位新的播放位置。但Borland公司没有提供这两个事件,我等编程爱好者只好自力更生,打拦截Windows消息的主意了。</font>
</p>
<p><font color="#000000">一、拦截WM_HSCROLL消息,给跟踪栏增加OnStartTrack和OnEndTrack事件</font> </p>
<p><font color="#000000">在表单头文件内(如Unit.h)</font> </p>
<p><font color="#000000"> 1. 在表单类定义末尾加入消息响应表,把WM_HSCROLL消息处理权交给OnWMHScroll函数。
<br>
BEGIN_MESSAGE_MAP <br>
MESSAGE_HANDLER(WM_HSCROLL,TMessage,OnWMHScroll) <br>
END_MESSAGE_MAP(TForm)</font> </p>
<p><font color="#000000"> 2. 在表单类定义的private区内加入OnWMHScroll函数声明。 <br>
private: // User declarations
<br>
void __fastcall OnWMHScroll(TMessage &Message); <br>
</font> </p>
<p><font color="#000000"> 3. 在表单类定义的private区内加入StartTrack和EndTrack函数声明。 <br>
private: // User declarations
<br>
void __fastcall TrackBar1StartTrack(TObject *Sender); <br>
void __fastcall TrackBar1EndTrack(TObject *Sender);</font> </p>
<p><font color="#000000"> 在表单文件内(如Unit.cpp)</font> </p>
<p><font color="#000000"> 4. 写出OnWMHScroll函数,使它能根据消息参数调用StartTrack和EndTrack函数,在实际意义上产生OnStartTrack和OnEndTrack事件。</font>
</p>
<p><font color="#000000"> 5. 写出StartTrack和EndTrack函数。</font> </p>
<p><font color="#000000"> 如果是垂直跟踪栏,把上面的WM_HSCROLL改为WM_VSCROLL即可。</font>
</p>
<p><font color="#000000">二、完整程序示例</font> </p>
<p><font color="#000000">尾声</font> </p>
<p><font color="#000000">Borland C++ Builder编程中,拦截Windows消息是一项高级编程技术,能让你尽量挖掘Windows的潜力,尤其让曾用API编程的程序员感到心慰。拦截Windows消息是API尽情发挥的舞台,当VCL不能为你做什么时,请想起底层的API。</font>
</p>
<p align=center><font color="#000000"> </font></p>
</td>
</tr>
</table>
<br>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -