2017-03-05 12 views
0

, 나는이 같은 짓을했는지 :는 ES_PASSWORD 스타일로 편집 컨트롤에 사각형을 그릴 수있어? 내가 컨트롤의 주위에 사각형 roundend을 그리는 시도하고

enter image description here

을하지만 난 변경하는 경우 :

LRESULT CALLBACK WindPorc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) 
{ 
    case WM_CTLCOLOREDIT: 
    { 
     // device handle 
     HDC Chdc = (HDC)wparam; 
     // handle to control 
     HWND CHand = (HWND)lparam; 

     // new object pen... 
     HPEN penx = CreatePen(PS_SOLID, 5, RGB(0, 255, 255)); 


     // apply pen to device handle and back up the original handle 
     HGDIOBJ objb = SelectObject(Chdc, penx); 

     // auto... 
     RECT rectx; 
     GetClientRect(CHand, &rectx); 

     // Now draw the rect with round borders... 
     RoundRect(Chdc, (rectx.left -2), (rectx.top - 2), (rectx.right + 2), (rectx.bottom + 2), 5, 5);  

     // reset device hand... 
     SelectObject(Chdc, objb); 

     // Set text color... 
     SetTextColor(Chdc, RGB(0, 255, 255)); 


     // clean up... 
     DeleteObject(penx); 
     DeleteObject(objb); 


     // I should return a brush for the bk, but this don't care now... 
     //return; 
    } 

} 


void InitUI() 
{ 
    // just the edit control, isn't need the RegisterClass etc... 

     HWND Edit1 = CreateWindowEx 
     (
     NULL, 
     L"EDIT", 
     NULL, 
     WS_CHILD | WS_VISIBLE | 
     ES_LEFT | ES_MULTILINE, // Just a demonstration, it should be ES_PASSWORD 
     10, 120, 200, 22, 
     winx, // parent window HWND... 
     (HMENU)TEXTBOX_1, // id 
     (HINSTANCE)GetWindowLong(winx, GWL_HINSTANCE), 
     NULL 
     ); 
} 

확인을,이 다음과 같을 것

enter image description here

: CreateWindowEx(); ES_PASSWORD에 가장자리에 스타일이 이런 일을 남겨두고 사라

왜 사라합니까?

답변

0

나는 구현은 여러 가지 방법으로 잘못 말할 것이다 : 당신은 부모 창의 (대화의)에 그리려는 동안

  • Chdc이 만 편집 컨트롤의 클라이언트 영역에 그릴 수있는 DC입니다 클라이언트 영역. 사각형에 ... 편집 컨트롤 자체가 상대적으로
  • GetClientRect()는 항상 왼쪽 상단 코너 (0,0)를 반환합니다.
  • WM_CTLCOLOREDIT이 사각형을 그릴 수있는 가장 좋은 장소가 될 수 없습니다, 당신은이 메시지가 실제로 호출 될 때 확인하려면 몇 가지 테스트를 확인해야합니다.

당신이 구현이 방법을 유지하고자하는 경우, 당신은해야한다 :

  • 는 부모 윈도우의 DC가 아닌 편집 컨트롤의 하나를 사용하여 그립니다. 만드는
  • 대신 GetClientRect() 전화 GetWindowRect()의 다음 ScreenToClient()
  • 는 부모 윈도우의 클라이언트 영역을 기준으로 조정합니다.
  • 는 부모 윈도우의 DC를 얻기 위해 WM_PAINT 메시지 (그리고 BeginPaint()/EndPaint() 기능)를 사용합니다.

나는 소유자가 그린 정전기 제어, 어떻게 든 배치 편집 컨트롤보다 큰 몇 몇 픽셀, "주위에"편집 컨트롤 (즉 확인하기 위해 WS_CLIPSIBLINGS 스타일을 설정 생성하지만 다른 구현을 고려할 것 편집 컨트롤은 정적 컨트롤의 맨 위에 위치합니다.) WM_DRAWITEM 메시지를 처리하여 도면을 수행해야합니다. 나는이 구현이 더 강력하다고 생각한다.