Comment définir une largeur de colonne de CMFCPropertyListCtrl?
-
27-09-2019 - |
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éthodeSet...
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?
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);