2010-08-10 35 views
4

Je suis à ajouter des propriétés un objet de type CMFCPropertyGridCtrl comme ceci:Comment définir la largeur d'une colonne CMFCPropertyListCtrl?

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

Le résultat est que seule la deuxième colonne est visible, mais pas la première qui doit contenir « Nom ».

  • Je trouve CMFCPropertyGridCtrl::GetPropertyColumnWidth(), mais il semble y avoir aucune méthode Set... correspondant ...
  • Je regardais l'échantillon NewControls, dans lequel la taille de la colonne semble être entièrement automatique. Cependant, je n'ai pas pu trouver la différence pertinente à mon code.

Que manque-t-il?

Répondre

7

m_nLeftColumnWidthm_nLeftColumnWidth responsable de la largeur de la colonne "Nom" est un membre protected de la classe CMFCPropertyGridCtrl. Créez votre propre classe, qui dérive de CMFCPropertyGridCtrl et vous serez en mesure de manipuler m_nLeftColumnWidth.

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

Notez que m_nLeftColumnWidth est initialement défini sur 0 dans ctor de CMFCPropertyGridCtrl. L'un des rares autres endroits où il est défini est la méthode OnSize() (réf AfxPropertyGridCtrl.cpp, ligne 2783 dans VS2010), où il est défini sur la moitié de la largeur de la grille. Cela peut ne pas être idéal, ni la valeur personnalisée décrite en remplaçant la classe pour la définir explicitement, mais peut être suffisante.

Si tel est le cas, il suffit de déclencher la méthode protégée CMFCPropertyGridCtrl :: OnSize(). Lorsqu'il est utilisé dans une fenêtre redimensionnable telle qu'un CDockablePane, OnSize() sera appelé automatiquement. Mais dans un CDialog, il doit être explicitement déclencheur, comme pour envoyer un message WM_SIZE:

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

La raison pour laquelle le « set » est pas là est parce qu'il est laissé à la commande d'en-tête. La méthode ci-dessous permet de gérer les messages MFC et les messages de la fenêtre d'affichage:

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);