2014-04-30 4 views
2

사용자 입력의 유효성에 따라 배경색이 달라지는 편집 컨트롤이 있습니다.편집 컨트롤이 선택한 브러시로 완전히 다시 그려지지 않습니다.

입력이 유효한 경우 편집 컨트롤이 기본 모양을 유지해야하며, 그렇지 않으면 배경색이 밝은 회색으로 변경되어야합니다.

EN_UPDATE 처리기에서 유효성을 검사하고 유효하지 않은 경우 편집 제어 HWNDvector에 저장합니다.

비주얼 스타일을 사용할 수 있습니다.

마우스 포인터의 위치를 ​​변경하면 문제가 발생합니다. 설명해 드리겠습니다 :

  1. 편집 컨트롤을 클릭하고 입력이 잘못되었습니다.

  2. 다른 곳으로 마우스 포인터를 이동하지만 편집 컨트롤에 여전히 포커스가 있습니다.

  3. 이제 백 스페이스을 눌러 잘못된 입력을 삭제합니다.

  4. 입력이 유효 해지면 색은 적절하게 바뀌지 만 그러나 테두리는 더 두껍게/어둡게됩니다. 사용자가 잘못된 데이터 붙여 넣 때 (마우스 포인터를 회색 영역을에 입니다)enter image description here

    편집 컨트롤 : 데이터를 입력하기 전에

    편집 컨트롤 :

이 그림은 문제를 설명 :enter image description here

마지막 문자는 r입니다.

이제 경우 마우스 포인터가 (예를 들어 대화 상자의 클라이언트 영역에) 편집 컨트롤의 클라이언트 영역의 부족 및 사용자는 여기 r를 삭제 내가 무엇을 얻을 수 있습니다 : enter image description here

공지 두꺼운 테두리가.

마우스 포인터를 편집 컨트롤 위로 가져 가면 제대로 다시 그립니다. 여기

는 (필요한 경우 나는 작은 SSCCE를 제출할 수 있습니다) 관련 코드 조각입니다 :

// minimal code snippet for EN_UPDATE 
case WM_COMMAND: 
{ 
    switch(LOWORD(wParam)) 
    { 
    case IDC_MYEDIT: 
     { 
      if(HIWORD(wParam) == EN_CHANGE) 
      { 
       if(/* invalid input */) 
       { 
        // store HWND into vector 

       } 
       // InvalidateRect(...); // tried this too... 
      } 
     } 
     break; 

// minimal code snippet for WM_CTLCOLOREDIT 
case WM_CTLCOLOREDIT: 
    { 
     if(/* this control is stored in vector */) 
     { 
      //=== then this is invalid entry->paint it grey ===// 

      // Needed SetBkMode for text's background transparency 
      SetBkMode((HDC)wParam, TRANSPARENT); 
      // return light gray brush 
      return (INT_PTR)((HBRUSH)GetStockObject(LTGRAY_BRUSH)); 
     } 
     else 
      return DefWindowProc(...); // default processing 
    } 

어떻게이 문제를 해결할 수 있습니까?

답변

0

에 주어진. 난 그냥 대신 InvalidateRectRedrawWindow을 추가뿐만 아니라 다시 그려야하는 프레임을 주문 :

// minimal code snippet for EN_UPDATE 
case WM_COMMAND: 
{ 
    switch(LOWORD(wParam)) 
    { 
    case IDC_MYEDIT: 
     { 
      if(HIWORD(wParam) == EN_CHANGE) 
      { 
       if(/* invalid input */) 
       { 
        // store HWND into vector 

       } 

       // after finishing validation, redraw window INCLUDING THE FRAME 
       // This solves the problem with edges entirely 

       RedrawWindow((HWND)lParam, NULL, NULL, 
        RDW_ERASE | RDW_FRAME | RDW_INVALIDATE); 
      } 
     } 
     break; 
-1

메시지 CTLCOLOR_MSGBOX도 함께 처리하십시오. 자세한 내용은이 MSDN 문서를 참조하십시오.샘플 코드의

How to change the background color of an MFC edit control

스냅 샷은 내 문제에 대한 해결책을 발견 링크

case CTLCOLOR_EDIT: 
    case CTLCOLOR_MSGBOX: 
     // Set color to green on black and return the background 
     brush. 
     pDC->SetTextColor(RGB(0, 255, 0)); 
     pDC->SetBkColor(RGB(0, 0, 0)); 
     return (HBRUSH)(m_pEditBkBrush->GetSafeHandle()); 
+2

-1 질문에서 제공하는 코드가 이미 제안 무엇에 해당하는 코드가 포함되어 있습니다. – IInspectable