Я создаю небольшой инструмент, помогающий создать игру.В этом инструменте мне нужно нарисовать простую блок-схему.
Для этого;Я создал приложение wxFrame
.Внутри рамы находится один wxAuiNotebook
.Сейчас в этом блокноте есть один пользовательский объект, который наследуется от wxScrolledWindow
.
Идея состоит в том, что пользовательский объект просто нарисует мою простую блок-схему.Он наследуется от wxScrolledWindow
, потому что я представляю, что потоковая диаграмма будет больше доступного пространства.
Я настроил все это в wxSmith в Code :: Blocks.
Все выглядит хорошоДо тех пор, пока я не прокручиваю.Внезапно появляется серая полоса.Я считаю, что серая полоса - это основной цвет фона.Я считаю, что это происходит, потому что я делаю вызов DrawRect
, чтобы заполнить фон белым прямоугольником.Я полагаю, что не правильно определяю происхождение и объем моего DrawRect
вызова.
Вы можете видеть на моей картинке, что когда-то прокручивалвниз у меня появляется серый фон.
Вот код моего пользовательского элемента управления:
struct StoryNodeData
{
wxString title;
wxString text;
};
class StoryNode
{
public:
void Paint(wxGraphicsContext* gc) const
{
gc->SetBrush(*wxTRANSPARENT_BRUSH);
gc->SetPen(*wxBLACK_PEN);
gc->DrawRoundedRectangle(m_point.x,m_point.y,m_size.x,m_size.y,10);
gc->Clip(m_point.x,m_point.y,m_size.x,m_size.y);
gc->DrawText(m_nodeData.title,m_point.x + 5, m_point.y + 5);
gc->DrawText(m_nodeData.text,m_point.x + 5, m_point.y + 20);
gc->ResetClip();
}
StoryNodeData m_nodeData;
wxPoint m_point;
wxSize m_size;
};
class FlowchartPanel : public wxScrolledWindow
{
public:
FlowchartPanel(wxWindow* parent, wxWindowID id, wxPoint position, wxSize size, long style)
:
wxScrolledWindow(parent, id, position, size, style)
{
Connect(wxEVT_PAINT, wxPaintEventHandler(FlowchartPanel::OnPaint));
Connect(wxEVT_SIZE, wxSizeEventHandler(FlowchartPanel::OnSize));
Connect(wxEVT_SCROLLWIN_TOP, wxScrollWinEventHandler(FlowchartPanel::OnScroll));
Connect(wxEVT_SCROLLWIN_BOTTOM, wxScrollWinEventHandler(FlowchartPanel::OnScroll));
Connect(wxEVT_SCROLLWIN_LINEUP, wxScrollWinEventHandler(FlowchartPanel::OnScroll));
Connect(wxEVT_SCROLLWIN_LINEDOWN , wxScrollWinEventHandler(FlowchartPanel::OnScroll));
Connect(wxEVT_SCROLLWIN_PAGEUP , wxScrollWinEventHandler(FlowchartPanel::OnScroll));
Connect(wxEVT_SCROLLWIN_PAGEDOWN , wxScrollWinEventHandler(FlowchartPanel::OnScroll));
Connect(wxEVT_SCROLLWIN_THUMBTRACK , wxScrollWinEventHandler(FlowchartPanel::OnScroll));
Connect(wxEVT_SCROLLWIN_THUMBRELEASE , wxScrollWinEventHandler(FlowchartPanel::OnScroll));
}
void OnScroll(wxScrollWinEvent& event)
{
wxScrolledWindow::HandleOnScroll(event);
Refresh();
Update();
}
void OnSize(wxSizeEvent& event)
{
Refresh();
}
void OnPaint(wxPaintEvent& event)
{
wxPaintDC dc(this);
PrepareDC(dc);
auto gc = wxGraphicsContext::Create(dc);
if(!gc)
return;
gc->SetFont(*wxNORMAL_FONT,*wxBLACK);
gc->SetBrush(*wxWHITE_BRUSH);
auto min = DoSizeCalc();
auto sz = GetSize();
auto st = dc.GetDeviceOrigin();
if(min.x < sz.x)
min.x = sz.x;
if(min.y < sz.y)
min.y = sz.y;
gc->DrawRectangle(st.x,st.y,min.x,min.y);
for(const auto& n : m_nodes)
n.Paint(gc);
delete gc;
}
void AddNode(const StoryNode node)
{
m_nodes.push_back(node);
auto sz = DoSizeCalc();
SetScrollbars(10,10,sz.x/10,sz.y/10,0,0);
}
wxSize DoSizeCalc()
{
wxSize min(0,0);
for(const auto& n : m_nodes)
{
auto extentX = n.m_point.x + n.m_size.x;
auto extentY = n.m_point.y + n.m_size.y;
if(extentX > min.x)
min.x = extentX;
if(extentY > min.y)
min.y = extentY;
}
return min;
}
protected:
std::vector<StoryNode> m_nodes;
};
Я пробовал несколько разных методов, чтобы определить правильное происхождение и размермоего белого прямоугольника, но никто не работает.Я добавил пользовательские обработчики событий для событий прокрутки, думая, что, возможно, мне просто нужно было вызвать перерисовку.
Любая помощь приветствуется.