2014-10-01 57 views
0

我在我的基於MFC對話框的應用程序中創建了一個新的對話框。新的對話框包含5個控制按鈕。MFC-接收按鈕單擊消息失敗

發生以下情況,我不明白爲什麼?

  1. 點擊buttonX。 (結果ok,OnBnClicked消息發送)
  2. 點擊應用程序的任何地方,但不在對話框中。(從對話框中移除焦點)
  3. 再次點擊buttonX(失敗,OnBnClicked消息未發送)。但是如果我點擊對話框中的任何其他按鈕(結果ok,發送OnBnClicked消息)。

當我做:

  1. ...
  2. ...
  3. 單擊對話框區域只是再次重新
  4. 點擊buttonX將焦點設置在對話框上。 (結果ok,發送OnBnClicked消息)

**我需要做的第3步,只有當我想再次點擊buttonX!爲什麼?? 我認爲它與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 風格DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION 「工具」 FONT 8, 「MS殼牌DLG」,400,0,爲0x1 BEGIN PUSHBUTTON 「媒體& Foreward」,IDC_MEDIA_FOREWARD_BUTTON,7,79,37,36,BS_MULTILINE PUSHBUTTON 「&媒體&落後」 ,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 | NOT WS_VISIBLE PUSHBUTTON 「胡德」 號,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

這段代碼沒有什麼明顯的錯誤。唯一有趣的是,當代碼中只有4個時,你說你有5個按鈕。 – 2014-10-01 12:31:43

+1

你可以發佈IDC後面的數字 - 常量嗎?有時候我有無法解釋的問題,當這些自動生成的數字在某個系統值的某個區域。只是一個想法..... – Albi 2014-10-01 12:41:11

+0

什麼按鈕失敗?並且,嘗試使用Spy ++來確定誰在處理按鈕點擊。 – rrirower 2014-10-01 12:52:17

回答

0

我看到你填圖與對話內容。你有沒有把重點放在對話上?我認爲這種神祕的行爲只發生在你的對話框中的第一次鼠標點擊(然後對話獲得焦點)。我只是猜測:)

+0

我試過了,它沒有奏效。謝謝 – user3455965 2014-10-02 12:43:45

+0

只是自己打這個。首先點擊一個CMFCButton控件,當它不在焦點時被忽略。我的代碼已經在使用CMFCButton類的子類。通過將SetFocus添加到OnLButtonDown消息處理程序來解決此問題。找不到關於此按鈕焦點通知問題的任何文檔。 – 2018-01-19 10:28:20