高分求教——消息处理问题

gqxs 2003-11-20 05:43:49
我想实现一个功能:
如果在一个窗体上有3个按钮ba,bb,bc;
我想当点击了三个按钮中的一个后,在每个按钮的触发事件之前获知是哪个按钮被点击了?求BCB的消息机制对该功能的实现。
...全文
25 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
gqxs 2003-11-28
  • 打赏
  • 举报
回复
希望大家以后继续多多支持!
谢谢大家了,马上给分。
Lewolf 2003-11-27
  • 打赏
  • 举报
回复
晕那

“哪个按钮被点击了”是一个瞬间状态,不会持续的,当你点击消息处理完毕的时候,这个按钮已经弹回来了,“按钮被点击了”这个事实就不存在了,你在什么时候去判断“被点击”?

如果是要监视按钮动作,当然是实用钩子了,在一般的程序中,我觉得没有这个必要吧。
gqxs 2003-11-27
  • 打赏
  • 举报
回复
请问在下边的消息结构中,包含了该消息是向那个窗体或那个控件发送的消息吗?

TMessage represents a Windows message.

Unit

Messages

struct TMessage

{
Cardinal Msg;
union
{
struct
{
Word WParamLo;
Word WParamHi;
Word LParamLo;
Word LParamHi;
Word ResultLo;
Word ResultHi;

};
struct
{
int WParam;
int LParam;
int Result;
};

};
} ;

gqxs 2003-11-24
  • 打赏
  • 举报
回复
谢谢大家了。
不过我有个提议,能不能用到BCB自己的机制来完成这件事情?因为BCB是知道你点击了那个按钮,并且去执行相应按钮的点击事件,BCB自己是怎么做到的???
那位高手能回答,我加分相送!
nj_draker 2003-11-22
  • 打赏
  • 举报
回复

先用A窗口函数判断出,然后发送消息给B窗口!
nightfallrove 2003-11-22
  • 打赏
  • 举报
回复
被季老大说完了,
不过为什么不在点击事件里面写代码呢?
比如:
onClick()
{
SendMessage(Formb->Handle,........);
}
jishiping 2003-11-22
  • 打赏
  • 举报
回复
使用 WH_CALLWNDPROC 钩子就可以了。

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------
static HHOOK hHook = NULL;
static LRESULT CALLBACK GetMsgProc(int code,
WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT * pMsg = (CWPSTRUCT *)lParam;
if (code < 0)
CallNextHookEx(hHook, code, wParam,
lParam);
else if(code==HC_ACTION && pMsg->message
==WM_COMMAND) {
TButton* Btn = dynamic_cast<TButton*
>(FindControl((HWND)pMsg->lParam));
if (Btn != NULL) {
MessageBox(0, Btn->Caption.c_str(),
Btn->Name.c_str(), MB_OK);
}
}
return 0;
}

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
hHook = SetWindowsHookEx(WH_CALLWNDPROC,
(FARPROC)GetMsgProc, 0, GetCurrentThreadId());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
if (hHook!=NULL) UnhookWindowsHookEx(hHook);
}
猛禽 2003-11-21
  • 打赏
  • 举报
回复
在A的点击事件响应中向B发消息
  • 打赏
  • 举报
回复
我记得按钮的消息实在command中有细划分出来的,你可以在消息处理函数之前截获command消息
这个消息带有按钮消息的id
gqxs 2003-11-21
  • 打赏
  • 举报
回复
不好意思,可能我没有说清楚。我对窗口A的哪个按钮被点击了的判断可能是在另一个窗口B中进行判断的,所以可能用不了sender。我希望能在一个多窗口程序中知道那个窗口的那个按钮正在被点击了,但是不能在该按钮中加入代码进行判断。个人觉得用消息机制应该能完成。
先谢谢楼上两位了!希望那位不承赐教。
constantine 2003-11-21
  • 打赏
  • 举报
回复
是可以,不过如果整个过程都要监视,那不是很浪费资源。
还是用消息吧!不同按键,你就发送不同的消息。
sfemil 2003-11-21
  • 打赏
  • 举报
回复
1 安装一个监视当前进程的钩子SetWIndowsHook 钩子类型为WH_CALLWNDPROC
2 在钩子处理函数中 过滤消息 只处理click消息.根据消息的HWND得到窗体(按钮) 再获得其
父窗体(窗口)
gqxs 2003-11-21
  • 打赏
  • 举报
回复
希望,求教不再触发按钮中加代码的方法。
freshman2003 2003-11-20
  • 打赏
  • 举报
回复
楼上的说得没错,判断sender然后根据sender来响应事件就可以了。可以用TActionList。
xu_xinyu 2003-11-20
  • 打赏
  • 举报
回复
个人认为用sender应该可以实现。

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