Question

Je l'ajout de propriétés à un objet de type CMFCPropertyGridCtrl comme ceci:

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 ».

  • J'ai trouvé CMFCPropertyGridCtrl::GetPropertyColumnWidth() mais il semble être aucune méthode Set... correspondant ...
  • Je regarde l'échantillon de NewControls, dans lequel la taille de la colonne semble être entièrement automatique. Cependant, je ne pouvais pas trouver la différence correspondant à mon code.

Qu'est-ce que je manque?

Était-ce utile?

La solution

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

Autres conseils

Notez que m_nLeftColumnWidth est initialement fixé à 0 dans le cteur de CMFCPropertyGridCtrl. Un des rares autres endroits qu'il est réglé, se trouve dans la méthode OnSize () (ref. AfxPropertyGridCtrl.cpp, ligne 2783 dans VS2010), où il est fixé à la moitié de la largeur de la grille. Cela peut ne pas être idéal, ni la valeur sur mesure décrite en remplaçant la classe explicitement définie, mais peut être assez bon.

Si oui, alors il est simplement l'élément déclencheur de la méthode protégée CMFCPropertyGridCtrl :: OnSize (). Lorsqu'il est utilisé dans une fenêtre redimensionnable comme un CDockablePane, OnSize () sera appelée 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()));
class CServerPropertyGridCtrl : public CMFCPropertyGridCtrl
{
public:
    void SetLeftColumnWidth(int cx)
    {
        m_nLeftColumnWidth = cx;
        AdjustLayout();
    }
};

La raison pour laquelle le « set » est pas là est parce qu'il est laissé à la commande d'en-tête. Ce qui suit est la méthode de traitement par MFC par rapport à des messages de 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top