SetWindowLong设置‘自定义消息处理函数’问题
我想 Panle 能处理 WM_RBUTTONDBLCLK 消息(鼠标右键双击),
使用SetWindowLong修改Panel的窗体消息处理函数为‘自定义消息处理函数’。
修改是修改成功了,可惜 —— 我捕获不到 …… 大侠们帮帮忙,谢谢先!!!
程序原代码如下:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
void *OldProc; // 保存旧的消息处理函数地址入口
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SaveOldWinProc(HWND hWnd)
{
//获取 旧的消息处理函数的地址入 OldProc 中
//窗体虚构(解构)前还原
OldProc = (void*)::GetWindowLong(hWnd,GWL_WNDPROC);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SetNewWinProc(HWND hWnd)
{
//得到自定义消息函数的内存地址
void *ObjectInst=::MakeObjectInstance(NewProc);
//设置 对象的消息处理函数为自定义消息处理函数
::SetWindowLong(hWnd,GWL_WNDPROC,(long)ObjectInst);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SetOldWinProc(HWND hwnd)
{
//还原消息处理函数,利用全局变量 OldProc
if(OldProc != NULL)
{
::SetWindowLong(hwnd,GWL_WNDPROC,(long)OldProc);
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//保存 Panel1 的消息处理函数地址
SaveOldWinProc(Panel1->Handle);
//设置 Panel1 的消息处理函数地址为 自定义函数
SetNewWinProc(Panel1->Handle);
}
//-------------------------------------------------------------
void __fastcall TForm1::NewProc(TMessage &Msg)
{
//自定义消息处理函数
switch (Msg.Msg)
{
case WM_LBUTTONDOWN://左击
ShowMessage("my left btn down");
break;
case WM_RBUTTONDBLCLK://右键双击
ShowMessage("my right btn db_clk");
break;
case WM_LBUTTONDBLCLK://双击
ShowMessage("my left btn db_clk");
break;
case WM_MOUSEMOVE:
ShowMessage("Mouse Move");
break;
default:
ShowMessage("......");//总是在这里~! 晕倒
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
SetOldWinProc(Panel1->Handle);//还原 消息处理函数
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
SetOldWinProc(Panel1->Handle);//还原消息处理函数,否则虚构(解构)不成功
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Panel1Click(TObject *Sender)
{
ShowMessage("Panel1 OnClick");//Panel1 的OnClick 事件
}
//---------------------------------------------------------------------------
我估计是 自己定义消息处理(NewProc 函数)的时候,switch 写得不对,
但不知道该怎么写,才能捕获 WM_RBUTTONDBLCLK 消息