Как мне заполнить фон контекста моего устройства после прокрутки? - PullRequest
0 голосов
/ 02 июня 2018

Я создаю небольшой инструмент, помогающий создать игру.В этом инструменте мне нужно нарисовать простую блок-схему.

Для этого;Я создал приложение wxFrame.Внутри рамы находится один wxAuiNotebook.Сейчас в этом блокноте есть один пользовательский объект, который наследуется от wxScrolledWindow.

Идея состоит в том, что пользовательский объект просто нарисует мою простую блок-схему.Он наследуется от wxScrolledWindow, потому что я представляю, что потоковая диаграмма будет больше доступного пространства.

Я настроил все это в wxSmith в Code :: Blocks.

Все выглядит хорошоДо тех пор, пока я не прокручиваю.Внезапно появляется серая полоса.Я считаю, что серая полоса - это основной цвет фона.Я считаю, что это происходит, потому что я делаю вызов 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 голосов
/ 02 июня 2018

Чтобы настроить источник при рисовании на wxScrolledWindow, просто вызовите его метод PrepareDC().

Кроме того, даже если он не имеет отношения к вашей проблеме, нет причины использовать Connect()в 2018 году используйте вместо этого более простые и мощные Bind() для подключения обработчиков событий.

...