2017-06-16 2 views
1

Dans une MainDialog.cpp de dialogue avec 2 contrôles modifier et 2 boutons, après ce grand answer je peux maintenant envoyer un caractère après pression sur une touche.Handler quand un gain de boîte d'édition se concentrent en C++ MFC app

Cependant, j'ai des problèmes pour implémenter les gestionnaires pour les EN_SETFOCUS pour mes deux boîtes d'édition.

Voici le code dans le fichier source

#include "afxdialogex.h" 

IMPLEMENT_DYNAMIC(CMainDialog, CDialogEx) 

CMainDialog::CMainDialog(CWnd* pParent): CDialogEx(IDD_MAIN_DIALOG, pParent) 
{ 
} 

CMainDialog::~CMainDialog() 
{ 
} 

void CMainDialog::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialogEx::DoDataExchange(pDX); 

    DDX_Control(pDX, IDC_EDITCONTROL_A, m_editControlA); 
    DDX_Control(pDX, IDC_EDITCONTROL_B, m_editControlB); 
    DDX(Control(pDX, IDC_MFCBUTTON_KEY_X, m_buttonKeyX); 
    DDX(Control(pDX, IDC_MFCBUTTON_KEY_Y, m_buttonKeyY); 
} 

BEGIN_MESSAGE_MAP(CMainDialog, CDialogEx) 
    ON_EN_CHANGE(IDC_EDITCONTROL, &CMainDialog::OnEnChangeEditA) 
    ON_BN_CLICKED(IDC_MFCBUTTON_KEY_X, &CMainDialog::OnBnClickedButtonX) 
    ON_BN_CLICKED(IDC_MFCBUTTON_KEY_Y, &CMainDialog::OnBnClickedButtonY) 
END_MESSAGE_MAP() 

void CMainDialog::OnBnClickedButtonX() 
{ 
    m_dialog_lastFocused ->PostMessageW(WM_CHAR, _T('X')); 
} 

void CMainDialog::OnBnClickedButtonY() 
{ 
    m_dialog_lastFocused ->PostMessageW(WM_CHAR, _T('Y')); 
} 

Et les définitions de variables dans le fichier d'en-tête:

CWnd* m_dialog_lastFocused = nullptr; 
CEdit m_editControlA; 
CEdit m_editControlB; 
CMFCButton m_buttonKeyX; 
CMFCButton m_buttonKeyY; 

J'ai essayé les suivantes

void CMainDialog::OnEnSetfocusEditA() 
{ 
    m_dialog_lastFocused = &m_editControlA; 
} 

mais lors de son exécution et J'appuie sur un bouton, je reçois un Exception thrown: read access violation. this->m_dialog_lastFocused was nullptr. If there is a handler for this exception, the program may be safely continued.

Quelqu'un pourrait-il me montrer ce que je manque? J'ai des connaissances de base en C++ et j'ai besoin d'aide pour configurer ces gestionnaires de focus.

[UPDATE] En debug je peux voir que le m_dialog_lastFocused = &m_editControlA; est jamais appelé quand je clique sur ce contrôle d'édition avant que j'appuie sur le bouton. Donc, il explique l'erreur nullpointer. Cependant, je ne comprends pas pourquoi le OnEnSetfocusEditA() n'est pas appelé.

+0

Vous devez savoir pourquoi '' m_dialog_lastFocused' est nullptr'. –

+0

@MichaelWalz En effet. En debug je peux voir que le 'm_dialog_lastFocused = & m_editControlA;' n'est jamais appelé même quand je clique sur ce contrôle d'édition avant que j'appuie sur le bouton. Donc, il explique l'erreur nullpointer. Cependant, je ne comprends pas pourquoi 'OnEnSetfocusEditA()' n'est pas appelé. –

Répondre

1

Il ne suffit pas d'avoir un gestionnaire, vous devez également le placer dans la table des messages.

OnEnSetfocusEditA n'est pas appelée car contrairement à OnEnChangeEditA, OnEnSetfocusEditA n'est pas dans la table des messages.

Modifier la carte du message comme indiqué ici:

BEGIN_MESSAGE_MAP(CMainDialog, CDialogEx) 
    ON_EN_SETFOCUS(IDC_EDITCONTROL, &CMainDialog::OnEnSetfocusEditA)  // <<<<< add this 
    ON_EN_CHANGE(IDC_EDITCONTROL, &CMainDialog::OnEnChangeEditA) 
    ON_BN_CLICKED(IDC_MFCBUTTON_KEY_X, &CMainDialog::OnBnClickedButtonX) 
    ON_BN_CLICKED(IDC_MFCBUTTON_KEY_Y, &CMainDialog::OnBnClickedButtonY) 
END_MESSAGE_MAP() 
+0

Erreur embarrassante de ne pas l'inclure sur la carte de message .. Merci de le signaler. –