MFC: элементы CCheckListBox перекрываются - PullRequest
0 голосов
/ 30 июня 2010

В шаблоне диалога я разместил ListBox, поскольку флажок списка не отображается в параметрах визуального макета.Я установил его на владельца-рисование и настроил его с помощью DDX, изменив связанную переменную класса с типа CListBox на CCheckListBox - другими словами, единственные изменения, которые я делаю из того, что мастер делает для меня, - это установка владельца-рисования и изменение элементатип переменной.

в методе моего диалогового окна OnInitDialog, который я затем проверяю с помощью:

m_List.AddString(_T("One"));
m_List.AddString(_T("Two"));
m_List.AddString(_T("Three"));
m_List.AddString(_T("Four"));
m_List.SetCheck(1,1);

Когда я запускаю список, есть 4 элемента и один проверенный с правильными строками.Но высота элемента неверна.Похоже, что высота флажка используется для определения высоты элемента, что приводит к тому, что текст перекрывает элемент ниже.

Разве поведение класса по умолчанию не должно быть в этом, без меняиндивидуально установить высоту каждого предмета?

Ответы [ 2 ]

1 голос
/ 30 июня 2010

Из MSDN:

Если ваш флажок установлен по умолчанию поле контрольного списка (список строк с флажки размера по умолчанию для слева от каждого), вы можете использовать по умолчанию CCheckListBox :: DrawItem, чтобы нарисовать поле контрольного списка. В противном случае вы должны переопределить CListBox :: CompareItem функция и CCheckListBox :: DrawItem и Функции CCheckListBox :: MeasureItem.

Похоже, вам нужно либо вызвать реализацию по умолчанию, либо реализовать свой собственный MesaureItem / DrawItem. Вероятно, поэтому элементы, кажется, перекрываются.

0 голосов
/ 28 марта 2019

В флажке, строковый регистр может быть достаточным для предотвращения наложения следующего:

class CCheckListBoxEx : public CCheckListBox
{
public:
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
        // set item height once:    
        if ((GetStyle() & (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS)) ==
                          (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS)  && m_cyText == 0)
        {
            SetItemHeight(0, CalcMinimumItemHeight() + 2);
        }

        // add some space between box and string: 
        lpDrawItemStruct->rcItem.left += 2;

        CCheckListBox::DrawItem(lpDrawItemStruct);
    }
};
...