이것을 막으려면 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;
출처 : http://wwwi.tistory.com/tag/PreTranslateMessage
'# IT, Computer Science > MFC, API' 카테고리의 다른 글
MFC 트레이 아이콘 등록 및 윈도우 감추기 (0) | 2010.09.07 |
---|---|
[MFC] OpenUrl을 이용하여 http소스 읽기 (0) | 2010.09.07 |
dialog간 변수 참조 (0) | 2010.08.14 |
내 컴퓨터의 아이피주소를 얻는 함수 (0) | 2010.07.25 |
Service 프로그램 (0) | 2010.06.27 |