2015-01-01 6 views
5

enter image description here 저는 ES_READONLY 플래그가있는 편집 컨트롤의 색상을 변경하는 간단한 해결책을 찾으려고했습니다. 편집 컨트롤이 편집 가능한 경우 일종의 코드가 작동하지만 읽기 전용 플래그가있는 편집 컨트롤에는 영향을 미치지 않습니다.읽기 전용 편집 컨트롤의 배경색을 변경하는 것이 가능합니까?

case WM_CTLCOLOREDIT: 
{ 
    HDC hdc = (HDC)wParam; 
    //if (GetDlgItem(hwnd, IDC_EDIT_IN) == (HWND)lParam) 
    //{ 
     SetTextColor(hdc, RGB(255, 255, 255)); // Set text color to white 
     SetBkColor(hdc, RGB(255, 255, 255)); // Set background color to black 
    //} 
    return 0; 
} 
break; 

내 코드가 작동하는지 확인하기위한 의견이 있으며, 읽기 전용이 아닌 편집 컨트롤에서 수행됩니다. 내 다른 편집 컨트롤에 ES_READONLY 걸릴 경우 작동하지 않습니다. 채팅 프로그램을 만들고있어 사용자가 채팅 상자 영역에 입력하는 것을 원하지 않습니다. 그리고 읽기 전용 일 때 회색으로 표시되지만 흰색을 원합니다. 이것을 할 또 다른 방법이 있습니까? 또한 색상은 텍스트가있는 영역 만 색칠하며 편집 컨트롤의 전체 높이는 색칠하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+2

'WM_CTLCOLORSTATIC'을 보시기 바랍니다 –

+2

MSDN 기사를 읽으면 브러시를 돌려 주겠다고 말합니다. –

답변

5

브러시를 만들어 계속 추적해야합니다. 그런 다음 return 0 대신이 브러시를 코드 스 니펫에 반환합니다. 브러시가 더 이상 필요 없으면 삭제해야합니다. 이것은 보통 WM_DESTROY 메시지에 대한 응답으로 이루어집니다.

귀하의 경우에는 필자가 권장하는 스톡 브러시를 사용하여 총알을 피할 수 있습니다.

읽기 전용 모드에서 편집 컨트롤 대신 WM_CTLCOLOREDITWM_CTLCOLORSTATIC에 응답, 그래서 당신은 제대로이 메시지를 처리해야하는 경우 편집/정적 제어를 칠 때

case WM_CTLCOLORSTATIC: 
{ 
    if((HWND)lParam == GetDlgItem(hwnd, IDC_EDIT_IN)) 
    { 
     SetBkMode((HDC)wParam, TRANSPARENT); 
     SetTextColor(hdc, RGB(255, 255, 255)); 
     return (LRESULT)((HBRUSH)GetStockObject(BLACK_BRUSH)); 
     // if edit control is in dialog procedure change LRESULT to INT_PTR 
    } 
    else // this is some other static control, do not touch it!! 
     return DefWindowProc(hwnd, message, wParam, lParam); 
} 

을, 당신은 그림을 위해 3 개 개의 부품이 :

  • 텍스트 색상
  • 텍스트 배경
  • 컨트롤의 바 위해 ckground

당신이 원하는 색상 (윈도우 프로 시저에 대한 return (LRESULT)someBrush, 또는 return (INT_PTR)someBrush 대화 상자)와 브러시를 반환해야 원하는 색상으로 전체 제어를 페인트합니다.

SetBkColor에 대한 귀하의 호출은 다른 컨트롤의 배경 색상입니다 텍스트 배경의 색상을 설정합니다. 그렇기 때문에 SetBkModeTRANSPARENT 매개 변수로 지정하여 텍스트 배경이 컨트롤의 배경과 일치하도록하려는 것입니다.

재고 브러시를 추적 할 필요가 없으며 더 이상 필요하지 않은 후에도 삭제해야하기 때문에 스톡 브러쉬를 사용했습니다.

그래도 다른 색상을 원할 수도 있습니다. 여기이 경우 당신이해야 할 것입니다 :

  • 글로벌 HBRUSH 변수 또는 창/대화 과정에서 static HBRUSH 변수를 만듭니다.
  • 윈도우 프로 시저 인 경우 WM_CREATE에 대한 응답으로이 변수를 초기화합니다. 대화 상자에서 브러시를 WM_INITDIALOG으로 초기화하십시오. 예 : someBrush = CreateSolidBrush(RGB(255, 0, 255)); 자세한 정보 및 예는 documentation을 참조하십시오.
  • 위의 예에서 보셨 듯이이 브러시를 반환하십시오 (창문 절차는 return (LRESULT)someBrush, 대화 상자는 return (INT_PTR)someBrush).
  • 더 이상 필요없는 브러시를 삭제하십시오. 이것은 보통 WM_DESTROY에서 이루어지며 DeleteObject(someBrush); 호출로 이루어집니다. WM_CLOSE 가끔이 시나리오의 예를 찾기 위해 인터넷을 검색 (생략 할 수있는 반면

나는 강하게,이 창문은 항상 수신 할 메시지입니다 때문에 WM_DESTROY 대신 WM_CLOSE에 응답 삭제를 할 조언).

도움이 되었으면하는 의문점이 있으시면 도움을 요청하겠습니다. 친애하는.

+0

MSDN에서 인용 : "DeleteObject"를 호출하여 주식 개체를 삭제할 필요는 없습니다 (하지만 유해하지는 않습니다). – 0xC0000022L