如何处理MFC应用程序中动态创建的控件的消息?

dav*_*dag 8 c++ mfc event-handling visual-c++

想象一下,我有一个CDialog,可以在用户单击按钮时动态创建控件.它可能是这样的:

// We don't know which is the first id for the new buttons until runtime (!)
MyDialog::MyDialog(/*whatever parameters needed*/, first_id)
  : next_id_(first_id) 
{ /*...*/ }

BOOL MyDialog::OnSomeButtonClicked()
{
  CButton* new_button = new CButton;
  new_button->Create("Caption", WS_CHILD | WS_VISIBLE, this->new_button_rect_, 
                     this, this->next_id_++);
}
Run Code Online (Sandbox Code Playgroud)

然后我的问题是:我怎么能处理来自这个按钮的消息?是否可以使用MFC消息映射工具?

该解决方案应该在vs6和vs2005中都有效.

谢谢!

dav*_*dag 7

这些是迄今为止我发现的解决方案的相关性:

  1. 使用ON_COMMAND_RANGE,如果你能确定你要处理的控件ID的范围.

  2. CWnd::PreTranslateMessage()使用收到的消息重载并执行您想要的任何操作.注意:处理按钮时,请考虑BN_CLICKED事件未发送到PreTranslateMessage但直接发送到窗口过程.

  3. CWnd::WindowProc()使用收到的消息重载并执行您想要的任何操作.请注意,在处理按钮时,这是我发现处理BN_CLICKED事件的唯一方式.

有趣的链接:

我希望这有帮助......谢谢大家的贡献.


Shi*_*C G 5

虽然您不知道id的确切值,但如果您知道ID的可能范围,则可以使用以下宏.

BEGIN_MESSAGE_MAP(MyDialog, CDialog)
    ...
    ...
    ON_COMMAND_RANGE(1000, 5000, OnButtonDynamic)
END_MESSAGE_MAP()


void MyDialog::OnButtonDynamic(UINT nID)
{

}
Run Code Online (Sandbox Code Playgroud)

这适用于1000 - 5000范围内的ID.