Как установить ширину столбца CMFCPropertyListCtrl?

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

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

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

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

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

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

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

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

     CRect rect; myPropGrid.GetWindowRect(&rect); myPropGrid.PostMessage(WM_SIZE, 0, MAKELONG(rect.Width(),rect.Height())); 
     class CServerPropertyGridCtrl : public CMFCPropertyGridCtrl { public: void SetLeftColumnWidth(int cx) { m_nLeftColumnWidth = cx; AdjustLayout(); } }; 

    Причина, по которой «набор» не существует, заключается в том, что она оставлена ​​для элемента управления заголовком. Ниже приведен метод обработки через сообщения 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);