2003. 6. 19. 20:44
몇일전에 질문란에 질문으로 올라왔던 에디트 컨트롤에서 ReadOnly 시켰을때 글자가 잘안보인다고,

에디트 컨트롤에 배경색을 좀 바꿨으면 한다는 글을 읽었었는데..

그때 좀 바빠서 답변을 못했었는데, 혹시라도 지금도 찾고 계실까봐 팁란에 올립니다.


다이얼로그 박스 안에 여러개의 에디트 컨트롤이 있는데...

오직 한개의 컨트롤에 다른 컨트롤과 다른 색상을 주고 싶을때...

이것을 어떻게 구현해야 할까요??

간단합니다. 아래의 예를 보시죠.. ^^;

[일반적인 예]

먼저 들어가기에 앞서.. m_Brush 즉 브러쉬를 검은색으로 잡았다고 가정하고...

ClassWizard를 이용하여, WM_CTLCOLOR 메시지에 대한 Method를 작성합니다.

HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
  
CEdit * pEdit = (CEdit *)GetDlgItem(IDC_EDIT_TEST); //에디트 컨트롤의 포인터를 얻음
  
if((nCtlColor == CTLCOLOR_EDIT) && (pEdit->GetSafeHwnd() == pWnd->GetSafeHwnd())) {
  
pDC->SetBkMode(TRANSPARENT); //백그라운드 모드를 설정
  
pDC->SetTextColor(RGB(255,255,255)); //텍스트의 색깔을 흰색으로..
  
return m_Brush; //브러시를 리턴
}

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}

nCtlColor값과 CTLCOLOR_EDIT값이 동일하고,

pEdit->GetSafeHwnd()와 pWnd->GetSafeHwnd()의 핸들이 동일할 경우에

(여기서 포인터를 비교하지 않고 핸들을 비교하는 이유는 포인터는 유동적, 즉 임시적이지만

핸들은 거의 유동적이지 않기 때문입니다.)

텍스트의 색깔을 흰색으로 처리하고 브러쉬 객체를 삭제해 줍니다.


  
[읽기 전용일때]

설정은 위에서와 마찬가지 이고...

HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
  
CEdit * pReadOnlyEdit = (CEdit *)GetDlgItem(IDC_EDIT_READONLY); //Read Only 에디트 컨트롤의 포인터
HWND hWndReadOnly = pReadOnlyEdit->GetSafeHwnd();
  
if(nCtlColor == CTLCOLOR_STATIC && hWndReadOnly == pWnd->GetSafeHwnd()) {
  
pDC->SetBkColor(RGB(0,0,0)); //배경색을 브러시와 같은 색깔로 설정
  
pDC->SetTextColor(RGB(255,255,255)); //텍스트의 색깔을 흰색으로....
  
return m_Brush; //브러쉬를 리턴
}
  
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}

백그라운드 모드를 TRANSPARENT로 두지 않고 적당한 컬러로 텍스트의 백 컬러를 설정할수 있습니다.

위에 보인 예에서 처럼요.. ^^;;

팁으로 위장한 팁이었습니다. ^^;