[MFC]다이얼로그에서 Enter키나 ECS키를 눌러 프로그램을 종료안되게 하기
이것을 막으려면 PreTranslateMessage를 쓰면 가능하다.
PreTranslateMessage를 쓰려면 ***Dlg.h에서 밑에 있는 노랑상자에 있는 코드를 추가한다.
class CTestDlg : public CDialog
{
// 생성입니다.
public:
CTestDlg (CWnd* pParent = NULL); // 표준 생성자입니다.
virtual BOOL PreTranslateMessage(MSG* pMsg);
// 대화 상자 데이터입니다.
enum { IDD = IDD_TEST_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
// 구현입니다.
protected:
HICON m_hIcon;
// 생성된 메시지 맵 함수
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
};
***Dlg.cpp파일에서 노랑 상자에 있는 코드를 추가한다.
BOOL CsandglassDlg::PreTranslateMessage(MSG* pMsg)
{
switch(pMsg->message)
{
// 키가 눌렸을때
case WM_KEYDOWN:
switch(pMsg->wParam)
{
// 리턴키\tab
case VK_RETURN:
return TRUE;
// ESC키
case VK_ESCAPE:
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
위와 같은 코드를 추가하면 대화 상자 기반의 프로그램에서 Enter키나 ECS키로 프로그램이 종료되지않게 할 수 있다.
■ PreTranslateMessage
PreTranslateMessage의 설명을 보면 윈도우 메세지가 TranslateMessage나 DispatchMessage에 전해지기 전에 처리할 필요가 있을때 사용되어진다.
윈도우 메세지가 발생되면 TranslateMessage나 DispatchMessage에 가기전에 PreTranslateMessage를 거치게 된다.
PreTranslateMessage는 메세지 맵을 사용할 수 있다.
윈도우 메세지가 각 컨트롤에 전해지기 전에 그 메세지를 얻을 수 있다.
virtual BOOL PreTranslateMessage(
MSG *pMsg
);
pMsg : 처리하는 메세지를 포함한 MSG 구조체의 포인터
이 포인터에는 메세지를 보내쪽의 윈도우 핸들과 보내온 메세지등의 정보가 저장된다.
MSG구조체
typedef struct tagMSG {
HWND hwnd; // 메세지를 건내받는 윈도우의 핸들
UINT message; // 메세지 번호(WM_RBUTTONDOWN등)
WPARAM wParam; // 메세지의 부가 정보
LPARAM lParam; // 메세지의 부가 정보
DWORD time; // 메세지가 포스트된 시간
POINT pt; // 메세지가 포스트되었을 때의 커서위치(스크린 좌표)
} MSG;