2017-10-11 8 views
2

두 개의 콤보 상자, 소유자 그리기 및 비 소유자 그리기가 포함 된 대화 상자가 있습니다.소유자의 세로 크기가 비 소유자 그리기 콤보 상자보다 큰 콤보 상자를 그립니다.

이 그들이 .rc 파일에 정의 된 방법입니다

COMBOBOX  IDC_COMBO2,149,49,77,73, 
       CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_SORT | VS_VSCROLL 
COMBOBOX  IDC_COMBO3,237,49,48,30, 
       CBS_DROPDOWNLIST CBS_SORT | WS_VSCROLL 

그들은 .rc 파일에 같은 높이지만, 소유자 하나 (왼쪽에 하나) 그릴이 약간 정확히 한 비 소유자가 그려 낸 것보다 높다 :

enter image description here.

+0

[CBS_NOINTEGRALHEIGHT] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb775796.aspx) 콤보 상자 스타일을 이상적으로 지정해야합니다. 키의 차이는 소유자 콤보 상자에서 다른 기본값을 사용하는 표준 콤보 상자 때문일 수 있습니다. 그것은 추측이다. – IInspectable

+0

@IInspectable CBS_NOINTEGRALHEIGHT는 관련이 없지만 시도했지만 아무 것도 변경하지 않습니다. 나는 이것이 단지 드롭 다운리스트를위한 것이라고 생각한다. –

답변

4

먼저 리소스의 지정된 높이는 드롭 다운 상태의 콤보 상자의 높이입니다.

이 동작은 디자인입니다. 콤보 상자 항목 높이의 크기는 에 의해 결정되는 것으로 생각됩니다. 컨트롤에 할당 된 글꼴의 글꼴 높이. owner-draw combobox를 사용하면 시스템에 아무런 생각이 없습니다. WM_MEASUREITEM이 콤보 상자의 기본 크기로 초기화됩니다 (gui 글꼴이 아닌 시스템 글꼴에 따라 ).

void CMyDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{ 
    CClientDC dc(this); 
    CFont* pFont = GetFont(); 
    CFont* pFontPrev = NULL; 

    if (pFont != NULL) 
    pFontPrev = dc.SelectObject(pFont); 

    int iborder = ::GetSystemMetrics(SM_CYBORDER); 
    CSize sz = dc.GetTextExtent(_T("0")); 
    lpMeasureItemStruct->itemHeight = sz.cy + 2*iborder; 

    if (pFont != NULL) 
    dc.SelectObject(pFontPrev); 

    __super::OnMeasureItem(nIDCtl, lpMeasureItemStruct); 
} 
+0

우수, 내 하루를 저장했습니다! 방금 코드 조각을 넣었고 예상대로 작동합니다. –

+0

[__super] (https://msdn.microsoft.com/en-us/library/94dw1w7x.aspx)도 유용합니다. 나는 그것에 대해 몰랐다. – acraig5075

+0

__super는 MS 컴파일러에서만 사용할 수 있습니다. – xMRi

3

콤보가 가장 무서운 제어하는 ​​것입니다

그래서 당신은이 같은

뭔가 도움이 될 ... 부모 대화 상자에서 WM_MEASUREITEM을 처리하기 위해 (컴파일러에 대해 검증되지 코드)가 필요합니다 크기와 레이아웃을 다룰 때 Windows에서 작업하십시오. 별도의 편집 및 목록 상자 컨트롤이있는 "간단한"스타일을 항상 지원하므로 표준 윈도우 테두리/가장자리 스타일을 사용하지 않고 필요한 경우 테두리를 그립니다.

컨트롤을 만들 때 지정된 높이는 실제로 드롭 다운 상태에서 사용되는 크기입니다. 런타임시 글꼴 크기에 따라 자체 편집 컨트롤의 크기를 강제합니다. 이렇게 많은 사람들이 이러한 잘못을 저지르기 때문에 ComCtl32 v6 구현은 처음에는 크기를 작게 지정해도 드롭 다운 크기가 제정신이되도록합니다.

시스템을 일치 시키려면 WM_MEASUREITEM에서 필요한 크기를 계산해야하지만 기본 컨트롤의 정확한 레이아웃은 문서화되어 있지 않습니다. 글꼴의 높이 + SM_C * EDGE의 시스템 메트릭 크기와 아마도 약간의 패딩 일 것입니다.

텍스트 옆에만 아이콘이 필요한 경우 ComboBoxEx 컨트롤을 대신 사용할 수 있습니다.