滚动后如何填写设备上下文的背景?

时间:2018-06-02 04:04:12

标签: wxwidgets

我正在制作一个小工具来帮助构建游戏。在这个工具中,我需要绘制一种简单的流程图。

要做到这一点;我创建了一个wxFrame应用。框架内部是一个wxAuiNotebook。现在有一个自定义对象,它继承自这个笔记本中的wxScrolledWindow

这个想法是自定义对象只会绘制我的简单流程图。它继承自wxScrolledWindow因为我认为流程图将大于可用空间。

我已经在Code :: Blocks中的wxSmith中设置了这一切。

一切都很好看,直到我滚动。突然间,有一个灰色的酒吧。我相信灰色条是底层的背景颜色。我相信它正在通过,因为我正在进行DrawRect调用,用白色矩形填充背景。我相信我没有正确确定DrawRect电话的来源和范围。

enter image description here

你可以在我的照片中看到,一旦向下滚动,我就会有灰色的背景。

以下是我的自定义控件的代码:

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;
};

我尝试了几种不同的方法来确定白色矩形的正确原点和大小但没有效果。我已经为滚动事件添加了自定义事件处理程序,可能我只需要强制重绘。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

要在wxScrolledWindow上绘图时调整原点,只需调用其PrepareDC()方法。

此外,即使它与您的问题无关,也没有理由在2018年使用Connect(),使用更简单,功能更强大的Bind()来连接您的事件处理程序。