wxWidgets学习笔记四

本文介绍如何使用wxWidgets进行基本绘图操作,包括画点、线、矩形及多边形,并详细展示了鼠标与键盘事件的处理方法。通过具体实例代码,读者可以了解如何响应各种鼠标操作和键盘输入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2010-7-20

1. //dc.DrawPoint(100, 100);画点

2. dc.DrawLine(0, 0, 300, 300);//前面是start coord,后面是end coord

3. dc.SetBrush(wxBrush(*wxRED,wxBDIAGONAL_HATCH));//设置画刷(相当于填充)为红色,反斜线画刷

dc.DrawRectangle(50, 50, 150, 100);//画矩形

4. dc.DrawRoundedRectangle(50,50,150,100,10);//画圆角矩形

void wxDC::DrawRoundedRectangle ( wxCoord x,

wxCoord y,

wxCoord width,

wxCoord height,

double radius )

5.

下面这个是用来绘制多边形的函数:

void DrawPolygons(wxDC& dc)

{

dc.SetPen(*wxWHITE);

wxBrush brushHatch(*wxRED, wxCROSSDIAG_HATCH);

dc.SetBrush(brushHatch);

wxPoint star[5];

star[0] = wxPoint(100, 60);

star[1] = wxPoint(60, 150);

star[2] = wxPoint(160,100);

star[3] = wxPoint(40, 100);

star[4] = wxPoint(140, 150);

dc.DrawPolygon(WXSIZEOF(star)/*点的个数*/, star/*包含各个点的数组*/, 0, 30);

dc.DrawPolygon(WXSIZEOF(star), star, 160, 30, wxWINDING_RULE);

wxPoint star2[10];

star2[0] = wxPoint(0, 100);

star2[1] = wxPoint(-59, -81);

star2[2] = wxPoint(95, 31);

star2[3] = wxPoint(-95, 31);

star2[4] = wxPoint(59, -81);

star2[5] = wxPoint(0, 80);

star2[6] = wxPoint(-47, -64);

star2[7] = wxPoint(76, 24);

star2[8] = wxPoint(-76, 24);

star2[9] = wxPoint(47, -64);

int count[2] = {5, 5};

dc.DrawPolyPolygon(WXSIZEOF(count), count, star2, 450, 150);}

41.

void drawmap(wxDC& dc)//绘画图片

{

wxBitmap bmp(wxT(quit_xpm),wxBITMAP_TYPE_PNG);

dc.DrawBitmap(bmp, 250, 100, true);

}

6. 需要注意的是,wxMouseEvent事件是不会传递给父窗口处理的,所以,为了处理这个事件,你必须重载一个新的窗口类,或者重载一个新的wxEvtHandler,然后将其挂载在某个窗口上,当然你还可以使用动态事件处理函数Connect

7. 处理鼠标事件的宏:

EVT_LEFT_DOWN(func)

用来处理wxEVT_LEFT_DOWN事件, 在鼠标左键按下的时候产生.

EVT_LEFT_UP(func)

用来处理wxEVT_LEFT_UP事件, 在鼠标左键被释放的时候产生.

EVT_LEFT_DCLICK(func)

用来处理wxEVT_LEFT_DCLICK事件,在鼠标左键被双击的时候产生.

EVT_MIDDLE_DOWN(func)

用来处理wxEVT_MIDDLE_DOWN事件, 在鼠标中键被按下的时候产生.

EVT_MIDDLE_UP(func)

用来处理wxEVT_MIDDLE_UP事件,当鼠标中键被释放的时候产生.

EVT_MIDDLE_DCLICK(func)

用来处理wxEVT_MIDDLE_DCLICK事件,在鼠标中键被双击的时候产生.

EVT_RIGHT_DOWN(func)

用来处理wxEVT_RIGHT_DOWN事件,鼠标右键被按下的时候产生.

EVT_RIGHT_UP(func)

用来处理wxEVT_RIGHT_UP事件,鼠标右键被释放的时候产生.

EVT_RIGHT_DCLICK(func)

用来处理wxEVT_RIGHT_DCLICK事件,鼠标右键被双击的时候产生.

EVT_MOTION(func)

用来处理wxEVT_MOTION事件,鼠标指针移动的时候产生.

EVT_ENTER_WINDOW(func)

用来处理wxEVT_ENTER_WINDOW事件,鼠标指针移入某个窗口的时候产生.

EVT_LEAVE_WINDOW(func)

用来处理wxEVT_LEAVE_WINDOW事件,鼠标移出某个窗口的时候产生.

EVT_MOUSEWHEEL(func)

用来处理wxEVT_MOUSEWHEEL事件,鼠标滚轮滚动的时候产生.

EVT_MOUSE_EVENTS(func)

用来处理所有的鼠标事件.

8. 你还可以用下面的函数来或者鼠标事件的类型:Dragging (某个键正按下时鼠标移动), Moving (鼠标正在移动而没有鼠标键被按下), Entering, Leaving, ButtonDown, ButtonUp, ButtonDClick, LeftClick, LeftDClick, LeftUp, RightClick, RightDClick, RightUp, ButtonUpIsButton.

9. 你可以使用GetPosition函数或者GetXGetY函数获取鼠标指针当前的设备单位位置也可以给GetLogicalPosition函数传递某个设备上下文参数以便得到对应的逻辑位置

10. 要想接收到键盘事件,你的窗口必须拥有键盘焦点,这可以通过函数wxWindow::SetFocus

11. 要判断在按键的时候是否有状态键按下,可以使用AltDown, MetaDown, ControlDown或者ShiftDown函数. HasModifiers函数在有Control或者Alt键按下的时候返回True(不包括ShiftMeta).

12. 如果你在键盘事件处理函数中没有调用event.Skip()函数,对应的字符事件将不会产生.在某些平台上,全局的快捷键也会不起作用

13.

14. 实现上图画的线的代码如下,没按下A就会在鼠标的位置和原点之间划下一条线。

void MyFrame::OnChar(wxKeyEvent& event)

{

wxClientDC dc(this);//设置一个设备上下文

wxPen pen(*wxWHITE,1);

dc.SetPen(pen);//白色画笔

if(event.ShiftDown())//按下shift键画一条线

{

dc.DrawLine(event.GetX(),event.GetY(),0,0);

}

int code=event.GetKeyCode();//获取按下按键的编码

if(code==65)//当按下A键(ASCII码为)时,在y=位置画一条线

{

dc.DrawLine(event.GetX(),event.GetY(),0,0);

}

15. }

16.

void MyFrame::OnMousePrc(wxMouseEvent&event)//鼠标消息处理

{

wxPoint pt(event.GetPosition());//获取当前坐标pt

wxClientDC dc(this);//设置一个设备上下文

if(event.LeftDown())

{

wxPen pen(*wxWHITE,1);

dc.SetPen(pen);//白色画笔

dc.SetBrush(*wxBLACK_BRUSH);

dc.DrawCircle(event.GetX(),event.GetY(),10);//当鼠标左键点击位置在(,)后面时用白色画笔画线

}

if(event.LeftUp())

{

wxPen pen2(*wxGREEN,1);

dc.SetPen(pen2);

dc.SetBrush(*wxGREEN_BRUSH);

dc.SetBackgroundMode(wxSOLID);

dc.DrawCircle(event.GetX(),event.GetY(),15);//当鼠标左键弹起时,用红色画笔画线

}

17. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值