알립니다. 이 글은 '데브피아 강좌&팁' 게시판에 올라온 글로, 본 글의 저작권은 글의 작성자인 권진호님에게 있습니다.
이전의 IDC_EDIT9 에디트가 글자가 빨강 색으로 나오는걸 타겟으로 잡았다.
다아일로그에서 클래스 위저드를 띄운 후..
1. PreTranslateMessage 이벤트 핸들러를 추가한다.
2. Object IDs: IDC_EDIT9를 선택하고 EN_CHANGE 이벤트 핸들러를 추가한다.
그리고 코드를 다음과 같이 수정한다.
HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
switch(nCtlColor)
{
case CTLCOLOR_EDIT:
{
if(pWnd->GetDlgCtrlID() == IDC_EDIT9)
{
pDC->SetTextColor(RGB(255, 0, 0));
pDC->SetBkMode(TRANSPARENT);
pDC->SelectStockObject(NULL_BRUSH);
return NULL;
}
}
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
BOOL CSssDlg::PreTranslateMessage(MSG* pMsg)
{
if(::GetDlgCtrlID(pMsg->hwnd) == IDC_EDIT9)
{
// 에디트 컨트롤 IDC_EDIT9 번의 이벤트 중에서 아래 이벤트가 발생하면
// 에디트 컨트롤 영역만큼 부모 윈도우의 화면을 갱신한다.
switch(pMsg->message)
{
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_KILLFOCUS:
{
CRect rc;
CWnd* pWnd = GetDlgItem(IDC_EDIT9);
pWnd->GetWindowRect(rc);
ScreenToClient(rc);
InvalidateRect(rc);
}
}
}
return CDialog::PreTranslateMessage(pMsg);
}
// 이 것을 PreTranslateMessage 에서 처리하지 못하는 이유는
// 이벤트를 잡을 수 없기 때문이다.
// 이 전체 기능을 CEdit서브클래싱하여 구현하여 놓은 것이 플젝사이트의 샘플이라고 봐도 무방하다.
void CSssDlg::OnChangeEdit9()
{
// 에디트 컨트롤에서 글자에 변화가 생기면.
// 에디트 컨트롤 영역만큼 부모 윈도우의 화면을 갱신한다.
CRect rc;
CWnd* pWnd = GetDlgItem(IDC_EDIT9);
pWnd->GetWindowRect(rc);
ScreenToClient(rc);
InvalidateRect(rc);
}
이것도 매우 잘됩니다. 클래스 추가하는 것보다 이게 훨 나은거 같아 보여서 이렇게 올립니다.
댓글 없음:
댓글 쓰기