프로그래밍 노트

[MFC]다이얼로그에서 Enter키나 ECS키를 눌러 프로그램을 종료안되게 하기 본문

MFC TIP

[MFC]다이얼로그에서 Enter키나 ECS키를 눌러 프로그램을 종료안되게 하기

띠리 2007. 4. 24. 20:19
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;






Comments