MFC 怎么确定产生消息的控件


假设我在一个对话框中绘制了3个BUTTON,随便点击一个,那么MFC怎么确定被点击的BUTTON?
如果我绘制了多个窗口,每个窗口有多个BUTTON,这时随意点击任一个BUTTON,又是怎么确定被点击的BUTTON?
如果多个BUTTON之间发生重叠,点击事件为隐藏该BUTOON,这样的情况下MFC怎么确定被点击的BUTTON?

mfc C++

多多良小傘 11 years, 6 months ago

LZ可以看下教程,如果手工添加一个消息响应,就会知道具体的流程了,一共分三步。说一下其中很重要的一步也是很关键的一步。就是消息映射宏。
例如下面一个例子,我给一个IDC_BUTTON1的按钮添加一个BCN_DROPDOWN的消息,然后关联的消息响应函数是在CMFCTestDlg类中的OnBnDropDownButton1函数中。

   
  BEGIN_MESSAGE_MAP(CMFCTestDlg, CDialogEx)
  
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_NOTIFY(BCN_DROPDOWN, IDC_BUTTON1, &CMFCTestDlg::OnBnDropDownButton1)
END_MESSAGE_MAP()

这是一个连接的地方,其中还有两个就是消息响应函数的声明和定义了。
发送的每个消息都是一个MSG结构变量,这个结构为

   
  typedef struct tagMSG
  
{
HWND hwnd;//消息指向的窗口句柄
UINT message;//消息类型ID,(与控件类型无关)
WPARAM wParam;//这个和下面的是消息参数,与具体消息类型有关
LPARAM lParam;
DWORD time;//消息进入队列的时间
POINT pt;//消息产生时的鼠标位置
} MSG;

其中,每个字段的作用已经在里面标注了。

------------------关于LZ在评论中问题的补充---------------------------
在新建一个窗口之后,会维护一个消息队列。

   
  while(GetMessage(&msg, NULL, 0, 0))
  
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

就是不停的GetMessage。如果get到了,就放到消息队列里等待处理。这个msg是由鼠标或者键盘输入产生的,意思就是每当一个消息产生的时候,都会被操作系统处理成一个MSG结构,然后GetMessage就可以获取了。至于这个MSG具体是怎么产生的windows没有给出代码了。GetMessage声明在winuser.h里面,没有给出实现,所以也无法参考。不过大概的理论是这样,其中细节每个人自己理解吧。

酱油会有D answered 11 years, 6 months ago

Your Answer