wxWidget wxScrolledWindow取消上一个绘图

时间:2014-06-25 14:49:58

标签: c++ scroll panel wxwidgets

我试图获得一个滚动面板,我可以在MS Paint上绘制图片 问题在于,当我画一些东西来尝试应用程序时:

  1. 我画了一个矩形(或多个)
  2. 我向右滚动面板,矩形保持在左侧
  3. 我向左滚动面板,矩形消失
  4. 我是wx的新手,我想我错过了一些重要的事情 在Codelite(C ++)中使用wxWidget,Windows 7 32位

    那是代码:

    editorshp.h

    class EditorShp : public wxFrame {
        protected:
            wxClientDC *dcPannelloDisegno;
            wxScrolledWindow *scrollwin;
            wxPanel *pannello;
    
        public:
            EditorShp( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Editor SHP"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 800,500 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
    
            void draw_temp(wxCommandEvent& WXUNUSED(event));
        };
    

    editorshp.cpp
    PS:bDrawTemp是我用来绘制一些矩形的按钮(第一个是100,100点;第二个是200,100,依此类推)

    EditorShp::EditorShp( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style ) {
    
        scrollwin = new wxScrolledWindow(this, -1, wxPoint(0, 0), wxSize(700, 400));
        scrollwin->SetScrollbars(1, 1, 1600, 1000, 0, 0);
    
        pannello = new wxPanel(scrollwin, -1, wxPoint(0, 0), wxSize(700, 400), wxFULL_REPAINT_ON_RESIZE);
        dcPannelloDisegno = new wxClientDC(pannello);
        scrollwin->DoPrepareDC(*dcPannelloDisegno);
    
        wxButton *bDrawTemp= new wxButton( this, wxID_ANY, _("Indietro"), wxPoint(0, 400), wxSize( 100, 24 ), 0 );
        bDrawTemp->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(EditorShp::disegnaTemp), NULL, this);
    
        scrollwin->Show(true);
        this->Show(true);
    }
    
    void EditorShp::draw_temp(wxCommandEvent& WXUNUSED(event)){
        static int x = 100, y = 100;
    
        dcPannelloDisegno->DrawRectangle(wxPoint(x, y), wxSize(10, 10));
        //pannello->Refresh(); it cancels everything
        pannello->Update();
    
        x += 100;
        x = x % 1600;
    }
    

    编辑1:抱歉,它不是wxScrollingPanel而是 wxScrolledWindow

1 个答案:

答案 0 :(得分:2)

首先,使用wxEVT_PAINT(或其中一个变体 - wxPaintDC)捕捉wx[Auto]BufferedPaintDC并在其hadler中绘图。 其次,您现在正试图在pannello上绘画,为此您不需要准备wxDC。但是,根据您的描述,您想要在scrollwin上绘画,在这种情况下,您甚至可能不需要pannello

因此,要在滚动窗口上绘图,请参阅wxW附带的scroll示例。您可能需要的是MySimpleCanvas的实现(描述为a scrolled window which draws a simple rectangle) - 在运行示例时看到它F1

作为一般规则,样本应该是搜索功能的第一个地方;那里有很多例子。