2016-05-31 3 views
0

나는 wxFormbuilder이 간단한 wxWidgets에 응용 프로그램을 만들어 :리본 메뉴의 빈 공간

screenshot

당신이 볼 수 있듯이이 리본 메뉴 탭에 이상한 빈 공간이있다. 내가 놓친 게 없니? 리본 메뉴를 왼쪽 상단으로 똑바로 정렬하는 것이 좋습니다.

this->SetSizeHints(wxSize(183,146), wxDefaultSize); 

wxBoxSizer* bSizer4; 
bSizer4 = new wxBoxSizer(wxVERTICAL); 

m_ribbonBar1 = new wxRibbonBar(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRIBBON_BAR_DEFAULT_STYLE); 
m_ribbonBar1->SetArtProvider(new wxRibbonAUIArtProvider); 
m_ribbonPage1 = new wxRibbonPage(m_ribbonBar1, wxID_ANY, wxT("File") , wxNullBitmap , 0); 
m_ribbonBar1->SetActivePage(m_ribbonPage1); 
m_ribbonPanel1 = new wxRibbonPanel(m_ribbonPage1, wxID_ANY, wxT("File") , wxNullBitmap , wxDefaultPosition, wxDefaultSize, wxRIBBON_PANEL_DEFAULT_STYLE); 
m_rbtnBar = new wxRibbonButtonBar(m_ribbonPanel1, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0); 
m_rbtnBar->AddButton(wxID_ANY, wxT("New"), wxNullBitmap, wxEmptyString); 
m_rbtnBar->AddButton(wxID_ANY, wxT("Save"), wxNullBitmap, wxEmptyString); 
m_rbtnBar->AddButton(wxID_ANY, wxT("Load"), wxNullBitmap, wxEmptyString); 
m_ribbonPage2 = new wxRibbonPage(m_ribbonBar1, wxID_ANY, wxT("View") , wxNullBitmap , 0); 
m_ribbonBar1->SetActivePage(m_ribbonPage2); 
m_ribbonPanel21 = new wxRibbonPanel(m_ribbonPage2, wxID_ANY, wxT("View") , wxNullBitmap , wxDefaultPosition, wxDefaultSize, wxRIBBON_PANEL_DEFAULT_STYLE); 
m_ribbonButtonBar21 = new wxRibbonButtonBar(m_ribbonPanel21, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0); 
m_ribbonButtonBar21->AddButton(wxID_ANY, wxT("Do something"), wxNullBitmap, wxEmptyString); 
m_ribbonButtonBar21->AddButton(wxID_ANY, wxT("Do something else"), wxNullBitmap, wxEmptyString); 
m_ribbonBar1->Realize(); 

bSizer4->Add(m_ribbonBar1, 0, wxEXPAND, 5); 

wxBoxSizer* mainSizer; 
mainSizer = new wxBoxSizer(wxVERTICAL); 

m_ntbkMain = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0); 
m_panel1 = new wxPanel(m_ntbkMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); 
wxBoxSizer* bSizer6; 
bSizer6 = new wxBoxSizer(wxHORIZONTAL); 

wxBoxSizer* bSizer7; 
bSizer7 = new wxBoxSizer(wxVERTICAL); 

m_button11 = new wxButton(m_panel1, wxID_ANY, wxT("MyButton"), wxDefaultPosition, wxDefaultSize, 0); 
bSizer7->Add(m_button11, 0, wxALL, 5); 

m_button12 = new wxButton(m_panel1, wxID_ANY, wxT("MyButton"), wxDefaultPosition, wxDefaultSize, 0); 
bSizer7->Add(m_button12, 0, wxALL, 5); 

m_button13 = new wxButton(m_panel1, wxID_ANY, wxT("MyButton"), wxDefaultPosition, wxDefaultSize, 0); 
bSizer7->Add(m_button13, 0, wxALL, 5); 


bSizer6->Add(bSizer7, 1, wxEXPAND, 5); 


