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, ButtonUp和IsButton等.
9. 你可以使用GetPosition函数或者GetX和GetY函数获取鼠标指针当前的设备单位位置也可以给GetLogicalPosition函数传递某个设备上下文参数以便得到对应的逻辑位置
10. 要想接收到键盘事件,你的窗口必须拥有键盘焦点,这可以通过函数wxWindow::SetFocus
11. 要判断在按键的时候是否有状态键按下,可以使用AltDown, MetaDown, ControlDown或者ShiftDown函数. HasModifiers函数在有Control或者Alt键按下的时候返回True(不包括Shift和Meta键).
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. }