MFC-接收按钮单击消息失败

时间:2014-10-01 12:22:37

标签: c++ windows mfc

我在基于MFC对话框的应用程序中创建了一个新对话框。新对话框包含5个控制按钮。

以下情况发生,我不明白为什么?

  1. 点击buttonX。 (结果确定,发送OnBnClicked消息)
  2. 单击应用程序的任何位置,但不在对话框上。(从对话框中删除焦点)
  3. 再次点击buttonX(未发送FAILED,OnBnClicked消息)。但如果相反,我点击对话框中的任何其他按钮(结果确定,发送OnBnClicked消息)。
  4. 当我这样做时:

    1. ...
    2. ...
    3. 单击对话框区域,再次将焦点设置在对话框上
    4. 再次点击buttonX。 (结果确定,发送OnBnClicked消息)
    5. **只有当我想再次点击buttonX时,才需要执行第3步!为什么?? 我认为它与SetFocus()有关,但我不确定如何。

      按钮IDC是: IDC_BACK_MEDIA_PRESS_BUTTON 1180 IDC_TOOLS_LEFT_RIGHT 1024 IDC_MEDIA_FOREWARD_BUTTON 1103 IDC_MEDIA_BACKWARD_BUTTON 1104 IDC_TOOLS_HOOD_BUTTON 2346

      对话框属性为:

      IDD_TOOLS_DIALOG DIALOGEX 0,0,51,218 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 标题“工具” FONT 8,“MS Shell Dlg”,400,0,0x1 开始     PUSHBUTTON“Media& Foreward”,IDC_MEDIA_FOREWARD_BUTTON,7,79,37,36,BS_MULTILINE     PUSHBUTTON“& Media& BackWard”,IDC_MEDIA_BACKWARD_BUTTON,7,43,37,36,BS_MULTILINE     PUSHBUTTON“Back Media Press”,IDC_BACK_MEDIA_PRESS_BUTTON,7,127,37,36,BS_MULTILINE |不是WS_VISIBLE     PUSHBUTTON“Hood”,IDC_TOOLS_HOOD_BUTTON,7,7,37,36     PUSHBUTTON“左右”,IDC_TOOLS_LEFT_RIGHT,7,175,37,36 END

      我尝试了不同的风格,如工具窗口,重叠,弹出窗口。它发生在所有情况下。

      感谢您的帮助。

      .h

      class CToolsDlg : public CBDialog
      {
          DECLARE_DYNAMIC(CToolsDlg)
      
      public:
          CToolsDlg(CWnd* pParent = NULL);   // standard constructor
          virtual ~CToolsDlg();
          CToolTipCtrl m_ToolsTips;
      
      // Dialog Data
          enum { IDD = IDD_TOOLS_DIALOG };
      
      protected:
          virtual void OnCancel();
          virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
      
          DECLARE_MESSAGE_MAP()
      public:
          CMFCButton m_HoodButton;
          CMFCButton m_MediaForewardButton;
          CMFCButton m_MediaBackwardButton;
          CMFCButton m_LeftRightButton;
          virtual BOOL OnInitDialog();
          virtual BOOL PreTranslateMessage(MSG* pMsg);
      
          afx_msg void OnTimer(UINT_PTR nIDEvent);
          afx_msg void OnBnClickedCancel();
          afx_msg void OnBnClickedToolsHoodButton();
          afx_msg void OnBnClickedMediaForewardButton();
          afx_msg void OnBnClickedMediaBackwardButton();
          afx_msg void OnBnClickedLeftRightButton();
          afx_msg void OnBnClickedBackMediaPressButton();
      };
      

      的.cpp

      IMPLEMENT_DYNAMIC(CToolsDlg, CBDialog)
      
      CToolsDlg::CToolsDlg(CWnd* pParent /*=NULL*/)
      : CBDialog(CToolsDlg::IDD, pParent)
      {
      
      }
      CToolsDlg::~CToolsDlg()
      {
      }
      void CToolsDlg::DoDataExchange(CDataExchange* pDX)
      {
          CBDialog::DoDataExchange(pDX);
          DDX_Control(pDX, IDC_TOOLS_HOOD_BUTTON,     m_HoodButton);
          DDX_Control(pDX, IDC_MEDIA_FOREWARD_BUTTON, m_MediaForewardButton);
          DDX_Control(pDX, IDC_MEDIA_BACKWARD_BUTTON, m_MediaBackwardButton);
          DDX_Control(pDX, IDC_TOOLS_LEFT_RIGHT,      m_LeftRightButton);
      }
      
      
      BEGIN_MESSAGE_MAP(CToolsDlg, CBDialog)
          ON_WM_CLOSE()
          ON_WM_DESTROY()
          ON_WM_TIMER()
          ON_BN_CLICKED(IDC_TOOLS_HOOD_BUTTON, &CToolsDlg::OnBnClickedToolsHoodButton)
          ON_BN_CLICKED(IDC_MEDIA_FOREWARD_BUTTON, &CToolsDlg::OnBnClickedMediaForewardButton)
          ON_BN_CLICKED(IDC_MEDIA_BACKWARD_BUTTON, &CToolsDlg::OnBnClickedMediaBackwardButton)
          ON_BN_CLICKED(IDC_TOOLS_LEFT_RIGHT, &CToolsDlg::OnBnClickedLeftRightButton)
          ON_BN_CLICKED(IDC_BACK_MEDIA_PRESS_BUTTON, &CToolsDlg::OnBnClickedBackMediaPressButton)
      END_MESSAGE_MAP()
      
      
      // CToolsDlg message handlers
      
      BOOL CToolsDlg::OnInitDialog()
      {
          CBDialog::OnInitDialog();
      
          // Window position
          //////////////////////////////////////////////////////////////////////////
          CMainFrame* mf =  (CMainFrame*)AfxGetMainWnd();
          RECT MFwinRect;
          RECT ThiswinRect;
          CWnd* fv = mf->m_wndSplitter.GetView( mf->m_wndSplitter.GetCurrentViewIndex(0,0) );
          fv->GetWindowRect(&MFwinRect);
          GetWindowRect(&ThiswinRect);
          MoveWindow(
              MFwinRect.right - (ThiswinRect.right - ThiswinRect.left) - 14,  // X
              MFwinRect.top + 14,                                             // Y
              (ThiswinRect.right - ThiswinRect.left),                         // nWidth
              (ThiswinRect.bottom - ThiswinRect.top) );                       // nHeight
      
          // Set controls state
          //////////////////////////////////////////////////////////////////////////
          m_ToolsTips.Create(this);
          m_ToolsTips.AddTool(&m_HoodButton,          TOOLTIP_HOOD_BUTTON);
          m_ToolsTips.AddTool(&m_MediaForewardButton, TOOLTIP_MEDIA_FOREWARD_BUTTON);
          m_ToolsTips.AddTool(&m_MediaBackwardButton, TOOLTIP_MEDIA_BACKWARD_BUTTON);
          m_ToolsTips.AddTool(&m_LeftRightButton,     TOOLTIP_LEFT_RIGHT_BUTTON);
          m_ToolsTips.SetDelayTime(1000);
          m_ToolsTips.Activate(BARAK_PREFS->m_Params.m_bShowToolTips);
      
          // Main timer loop (no need for now)
          // SetTimer( 1, 1000, NULL );
          return TRUE;
      }
      
      BOOL CToolsDlg::PreTranslateMessage(MSG* pMsg)
      {
          m_ToolsTips.RelayEvent(pMsg);
      
          return CBDialog::PreTranslateMessage(pMsg);
      }
      
      void CToolsDlg::OnCancel()
      {
          // When closing the window, destroy it and not only hide (its a floating window).
          DestroyWindow();
      }
      
      void CToolsDlg::OnTimer(UINT_PTR nIDEvent)
      {
          CBDialog::OnTimer(nIDEvent);
      }
      
      void CToolsDlg::OnBnClickedToolsHoodButton()
      {
          ...
      }
      
      void CToolsDlg::OnBnClickedMediaForewardButton()
      {
          ...
      }
      
      void CToolsDlg::OnBnClickedMediaBackwardButton()
      {   
          ...
      }
      
      void CToolsDlg::OnBnClickedLeftRightButton()
      {
          ...
      }
      
      void CToolsDlg::OnBnClickedBackMediaPressButton()
      {
          ...
      }
      

1 个答案:

答案 0 :(得分:0)

我看到你正在用对话框内容填充视图。你把焦点放在对话框上吗?我认为这种神秘的行为只发生在对话框中的第一次鼠标点击(然后对话框获得焦点)。我只是猜测:)