在wxWidgets中单击按钮时如何绘制一些文本?

How to draw some text when click a button in wxWidgets?

我想在单击按钮时绘制一些文本。我的代码是:

#include <wx/wx.h>

enum
{
    BUTTON_Hello = wxID_HIGHEST + 1
};
class myFrame : public wxFrame {
public:
    wxButton* HelloWorld;
    wxPanel* panel;

    void OnPaint(wxCommandEvent& event) {

        wxClientDC bdc =wxClientDC(this);
        bdc.DrawText(wxString("Draw some text when button clicked."), wxPoint(300, 300));

        Refresh();
    };

    myFrame(wxWindow* parent,
        wxWindowID id,
        const wxString& title,
        const wxPoint& pos = wxDefaultPosition,
        const wxSize& size = wxDefaultSize) :
        wxFrame(parent,id,title, pos, size) {

        panel =new wxPanel(this, wxID_ANY, wxPoint(0,0),wxSize(100,100));
        //Connect(wxEVT_PAINT, wxPaintEventHandler(myFrame::OnPaint));
        HelloWorld = new wxButton(panel, BUTTON_Hello, _T("Hello World"),
            wxPoint(5,5), wxSize(100, 100));
        HelloWorld->Bind(wxEVT_BUTTON, &myFrame::OnPaint, this);

    };

};


class MyApp : public wxApp
{
    bool OnInit() {
        frame = new myFrame((wxFrame*)NULL, -1, wxT("Hello wxDC"),
            wxPoint(50, 50), wxSize(800, 600));
        frame->Show();
        return true;
    };

    wxFrame* frame;

public:

};

IMPLEMENT_APP(MyApp)


我在 wxFrame 中定义绘图函数并使用 Bind() 将其绑定到 wxButton。绘图函数使用了wxClientDC。我添加了 Refersh() 以强制更新 wxFramewxButton 属于 wxPanel,它是 wxFrame 的子项。

但是,当我点击按钮时,没有任何反应,也没有显示任何文字。

我自己解决了这个问题。 由于 wxPanelwxFrame 的唯一子节点,它将自动覆盖 wxFrame 的整个区域。现在借鉴 wxFrame 必然没有效果。所以我必须借鉴 wxPanel:

    void paintNow(wxCommandEvent& event) {

        wxClientDC bdc =wxClientDC(panel);
        bdc.DrawText(wxString("Draw some texts when button clicked."), 
            wxPoint(300, 300));

        //panel->Refresh();
        panel->Update();
    };

我还发现如果我同时使用 Refresh()Update(),将不会显示任何文本。

如果我只使用 Refresh(),则不会显示任何文字。

wxEVT_PAINT 处理程序中绘图时,您 必须 使用 wxPaintDC,而不是 wxClientDC。虽然 wxClientDC 也 "works",至少现在和至少在某些平台下,这绝对不是正确的做法。

当使用 wxPaintDC 时,Refresh() 将按预期工作,并会在下一次事件循环迭代期间调用您的绘制处理程序。通常你根本不需要调用 Update(),它会立即调用你的处理程序。