m_panel1->SetSizer(bSizer6); 
m_panel1->Layout(); 
bSizer6->Fit(m_panel1); 
m_ntbkMain->AddPage(m_panel1, wxT("Tab 1"), true); 
m_panel2 = new wxPanel(m_ntbkMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); 
m_ntbkMain->AddPage(m_panel2, wxT("a page"), false); 
m_panel3 = new wxPanel(m_ntbkMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); 
m_ntbkMain->AddPage(m_panel3, wxT("a page"), false); 
m_panel4 = new wxPanel(m_ntbkMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); 
m_ntbkMain->AddPage(m_panel4, wxT("a page"), false); 

mainSizer->Add(m_ntbkMain, 1, wxEXPAND, 5); 


bSizer4->Add(mainSizer, 1, wxEXPAND, 5); 


this->SetSizer(bSizer4); 
this->Layout(); 

this->Centre(wxBOTH); 

이 내가 달성하고자하는 것입니다 : 경우 사람이 그것을 원에서, 여기 wxFormbuilder에 의해 생성 된 코드는

office 2007 button

+1

당신이 WX 및 Windows 버전 무엇인가

결과는 다음과 같은 것입니다? 샘플에서 이것을 재현 할 수 있습니까? – Igor

+0

@Igor Windows 10 교육 64 비트, wxWidgets 3.1.0이 소스에서 빌드되었습니다. 저는 시도하지 않았습니다. 이것은 단순히 wxFormbuilder 디자이너에서도 볼 수 있습니다. – calcyss

+0

샘플을 사용해보십시오. 작동하는 경우 코드와 다른 점을 확인하십시오. 그렇지 않다면 - wx-dev에 게시하거나 trac.wxwidgets.org에서 티켓을여십시오. 또한 실제 컴파일 된 응용 프로그램 바이너리를 사용해보십시오. 때로는 RAD 도구가 오도 될 수 있습니다. – Igor

답변

3

wxRibbonBar의 정상적인 동작입니다. 이 공간은 wxRibbonBar (http://www.corsix.org/gsoc/ribbon.html 참조)을 구현할 때 사용자가 제공 한 파일 메뉴 나 MS Office 응용 프로그램에 있던 원 아이콘의 종류를위한 공간입니다.

이 공간에서 [더 일반적] "파일"메뉴를 제공하는 한 가지 방법은 자신의 예술 제공자를 wxRibbonMSWArtProvider (또는 다른 제공자 중 하나)에서 파생시키는 것입니다. ::DrawTabCtrlBackground을 무시해야합니다. 그런 다음, 즉 팝업을 보여줍니다 (당신이 "파일"을 클릭하면 일이 원하는대로 수행하는 핸들러 함수에 wxRibbonBar wxEVT_LEFT_DOWN 이벤트를 바인드해야

void myArtProvider::DrawTabCtrlBackground(
         wxDC& dc, 
         wxWindow* WXUNUSED(wnd), 
         const wxRect& rect) 
{ 
    // Draw the background for the whole tab area. 
    dc.SetPen(*wxTRANSPARENT_PEN); 
    dc.SetBrush(m_tab_ctrl_background_brush); 
    dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height); 

    // Draw the "File" menu background, unfortunately its static and doesn't change when hovered. 
    dc.SetBrush (wxColour(35, 70, 135)); 
    dc.DrawRectangle (rect.x, rect.y, 60, rect.height); 
    dc.SetFont (m_tab_label_font); 

    // Centre the "File" text in the available space (alternatively this could use wxDC::DrawLabel). 
    dc.SetTextForeground (*wxWHITE); 
    int text_height; 
    int text_width; 
    dc.GetTextExtent ("File", &text_width, &text_height); 
    int y = rect.y + ((rect.height - text_height)/2); 

    // Draw the "File" text. 
    dc.DrawText("File", rect.x + ((60 - text_width)/2) + 1, y); 
} 

:

다음의 간단한 예입니다 메뉴 또는 Office의 최신 버전과 같은 완전히 새로운 페이지). wxRibbonBar with "File" menu

+0

어떻게하면 창 구석에 사무실과 같은 단추를 얻을 수 있습니까? – calcyss

+0

달성하고자하는 것을 보여주는 이미지를 질문에 추가하십시오. 내가 보여준 평면 버튼보다는 일종의 그라디언트 버튼을 의미합니까? – iwbnwif

+0

나는 질문을 업데이트했다. 그리고 미안, 나는 2007 년과 같은 사무실을 의미했다. – calcyss