Как установить ширину столбца CMFCPropertyListCtrl? - PullRequest
4 голосов
/ 11 августа 2010

Я добавляю свойства к объекту типа CMFCPropertyGridCtrl, например:

myPropertyListCtrl.AddProperty(
    new CMFCPropertyGridProperty(
        _T("Name"),
        foo.GetName())
);

В результате виден только второй столбец, но не первый, который должен содержать «Имя».

  • Я нашел CMFCPropertyGridCtrl::GetPropertyColumnWidth(), но, похоже, нет никакого Set... метода ...
  • Я посмотрел на образец NewControls, в котором размер столбца выглядит полностью автоматическим. Однако я не смог найти соответствующую разницу в моем коде.

Чего мне не хватает?

Ответы [ 4 ]

9 голосов
/ 21 ноября 2012

Обратите внимание, что m_nLeftColumnWidth изначально установлен в 0 в ctor CMFCPropertyGridCtrl. Одно из немногих мест, которые он устанавливает, находится в методе OnSize () (ref. AfxPropertyGridCtrl.cpp, строка 2783 в VS2010), где он установлен равным половине ширины сетки. Это может быть не идеальным, ни настраиваемое значение, описываемое переопределением класса, чтобы явно установить его, но может быть достаточно хорошим.

Если это так, то это просто для запуска защищенного метода CMFCPropertyGridCtrl :: OnSize (). При использовании в окне с изменяемым размером, таком как CDockablePane, OnSize () будет вызываться автоматически. Но в CDialog его нужно явно запустить, например, чтобы отправить сообщение WM_SIZE:

CRect rect;
myPropGrid.GetWindowRect(&rect);
myPropGrid.PostMessage(WM_SIZE, 0, MAKELONG(rect.Width(),rect.Height()));
7 голосов
/ 12 августа 2010

m_nLeftColumnWidth, ответственный за хранение ширины столбца «Имя», является членом protected класса CMFCPropertyGridCtrl.Создайте свой собственный класс, производный от CMFCPropertyGridCtrl, и вы сможете манипулировать m_nLeftColumnWidth.

3 голосов
/ 14 августа 2015

Причина, по которой «set» не существует, заключается в том, что он оставлен на контроль заголовка. Ниже приведен метод обработки сообщений через MFC и окна сообщений:

HDITEM hdItem;
hdItem.mask = HDI_WIDTH; // indicating cxy is width
hdItem.cxy = 300; // whatever you want the property name column width to be
PropListCtrl.GetHeaderCtrl().SetItem(0, &hdItem);
3 голосов
/ 17 июня 2011
class CServerPropertyGridCtrl : public CMFCPropertyGridCtrl
{
public:
    void SetLeftColumnWidth(int cx)
    {
        m_nLeftColumnWidth = cx;
        AdjustLayout();
    }
};
...