잡다한 정보들(기타정보)

다이얼로그박스~

케이피 2008. 5. 20. 01:22

엔터 입력시 다이얼로그박스가 종료돼지 않게!!!

엔터입력시 종료되는 이유가
OnOk() 이벤트가 발생해서
CDialog::OnOk() 함수가 호출됨~
일단 다이얼로그 박스에 버튼중에 디폴트 버튼이 있는경우
이런경우가 발생안함
디폴트 버튼에 코딩된 내용에 CDialog::OnOk(); 가 있으면 종료.
 
1. OK 버튼이 있는경우
    OK버튼의 디폴트 버튼 을 해제시킨다.(스타일에서 체크해제)
    이때는 자동으로 생성된 코드에서 CDialog::OnOk(); 를 지우면 않됨

2. OK버튼이 없는경우
    // Generated message map functions
    //{{AFX_MSG(CDictionaryDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    virtual void OnOK(){}               // <--- 이부분을 추가~
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP() 
 
* 편법
1. 기본적으로 OK버튼을 만들고 OnOK() 메시지 함수를 기본적으로 생성한다..
   단 이때 위에서 언급한 내용은 쓰지 않은것으로 가정
2. 그러면 OnOk() 함수가 만들어지고 그 안에 CDialog::OnOk(); 한줄이 자동코딩되어져 있습니다.
3. 그 한줄을 지웁니다....
4. 다이알로그에서 OK 버튼을 지우고 이벤트 메시지 함수는 그대로 둡니다...
5. OnOk() 함수에 약간의 코딩을 해줍니다...무슨 내용이 들어가냐구요?
    if(GetFocus() == GetDlgItem(IDC_EDIT1))
    {
        OnInsertBtn();
    }else if(GetFocus() == GetDlgItem(IDC_EDIT2))
    {
        OnFindBtn();
    }

대충 이런내용이 들어가면 됩니다....

무슨 이야기 인즉 EDIT1 에서 엔터를 치면 인서트버튼의 메시지함수를 호출하고,

EDIT2에서 엔터를 치면 파인트버튼의 메시지함수를 호출하고...

대게 이런 연출법을 서브클래싱

* PropertySheet 의 경우~

 BOOL CDlg::PreTranslateMessage(MSG* pMsg)
{
    if(pMsg->message == WM_KEYDOWN)
    {      
        if(pMsg->wParam == VK_RETURN)
        {  
              return 1;                  
        }
    }
    return CPropertySheet::PreTranslateMessage(pMsg);
}