2009-10-13 26 views
2

我從wxControl派生的自定義控制,一個對話框,裏面有垂直分級機wxWidgets的自定義控件大小不能set.What我失去了

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 

但出於某種原因,自定義控件的大小設置爲(80,100)。如果我將對話框的大小調整爲超出該大小,則按照我指定的對齊中心。

編輯: 正在使用WX 2.8.9在Windows Vista與Visual Studio 2005

什麼可能會錯過?

回答

4

您沒有提供任何有關wxWidgets版本或平臺/編譯器的信息,所以我將回答wxWidgets 2.8和MSW。

您指定的大小不一定用於控件,因爲不同平臺的最佳大小可能會有所不同。即使在Windows上,大小通常也取決於默認的GUI字體。所以wxWidgets中有各種方法可以讓窗口指定它們的最小值,最大值或最大值。如果您有特殊要求,您可能需要重寫其中的一些。

對於您的問題,它看起來像你想擁有控制比的wxControl默認的最佳尺寸更小的尺寸:

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

(從src/msw/control.cpp拍攝)與值

#define DEFAULT_ITEM_WIDTH 100 
#define DEFAULT_ITEM_HEIGHT 80 

(取自include/wx/msw/private.h)。

如果您覆蓋DoGetBestSize()以返回您的預期大小,它應該工作。

編輯:

您發表評論說,你不能覆蓋DoGetBestSize(),因爲它不是在wxControl虛擬。它雖然,因爲它是在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; 

(從include/wx/window.h拍攝)。 wxWindowwxControl的父類,因此該方法確實是虛擬的,您當然可以覆蓋它。實際上,許多控件都是這樣做的,因爲源代碼中的grep會顯示給您。

+0

+1和謝謝指出默認的寬度和高度。因爲我從wxControl派生,我不能覆蓋DoGetBestSize(),因爲它不是虛擬的wxControl – Ranjith 2009-10-15 03:57:37

+0

謝謝你清除懷疑 – Ranjith 2009-10-15 10:16:22