2009-10-13 5 views
2

J'ai un contrôle personnalisé dérivé de wxControl, dans une boîte de dialogue avec un calibreur verticalwxWidgets taille contrôle personnalisé ne peut pas être set.What suis-je manque à

wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL); 
Knob* newKnob = new Knob(panel,wxID_ANY,wxDefaultPosition,wxSize(40,40)); 
topSizer->Add(newKnob,0,wxALL|wxALIGN_CENTER); 
panel->SetSizer(topSizer); 
topSizer->Fit(panel); 

//panel is a wxPanel inside the dialog 

Mais pour une raison quelconque, la taille des contrôles personnalisés est Défini à (80,100) .Si je redimensionne la boîte de dialogue au-delà de cette taille, elle est alignée sur le centre tel que spécifié.

EDIT: AM à l'aide WX 2.8.9 sur Windows Vista avec Visual Studio 2005.

Que pourrait-on manquer?

Répondre

4

Vous n'avez fourni aucune information sur la version de wxWidgets ou votre plate-forme/compilateur, donc je vais répondre pour wxWidgets 2.8 et MSW.

La taille que vous spécifiez n'est pas nécessairement utilisée pour le contrôle, car la meilleure taille pour différentes plates-formes peut être différente. Même sur Windows, la taille dépend généralement de la police graphique par défaut. Il existe donc différentes méthodes dans wxWidgets qui permettent à Windows de spécifier leur taille minimale, maximale ou maximale. Si vous avez des exigences particulières, vous devrez peut-être remplacer certaines d'entre elles.

Pour votre problème, il semble que vous voulez avoir le contrôle ont une taille plus petite que la meilleure taille par défaut de wxControl:

wxSize wxControl::DoGetBestSize() const 
{ 
    return wxSize(DEFAULT_ITEM_WIDTH, DEFAULT_ITEM_HEIGHT); 
} 

(prise de src/msw/control.cpp) avec les valeurs

#define DEFAULT_ITEM_WIDTH 100 
#define DEFAULT_ITEM_HEIGHT 80 

(tiré du include/wx/msw/private.h).

Si vous remplacez DoGetBestSize() pour renvoyer la taille voulue, cela devrait fonctionner.

Edit:

Votre commentaire que vous ne pouvez pas remplacer DoGetBestSize() car il est virtuel dans wxControl. Il est cependant, car il est introduit dans wxWindow:

// get the size which best suits the window: for a control, it would be 
// the minimal size which doesn't truncate the control, for a panel - the 
// same size as it would have after a call to Fit() 
virtual wxSize DoGetBestSize() const; 

(prise de include/wx/window.h). wxWindow est une classe parente de wxControl, donc la méthode est en effet virtuelle et vous pouvez bien sûr la surcharger. Beaucoup de contrôles font en effet, comme un grep dans les sources vous montrera.

+0

+1 et merci de m'avoir indiqué la largeur et la hauteur par défaut. Puisque je dérive de wxControl, je ne peux pas surcharger DoGetBestSize() car ce n'est pas virtuel dans wxControl – Ranjith

+0

Merci d'avoir clarifié le doute – Ranjith

Questions connexes