在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()
以强制更新 wxFrame
。 wxButton
属于 wxPanel
,它是 wxFrame
的子项。
但是,当我点击按钮时,没有任何反应,也没有显示任何文字。
我自己解决了这个问题。
由于 wxPanel
是 wxFrame
的唯一子节点,它将自动覆盖 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()
,它会立即调用你的处理程序。
我想在单击按钮时绘制一些文本。我的代码是:
#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()
以强制更新 wxFrame
。 wxButton
属于 wxPanel
,它是 wxFrame
的子项。
但是,当我点击按钮时,没有任何反应,也没有显示任何文字。
我自己解决了这个问题。
由于 wxPanel
是 wxFrame
的唯一子节点,它将自动覆盖 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()
,它会立即调用你的处理程序。