2010-08-10 82 views
4

我添加屬性CMFCPropertyGridCtrl類型的對象是這樣的:如何設置CMFCPropertyListCtrl的列寬?

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

的結果是,只有第二欄是可見的,但不是第一個應該包含「姓名」。

  • 我發現CMFCPropertyGridCtrl::GetPropertyColumnWidth()但似乎沒有對應Set...方法...
  • 我看着NewControls樣品,其中,所述柱的大小似乎是全自動的。但是,我找不到與我的代碼有關的差異。

我錯過了什麼?

回答

7

m_nLeftColumnWidth負責持有「名稱」列的寬度是CMFCPropertyGridCtrl類的protected成員。創建自己的課程,該課程源自CMFCPropertyGridCtrl,您將可以操縱m_nLeftColumnWidth

3
class CServerPropertyGridCtrl : public CMFCPropertyGridCtrl 
{ 
public: 
    void SetLeftColumnWidth(int cx) 
    { 
     m_nLeftColumnWidth = cx; 
     AdjustLayout(); 
    } 
}; 
9

請注意,m_nLeftColumnWidth在CMFCPropertyGridCtrl的ctor中最初設置爲0。在OnSize()方法(參考AfxPropertyGridCtrl.cpp,VS2010中的第2783行)中設置它的少數幾個其中一個位置,它被設置爲網格寬度的一半。這可能不是理想的,也不是覆蓋班級明確設定的定製值,但可能已足夠好。

如果是這樣,那麼它只是觸發具有CMFCPropertyGridCtrl :: OnSize()受保護的方法。當在可調整大小的窗口(如CDockablePane)中使用時,OnSize()將自動調用。但是,在一個CDialog,它需要明確地觸發諸如發送WM_SIZE消息:

CRect rect; 
myPropGrid.GetWindowRect(&rect); 
myPropGrid.PostMessage(WM_SIZE, 0, MAKELONG(rect.Width(),rect.Height())); 
3

「設置」是不是有一種,因爲它留下來的頭控制的原因。以下是通過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);