2013-04-09 14 views
-1

我試圖獲得wxSizer類型與wxIS_KIND_OF宏。 幾秒鐘後,我的程序沒有顯示我的應用程序的主窗口。使用wxIS_KIND_OF宏獲取類類型時出錯

這是代碼:

wxXmlResource::Get()->LoadFrame((wxFrame*)this, (wxWindow*)NULL , wxT("MyFrame1")); 

wxPanel* container = (wxPanel*)FindWindowByName("m_panel1"); 
if (!container){ 
    cout << "Error loading container!" << endl << flush; 
} 
else{ 
    for (unsigned int i=0; i<3; i++){ 
     auxPanelArray[i] = new wxPanel(container, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); 
     wxXmlResource::Get()->LoadPanel(auxPanelArray[i] , wxT("MyPanel6")); 

     wxSizer* mySizer = auxPanelArray[i]->GetSizer(); 
     if (wxIS_KIND_OF(mySizer, wxStaticBoxSizer)){ 
      cout << "Your sizer is a wxStaticBoxSizer" << endl << flush; 
      ((wxStaticBoxSizer*)mySizer)->GetStaticBox()->SetLabel("My new label"); 
     } 

     container->GetSizer()->Add(auxPanelArray[i]); 
    } 
} 

在我的XRC,篩分器類型是wxStaticBoxSizer,所以wxIS_KIND_OF應該檢測到它和IF塊進入裏面。

爲什麼它不起作用?

UPDATE 這是XRC文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<resource xmlns="http://www.wxwindows.org/wxxrc" version="2.3.0.1"> 
    <object class="wxPanel" name="MyPanel6"> 
     <style>wxTAB_TRAVERSAL</style> 
     <object class="wxStaticBoxSizer"> 
      <minsize>100,100</minsize> 
      <orient>wxVERTICAL</orient> 
      <label>label</label> 
      <object class="sizeritem"> 
       <option>1</option> 
       <flag>wxEXPAND|wxALL</flag> 
       <border>5</border> 
       <object class="wxBoxSizer"> 
        <orient>wxHORIZONTAL</orient> 
        <object class="sizeritem"> 
         <option>0</option> 
         <flag>wxALL</flag> 
         <border>5</border> 
         <object class="wxStaticText" name="m_staticText12"> 
          <label>MyLabel</label> 
          <wrap>-1</wrap> 
         </object> 
        </object> 
        <object class="sizeritem"> 
         <option>0</option> 
         <flag>wxALL</flag> 
         <border>5</border> 
         <object class="wxTextCtrl" name="m_textCtrl4"> 
          <value></value> 
         </object> 
        </object> 
       </object> 
      </object> 
      <object class="sizeritem"> 
       <option>0</option> 
       <flag>wxALL</flag> 
       <border>5</border> 
       <object class="wxButton" name="m_button8"> 
        <label>MyButton</label> 
        <default>0</default> 
       </object> 
      </object> 
     </object> 
    </object> 
</resource> 
+1

????什麼是wxIS_KIND_OF? – ravenspoint 2013-04-09 12:17:44

+0

這是一個包裝方法IsKindOf()的宏,它實現了從wxObject派生的所有類。它在文件object.h中定義。 – 2013-04-09 13:30:27

回答

1

wxIS_KIND_OF()必須的,當然,工作wxStaticBoxSizer,因此無論是分級機是不是這種類型的或者你的代碼實際執行,但沒有按沒有任何影響,因爲您的標準輸出不會顯示在任何位置 - 在Windows下的GUI應用程序中默認情況下是這種情況。

我還建議使用wxDynamicCast(),而不是wxIS_KIND_OF

wxStaticBoxSizer* boxSizer = wxDynamicCast(mySizer, wxStaticBoxSizer); 
if (boxSizer) { 
    ... just use it now, no need for more casts ... 
} 
+0

wxDynamicCast很好。問題不是標準輸出。當我做auxPanelArray [i] - > GetSizer()然後進行轉換時,它總是返回null。我認爲這是因爲,取決於wxPanel,有一個wxStaticBoxSizer,而不是一個wxBoxSizer。可能? – 2013-04-09 13:44:08

+0

好的,我在LoadFrame()行有一個錯誤。通過auxPanelArray [i] = wxXmlResource :: Get() - > LoadPanel(container,wxT(「MyPanel6」))更改該行;使其工作。再次感謝VZ – 2013-04-09 14:43:06