2011-03-11 9 views
3

Windows에서 uxTheme 라이브러리를 사용하여 내 자신의 사용자 지정 컨트롤을 그리는 데 놀고 있는데 왜 내 컨트롤이 (보통) Windows 컨트롤처럼 보이지 않는지 알아낼 수 없습니다.사용자 지정 Windows 컨트롤 그리기 문제

A Windows ComboBox and my control that uses the ComboBox theme

위의 이미지는 표준 Windows 콤보 (위) 및 내 사용자 지정 컨트롤이 콤보 테마 (아래)을 사용하여 그려 보여줍니다 : 내가 사용하고 같은 주제를 사용합니다. 내가 해결할 수없는 것은 컨트롤의 테두리가 표준 컨트롤과 다른 모양과 색상을 갖는 이유입니다. 내 클래스 생성자에서

나는 테마 데이터를 엽니 다

mComboTheme = OpenThemeData(hwnd, L"COMBOBOX"); 

와 나는 그냥 콤보 상자 구성 요소의 두 부분으로 그리기있어 WM_PAINT에 대한 핸들러 :

case WM_PAINT: 
{ 
    PAINTSTRUCT ps; 
    HDC   hdc; 
    RECT  client; 

    if(GetUpdateRect(hwnd, &ps.rcPaint, false)) 
    { 
     hdc = BeginPaint(hwnd, &ps); 
     GetClientRect(hwnd, &client); 

     if(IsThemeBackgroundPartiallyTransparent(mComboTheme, CP_BACKGROUND, CBXS_HOT)) 
     { 
      DrawThemeParentBackground(hwnd, hdc, &ps.rcPaint); 
     } 
     DrawThemeBackground(mComboTheme, hdc, CP_BACKGROUND, CBXS_HOT, &client, &ps.rcPaint); 
     client.left = client.right - 20; 
     DrawThemeBackground(mComboTheme, hdc, CP_DROPDOWNBUTTONRIGHT, CBXSR_HOT, &client, ps.rcPaint); 

     EndPaint(*this, &ps); 
    } 
    break; 
} 

어떤 제안 등을 왜이 두 컨트롤이 똑같이 보이지 않는지에 대해 크게 감사 할 것입니다.

감사합니다,

제임스

+0

어쨌든별로 악화되지 않습니다. – BlackBear

답변

4

당신은 CP_BACKGROUNDCP_DROPDOWNBUTTONRIGHTDrawThemeBackground을했다. 테두리를 표준 콤보 상자와 일치 시키려면 CP_BORDER으로 호출해야합니다.

+0

하! 네, 그게 제가 놓친 분명한 점이었습니다. 감사. :) –

+0

@James 도와 드리겠습니다. 해결책을 수락하는 것을 잊지 마십시오. – Jon