Created
March 7, 2024 02:13
-
-
Save kahuz/e6bd59dfc27de54a037a37e2bae2ea89 to your computer and use it in GitHub Desktop.
Sample to verify wxGridBagSizer behaviour.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
///////////////////////////////////////////////////////////////////////////// | |
// Name: minimal.cpp | |
// Purpose: Minimal wxWidgets sample | |
// Author: Julian Smart | |
// Modified by: | |
// Created: 04/01/98 | |
// Copyright: (c) Julian Smart | |
// Licence: wxWindows licence | |
///////////////////////////////////////////////////////////////////////////// | |
// ============================================================================ | |
// declarations | |
// ============================================================================ | |
// ---------------------------------------------------------------------------- | |
// headers | |
// ---------------------------------------------------------------------------- | |
// For compilers that support precompilation, includes "wx/wx.h". | |
#include "wx/wxprec.h" | |
// for all others, include the necessary headers (this file is usually all you | |
// need because it includes almost all "standard" wxWidgets headers) | |
#ifndef WX_PRECOMP | |
#include "wx/wx.h" | |
#endif | |
#include "wx/gbsizer.h" | |
// ---------------------------------------------------------------------------- | |
// resources | |
// ---------------------------------------------------------------------------- | |
// the application icon (under Windows it is in resources and even | |
// though we could still include the XPM here it would be unused) | |
#ifndef wxHAS_IMAGES_IN_RESOURCES | |
#include "../sample.xpm" | |
#endif | |
// ---------------------------------------------------------------------------- | |
// private classes | |
// ---------------------------------------------------------------------------- | |
// Define a new application type, each program should derive a class from wxApp | |
class MyApp : public wxApp | |
{ | |
public: | |
// override base class virtuals | |
// ---------------------------- | |
// this one is called on application startup and is a good place for the app | |
// initialization (doing it here and not in the ctor allows to have an error | |
// return: if OnInit() returns false, the application terminates) | |
virtual bool OnInit() wxOVERRIDE; | |
}; | |
const int kGridCellWidth = 24; | |
const int kGridCellHeight = 18; | |
// Define a new frame type: this is going to be our main frame | |
class MyFrame : public wxFrame | |
{ | |
private: | |
struct DrawingLayoutInfo_ | |
{ | |
wxPoint pos{ 0,0 }; | |
wxSize size{ 0,0 }; | |
wxColour color{ wxT("#000000") }; | |
}; | |
const int kDefaultPenThickness = 1; | |
public: | |
// ctor(s) | |
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); | |
void DrawSizerLayout(wxPanel* basePanel, const int& drawAreaWidth, const int& drawAreaHeight); | |
// event handlers (these functions should _not_ be virtual) | |
void OnQuit(wxCommandEvent& event); | |
void OnAbout(wxCommandEvent& event); | |
private: | |
void AddDrawLayouts_(wxPanel* baseWindow, const std::vector<DrawingLayoutInfo_>& layoutInfos, bool forceDraw) | |
{ | |
baseWindow->Bind(wxEVT_PAINT, [this, baseWindow, layoutInfos](wxPaintEvent& inEvent) | |
{ | |
wxPaintDC dc(baseWindow); | |
dc.SetBrush(*wxTRANSPARENT_BRUSH); | |
for (auto layoutInfo : layoutInfos) | |
{ | |
dc.SetPen(wxPen(layoutInfo.color, kDefaultPenThickness)); | |
dc.DrawRectangle({ layoutInfo.pos.x,layoutInfo.pos.y }, layoutInfo.size); | |
} | |
} | |
); | |
if (forceDraw) | |
{ | |
baseWindow->Refresh(); | |
baseWindow->Update(); | |
} | |
} | |
// any class wishing to process wxWidgets events must use this macro | |
wxDECLARE_EVENT_TABLE(); | |
}; | |
// ---------------------------------------------------------------------------- | |
// constants | |
// ---------------------------------------------------------------------------- | |
// IDs for the controls and the menu commands | |
enum | |
{ | |
// menu items | |
Minimal_Quit = wxID_EXIT, | |
// it is important for the id corresponding to the "About" command to have | |
// this standard value as otherwise it won't be handled properly under Mac | |
// (where it is special and put into the "Apple" menu) | |
Minimal_About = wxID_ABOUT | |
}; | |
// ---------------------------------------------------------------------------- | |
// event tables and other macros for wxWidgets | |
// ---------------------------------------------------------------------------- | |
// the event tables connect the wxWidgets events with the functions (event | |
// handlers) which process them. It can be also done at run-time, but for the | |
// simple menu events like this the static method is much simpler. | |
wxBEGIN_EVENT_TABLE(MyFrame, wxFrame) | |
EVT_MENU(Minimal_Quit, MyFrame::OnQuit) | |
EVT_MENU(Minimal_About, MyFrame::OnAbout) | |
wxEND_EVENT_TABLE() | |
// Create a new application object: this macro will allow wxWidgets to create | |
// the application object during program execution (it's better than using a | |
// static object for many reasons) and also implements the accessor function | |
// wxGetApp() which will return the reference of the right type (i.e. MyApp and | |
// not wxApp) | |
wxIMPLEMENT_APP(MyApp); | |
// ============================================================================ | |
// implementation | |
// ============================================================================ | |
// ---------------------------------------------------------------------------- | |
// the application class | |
// ---------------------------------------------------------------------------- | |
// 'Main program' equivalent: the program execution "starts" here | |
bool MyApp::OnInit() | |
{ | |
// call the base class initialization method, currently it only parses a | |
// few common command-line options but it could be do more in the future | |
if ( !wxApp::OnInit() ) | |
return false; | |
// create the main application window | |
MyFrame *frame = new MyFrame("Minimal wxWidgets App", wxDefaultPosition, wxSize(600,500)); | |
// and show it (the frames, unlike simple controls, are not shown when | |
// created initially) | |
frame->Show(true); | |
// success: wxApp::OnRun() will be called which will enter the main message | |
// loop and the application will run. If we returned false here, the | |
// application would exit immediately. | |
return true; | |
} | |
// ---------------------------------------------------------------------------- | |
// main frame | |
// ---------------------------------------------------------------------------- | |
// frame constructor | |
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) | |
: wxFrame(NULL, wxID_ANY, title, pos, size) | |
{ | |
// set the frame icon | |
SetIcon(wxICON(sample)); | |
#if wxUSE_MENUBAR | |
// create a menu bar | |
wxMenu *fileMenu = new wxMenu; | |
// the "About" item should be in the help menu | |
wxMenu *helpMenu = new wxMenu; | |
helpMenu->Append(Minimal_About, "&About\tF1", "Show about dialog"); | |
fileMenu->Append(Minimal_Quit, "E&xit\tAlt-X", "Quit this program"); | |
// now append the freshly created menu to the menu bar... | |
wxMenuBar *menuBar = new wxMenuBar(); | |
menuBar->Append(fileMenu, "&File"); | |
menuBar->Append(helpMenu, "&Help"); | |
// ... and attach this menu bar to the frame | |
SetMenuBar(menuBar); | |
#else // !wxUSE_MENUBAR | |
// If menus are not available add a button to access the about box | |
wxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); | |
wxButton* aboutBtn = new wxButton(this, wxID_ANY, "About..."); | |
aboutBtn->Bind(wxEVT_BUTTON, &MyFrame::OnAbout, this); | |
sizer->Add(aboutBtn, wxSizerFlags().Center()); | |
SetSizer(sizer); | |
#endif // wxUSE_MENUBAR/!wxUSE_MENUBAR | |
struct MyPanel : wxPanel { | |
explicit MyPanel(wxWindow* parent, const wxPoint& pos, const wxSize& size) | |
: wxPanel(parent, wxID_ANY, pos, size) | |
{ | |
SetBackgroundColour(wxT("#AAAAAA")); | |
wxSize tmpSize{ 50,14 }; | |
auto btnOne_ = new wxButton(this, wxID_ANY, "ButtonOne", wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); | |
btnOne_->SetBackgroundColour(wxT("#CCCCCC")); | |
auto staticTextOne_ = new wxStaticText(this, wxID_ANY, "Static Text Two", wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); | |
staticTextOne_->SetBackgroundColour(wxT("#CCCCCC")); | |
auto bitmapBtnOne_ = new wxBitmapButton(this, wxID_ANY, wxNullBitmap, wxDefaultPosition, tmpSize, wxBORDER_NONE); | |
bitmapBtnOne_->SetBackgroundColour(wxT("#CCCCCC")); | |
auto btnTwo_ = new wxButton(this, wxID_ANY, "ButtonOne", wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); | |
btnTwo_->SetBackgroundColour(wxT("#CCCCCC")); | |
auto staticTextTwo_ = new wxStaticText(this, wxID_ANY, "Static Text Two", wxDefaultPosition, wxDefaultSize, wxBORDER_NONE); | |
staticTextTwo_->SetBackgroundColour(wxT("#CCCCCC")); | |
auto bitmapBtnTwo_ = new wxBitmapButton(this, wxID_ANY, wxNullBitmap, wxDefaultPosition, tmpSize, wxBORDER_NONE); | |
bitmapBtnTwo_->SetBackgroundColour(wxT("#CCCCCC")); | |
wxBoxSizer* baseSizer = new wxBoxSizer(wxVERTICAL); | |
wxGridBagSizer* gridBagSizer = new wxGridBagSizer(0, 0); | |
gridBagSizer->SetEmptyCellSize(wxSize(kGridCellWidth, kGridCellHeight)); | |
gridBagSizer->Add(btnOne_, wxGBPosition(1, 1), wxGBSpan(1, 3), wxALL, 0); | |
gridBagSizer->Add(staticTextOne_, wxGBPosition(1, 5), wxGBSpan(1, 3), wxALL, 0); | |
gridBagSizer->Add(bitmapBtnOne_, wxGBPosition(1, 9), wxGBSpan(1, 6), wxALL, 0); | |
gridBagSizer->Add(btnTwo_, wxGBPosition(5, 1), wxGBSpan(1, 3), wxALL, 0); | |
gridBagSizer->Add(staticTextTwo_, wxGBPosition(5, 5), wxGBSpan(1, 3), wxALL, 0); | |
gridBagSizer->Add(bitmapBtnTwo_, wxGBPosition(5, 9), wxGBSpan(1, 6), wxALL, 0); | |
baseSizer->Add(gridBagSizer, 1, wxALL, 0); | |
SetSizer(baseSizer); | |
} | |
}; | |
const int panelWidth = 400; | |
const int panelHeight = 300; | |
auto myPanel = new MyPanel(this, wxDefaultPosition, wxSize(panelWidth, panelHeight)); | |
DrawSizerLayout(myPanel, panelWidth, panelHeight); | |
#if wxUSE_STATUSBAR | |
// create a status bar just for fun (by default with 1 pane only) | |
CreateStatusBar(2); | |
SetStatusText("Welcome to wxWidgets!"); | |
#endif // wxUSE_STATUSBAR | |
} | |
void MyFrame::DrawSizerLayout(wxPanel* basePanel, const int& drawAreaWidth, const int& drawAreaHeight) | |
{ | |
std::vector<DrawingLayoutInfo_> dawingLayoutInfos; | |
int columnWidth = kGridCellWidth; | |
int columnHeight = kGridCellHeight; | |
int drawLimitColumnIdx = drawAreaWidth / columnWidth; | |
int drawLimitRowIdx = drawAreaHeight / columnHeight; | |
wxColour drawColour = { wxT("#AA0000") }; | |
for (int rowIdx = 0; rowIdx < drawLimitRowIdx; ++rowIdx) | |
{ | |
for (int drawColumn = 1; drawColumn <= drawLimitColumnIdx; ++drawColumn) | |
{ | |
dawingLayoutInfos.emplace_back(DrawingLayoutInfo_{ { 0, rowIdx * (columnHeight - 1) },{ columnWidth * drawColumn, columnHeight }, drawColour }); | |
} | |
} | |
AddDrawLayouts_(basePanel, dawingLayoutInfos, true); | |
} | |
// event handlers | |
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) | |
{ | |
// true is to force the frame to close | |
Close(true); | |
} | |
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) | |
{ | |
wxMessageBox(wxString::Format | |
( | |
"Welcome to %s!\n" | |
"\n" | |
"This is the minimal wxWidgets sample\n" | |
"running under %s.", | |
wxGetLibraryVersionInfo().GetVersionString(), | |
wxGetOsDescription() | |
), | |
"About wxWidgets minimal sample", | |
wxOK | wxICON_INFORMATION, | |
this); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment