我在Dlg1上添加了另外一个Dlg2.将Dlg2设置成Dlg1的子窗口(Dlg2覆盖Dlg1)。
在Dlg1上有一些Button。我又将这些Button在创建的时候设置成Dlg2的子窗口(Button覆盖Dlg2)。
问题:在Dlg1的消息映射ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart),但是在Dlg1中的OnButtonStart()函数在点击的时候没有响应。
我在Dlg1中的:PreTranslateMessage(MSG* pMsg)函数中可以知道Button的区域被点击从而显示调用OnButtonStart()。有没有方法直接通过ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart)可以使Button的点击能被响应呢?谢谢!

解决方案 »

  1.   

    Dlg2中添加消息响应...再转发给Dlg1
      

  2.   

    Button在创建的时候设置成Dlg2的子窗口,那么点击消息BN_CLICKED是发送给Dlg2的。在Dlg2的PreTranslateMessage中判断
    WM_COMMAND消息的notification code是BN_CLICKED,把这个消息发送给Dlg1。
      

  3.   

    我试过了在Dlg2中捕捉不到其子窗口(也就是Button)的点击消息。在Dlg1中也捕捉不到。
    哪里能捕捉到BN_CLICKED消息?因为我不想用PreTranslateMessage在Dlg1中抓消息  在判断位置判断是哪个Button被点击了。我想直接捕捉Button被点击后的消息。谢谢!
      

  4.   

    我试过了在Dlg2中捕捉不到其子窗口(也就是Button)的点击消息。在Dlg1中也捕捉不到。
    哪里能捕捉到BN_CLICKED消息?因为我不想用PreTranslateMessage在Dlg1中抓消息  在判断位置判断是哪个Button被点击了。我想直接捕捉Button被点击后的消息。谢谢!
      

  5.   

    Button是怎么创建的?怎么指定的父窗口?
      

  6.   

    程序初始化的时候创建了Dlg2(继承自CWnd)用来显示地图(处于Hide状态)。在界面切换到Dlg1(继承自CDialog)的时候,在Dlg1的OnInitDialog()中将Dlg2设置成Dlg1的子窗口。
    CMapCanvas* pMapCanvas=CMapCanvas::GetCanvas();
    pMapCanvas->SetParent(this);
    pMapCanvas->ShowWindow(SW_SHOW);
    然后接着在Dlg1的OnInitDialog()中创建Button。
    SetRect(rect, 8, 388, 74, 62);
    m_ButtonDisplay.Create(IDS_DISP, rect, this, IDC_BUTTON_START, 
    CResourceManager::RMB_NAVI_74X62_N, 
    CResourceManager::RMB_NAVI_74X62_P,
    CResourceManager::RMB_NAVI_74X62_N,
    CResourceManager::RMR_ROUND_RECT_74X62,
    CSkinButton::CENTER,
    CResourceManager::RMB_NONE,
    CResourceManager::RMF_MEDIUM);
    m_ButtonDisplay.SetParent(pMapCanvas); //Button设置成Dlg2的子窗口
    就是这样。
      

  7.   

    SetParent函数要慎用。创建按钮时直接指定父窗口。
      

  8.   

    Dlg2的style有child。
    在Creat的时候设置Button的父窗口和Creat之后再Set的效果是一样的。
    现在只能在Dlg1里面捕捉到Button的位置有ButtonDown的消息。却没有ButtonClick的消息。为什么?谢谢
      

  9.   

    问题已经解决。
    在CreatButton之后在设置Dlg2的窗口位置和设置成Dlg1的子窗口就可以了。
    谢谢大家