From fd9df06d35ab8eb991489731a4bf358b4dbcc90c Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Fri, 17 Jan 2020 23:04:56 +0100 Subject: [PATCH 1/3] Fix applying header style of wxMSWHeaderCtrl Call SetWindowStyleFlag when creating the control. Apply wxHD_BITMAP_ON_RIGHT style. Get rid of the helper function. --- include/wx/msw/headerctrl.h | 4 ---- src/msw/headerctrl.cpp | 20 ++++++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/wx/msw/headerctrl.h b/include/wx/msw/headerctrl.h index ad58d06ea3..80d042eee9 100644 --- a/include/wx/msw/headerctrl.h +++ b/include/wx/msw/headerctrl.h @@ -72,10 +72,6 @@ private: // Events. void OnSize(wxSizeEvent& event); - // Style flag helper function. - long ApplyHeaderReorderFlagToStyle(long style); - - // The native header control. wxMSWHeaderCtrl* m_nativeControl; friend class wxMSWHeaderCtrl; diff --git a/src/msw/headerctrl.cpp b/src/msw/headerctrl.cpp index 58afd7e608..501151de33 100644 --- a/src/msw/headerctrl.cpp +++ b/src/msw/headerctrl.cpp @@ -1048,10 +1048,12 @@ bool wxHeaderCtrl::Create(wxWindow *parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, - ApplyHeaderReorderFlagToStyle(wxNO_BORDER), + wxNO_BORDER, wxMSWHeaderCtrlNameStr) ) return false; + SetWindowStyle(newStyle); + Bind(wxEVT_SIZE, &wxHeaderCtrl::OnSize, this); return true; @@ -1136,16 +1138,18 @@ void wxHeaderCtrl::SetWindowStyleFlag(long style) // Update the native control style. long flags = m_nativeControl->GetWindowStyleFlag(); - flags = ApplyHeaderReorderFlagToStyle(flags); - m_nativeControl->SetWindowStyleFlag(flags); -} -long wxHeaderCtrl::ApplyHeaderReorderFlagToStyle(long style) -{ if ( HasFlag(wxHD_ALLOW_REORDER) ) - return style | wxHD_ALLOW_REORDER; + flags |= wxHD_ALLOW_REORDER; + else + flags &= ~wxHD_ALLOW_REORDER; - return style & ~wxHD_ALLOW_REORDER; + if ( HasFlag(wxHD_BITMAP_ON_RIGHT) ) + flags |= wxHD_BITMAP_ON_RIGHT; + else + flags &= ~wxHD_BITMAP_ON_RIGHT; + + m_nativeControl->SetWindowStyleFlag(flags); } #endif // wxHAS_GENERIC_HEADERCTRL From a31cf55a8d363f437f941e6ec51143a610a9380c Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Fri, 17 Jan 2020 23:08:13 +0100 Subject: [PATCH 2/3] Add more columns to Header control in widgets sample Show column settings horizontally. Fix binding to header control events after it is recreated. --- samples/widgets/headerctrl.cpp | 73 ++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/samples/widgets/headerctrl.cpp b/samples/widgets/headerctrl.cpp index d5ae948f3f..fee689c35e 100644 --- a/samples/widgets/headerctrl.cpp +++ b/samples/widgets/headerctrl.cpp @@ -48,6 +48,8 @@ // HeaderCtrlWidgetsPage // ---------------------------------------------------------------------------- +#define NUMBER_OF_COLUMNS 4 + class HeaderCtrlWidgetsPage : public WidgetsPage { public: @@ -100,7 +102,7 @@ protected: wxCheckBox *chkAllowHide; wxCheckBox *chkWithBitmap; wxRadioBox *rbAlignments; - } m_colSettings[2]; + } m_colSettings[NUMBER_OF_COLUMNS]; private: DECLARE_WIDGETS_PAGE(HeaderCtrlWidgetsPage) @@ -116,8 +118,7 @@ private: #define HEADER_CTRL_FAMILY GENERIC_CTRLS #endif -IMPLEMENT_WIDGETS_PAGE(HeaderCtrlWidgetsPage, - "Header", HEADER_CTRL_FAMILY); +IMPLEMENT_WIDGETS_PAGE(HeaderCtrlWidgetsPage, "Header", HEADER_CTRL_FAMILY); static const wxString gs_colAlignments[] = { "none", "left", "centre", "right" }; static const wxAlignment gs_colAlignFlags[] = { wxALIGN_NOT, wxALIGN_LEFT, wxALIGN_CENTRE, wxALIGN_RIGHT }; @@ -127,8 +128,8 @@ static const wxAlignment gs_colAlignFlags[] = { wxALIGN_NOT, wxALIGN_LEFT, wxALI void HeaderCtrlWidgetsPage::CreateContent() { - // left pane - wxSizer *sizerLeft = new wxBoxSizer(wxVERTICAL); + // top pane + wxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL); // header style wxSizer *sizerHeader = new wxStaticBoxSizer(wxVERTICAL, this, "&Header style"); @@ -136,7 +137,11 @@ void HeaderCtrlWidgetsPage::CreateContent() m_chkAllowHide = CreateCheckBoxAndAddToSizer(sizerHeader, "Alow &hide"); m_chkBitmapOnRight = CreateCheckBoxAndAddToSizer(sizerHeader, "&Bitmap on right"); ResetHeaderStyle(); - sizerLeft->Add(sizerHeader, wxSizerFlags().Expand()); + + sizerHeader->AddStretchSpacer(); + wxButton* btnReset = new wxButton(this, wxID_ANY, "&Reset"); + sizerHeader->Add(btnReset, wxSizerFlags().CenterHorizontal().Border()); + sizerTop->Add(sizerHeader, wxSizerFlags().Expand()); // column flags for ( int i = 0; i < (int)WXSIZEOF(m_colSettings); i++ ) @@ -150,25 +155,22 @@ void HeaderCtrlWidgetsPage::CreateContent() m_colSettings[i].rbAlignments = new wxRadioBox(this, wxID_ANY, "Alignment", wxDefaultPosition, wxDefaultSize, WXSIZEOF(gs_colAlignments), gs_colAlignments, 2, wxRA_SPECIFY_COLS); - sizerCol->Add(m_colSettings[i].rbAlignments, wxSizerFlags().Expand().Border(wxALL, 5)); + sizerCol->Add(m_colSettings[i].rbAlignments, wxSizerFlags().Expand().Border()); ResetColumnStyle(i); - sizerLeft->Add(sizerCol, wxSizerFlags().Expand().Border(wxTOP, 15)); + sizerTop->AddSpacer(15); + sizerTop->Add(sizerCol, wxSizerFlags().Expand()); } - sizerLeft->Add(5, 5, wxSizerFlags().Expand().Border(wxALL, 5)); // spacer - wxButton* btnReset = new wxButton(this, wxID_ANY, "&Reset"); - sizerLeft->Add(btnReset, wxSizerFlags().CenterHorizontal().Border(wxALL, 15)); - - // right pane + // bottom pane m_sizerHeader = new wxStaticBoxSizer(wxVERTICAL, this, "Header"); RecreateWidget(); // the 2 panes compose the window - wxSizer* sizerTop = new wxBoxSizer(wxHORIZONTAL); - sizerTop->Add(sizerLeft, wxSizerFlags().Expand().DoubleBorder()); - sizerTop->Add(m_sizerHeader, wxSizerFlags(1).Expand().DoubleBorder()); + wxSizer* sizerAll = new wxBoxSizer(wxVERTICAL); + sizerAll->Add(sizerTop, wxSizerFlags().Expand().Border()); + sizerAll->Add(m_sizerHeader, wxSizerFlags(1).Expand().Border()); - SetSizer(sizerTop); + SetSizer(sizerAll); // Bind event handlers m_chkAllowReorder->Bind(wxEVT_CHECKBOX, &HeaderCtrlWidgetsPage::OnStyleCheckOrRadioBox, this); @@ -185,10 +187,6 @@ void HeaderCtrlWidgetsPage::CreateContent() } btnReset->Bind(wxEVT_BUTTON, &HeaderCtrlWidgetsPage::OnResetButton, this); btnReset->Bind(wxEVT_UPDATE_UI, &HeaderCtrlWidgetsPage::OnUpdateUIResetButton, this); - - m_header->Bind(wxEVT_HEADER_RESIZING, &HeaderCtrlWidgetsPage::OnResizing, this); - m_header->Bind(wxEVT_HEADER_BEGIN_RESIZE, &HeaderCtrlWidgetsPage::OnBeginResize, this); - m_header->Bind(wxEVT_HEADER_END_RESIZE, &HeaderCtrlWidgetsPage::OnEndResize, this); } void HeaderCtrlWidgetsPage::RecreateWidget() @@ -200,19 +198,24 @@ void HeaderCtrlWidgetsPage::RecreateWidget() m_header = new wxHeaderCtrlSimple(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, flags); - wxASSERT(WXSIZEOF(m_colSettings) == 2); - wxHeaderColumnSimple col1("First", 100, GetColumnAlignmentFlag(0), GetColumnStyleFlags(0)); - if ( m_colSettings[0].chkWithBitmap->IsChecked() ) + + m_header->Bind(wxEVT_HEADER_RESIZING, &HeaderCtrlWidgetsPage::OnResizing, this); + m_header->Bind(wxEVT_HEADER_BEGIN_RESIZE, &HeaderCtrlWidgetsPage::OnBeginResize, this); + m_header->Bind(wxEVT_HEADER_END_RESIZE, &HeaderCtrlWidgetsPage::OnEndResize, this); + + for ( int i = 0; i < (int)WXSIZEOF(m_colSettings); i++ ) { - col1.SetBitmap(wxArtProvider::GetIcon(wxART_ERROR, wxART_BUTTON)); + wxHeaderColumnSimple col(wxString::Format("Column %d", i + 1), + FromDIP(100), + GetColumnAlignmentFlag(i), + GetColumnStyleFlags(i)); + if ( m_colSettings[i].chkWithBitmap->IsChecked() ) + { + const wxArtID icons[] = { wxART_ERROR, wxART_QUESTION, wxART_WARNING, wxART_INFORMATION }; + col.SetBitmap(wxArtProvider::GetIcon(icons[i % WXSIZEOF(icons)], wxART_BUTTON)); + } + m_header->AppendColumn(col); } - m_header->AppendColumn(col1); - wxHeaderColumnSimple col2("Second", 200, GetColumnAlignmentFlag(1), GetColumnStyleFlags(1)); - if ( m_colSettings[1].chkWithBitmap->IsChecked() ) - { - col2.SetBitmap(wxArtProvider::GetIcon(wxART_QUESTION, wxART_BUTTON)); - } - m_header->AppendColumn(col2); m_sizerHeader->AddStretchSpacer(); m_sizerHeader->Add(m_header, wxSizerFlags().Expand()); @@ -310,19 +313,19 @@ void HeaderCtrlWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& evt) void HeaderCtrlWidgetsPage::OnResizing(wxHeaderCtrlEvent& evt) { - wxLogMessage("Column %i resizing, width = %i", evt.GetColumn(), evt.GetWidth()); + wxLogMessage("Column %i resizing, width = %i", evt.GetColumn() + 1, evt.GetWidth()); evt.Skip(); } void HeaderCtrlWidgetsPage::OnBeginResize(wxHeaderCtrlEvent& evt) { - wxLogMessage("Column %i resize began, width = %i", evt.GetColumn(), evt.GetWidth()); + wxLogMessage("Column %i resize began, width = %i", evt.GetColumn() + 1, evt.GetWidth()); evt.Skip(); } void HeaderCtrlWidgetsPage::OnEndResize(wxHeaderCtrlEvent& evt) { - wxLogMessage("Column %i resize ended, width = %i", evt.GetColumn(), evt.GetWidth()); + wxLogMessage("Column %i resize ended, width = %i", evt.GetColumn() + 1, evt.GetWidth()); evt.Skip(); } From b3f259c99cee60946ecbb2f329fa7bc994531dba Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Sun, 19 Jan 2020 14:53:33 +0100 Subject: [PATCH 3/3] Fix reverting to standard cursor in widgets sample Don't set the cursor to wxSTANDARD_CURSOR, but set it to wxNullCursor so the default system cursor is used. --- samples/widgets/widgets.cpp | 9 +++------ samples/widgets/widgets.h | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/samples/widgets/widgets.cpp b/samples/widgets/widgets.cpp index 40eedbda7b..b4d5563b1b 100644 --- a/samples/widgets/widgets.cpp +++ b/samples/widgets/widgets.cpp @@ -992,8 +992,8 @@ void WidgetsFrame::OnToggleGlobalBusyCursor(wxCommandEvent& event) void WidgetsFrame::OnToggleBusyCursor(wxCommandEvent& event) { - WidgetsPage::GetAttrs().m_cursor = *(event.IsChecked() ? wxHOURGLASS_CURSOR - : wxSTANDARD_CURSOR); + WidgetsPage::GetAttrs().m_cursor = (event.IsChecked() ? *wxHOURGLASS_CURSOR + : wxNullCursor); CurrentPage()->SetUpWidget(); } @@ -1359,10 +1359,7 @@ void WidgetsPage::SetUpWidget() (*it)->Enable(GetAttrs().m_enabled); (*it)->Show(GetAttrs().m_show); - if ( GetAttrs().m_cursor.IsOk() ) - { - (*it)->SetCursor(GetAttrs().m_cursor); - } + (*it)->SetCursor(GetAttrs().m_cursor); (*it)->SetWindowVariant(GetAttrs().m_variant); diff --git a/samples/widgets/widgets.h b/samples/widgets/widgets.h index 77d4ffe642..ffc6112688 100644 --- a/samples/widgets/widgets.h +++ b/samples/widgets/widgets.h @@ -97,7 +97,7 @@ struct WidgetAttributes m_show = true; m_dir = wxLayout_LeftToRight; m_variant = wxWINDOW_VARIANT_NORMAL; - m_cursor = *wxSTANDARD_CURSOR; + m_cursor = wxNullCursor; m_defaultFlags = wxBORDER_DEFAULT; }