上两篇都做完后就可以开始我们的绘图函数了:给主窗体添加OnPaint函数,添加代码:
void drawingFrame::OnPaint(wxPaintEvent& event)
{
wxPaintDC dc(this);
//画直线
if(m_UserShape == _T("直线"))
{
dc.SetPen(pen);
dc.DrawLine( m_SX , m_SY,m_EX, m_EY );
}
//画圆
if(m_UserShape == _T("圆"))
{
dc.SetPen( pen );
dc.SetBrush( brush );
dc.DrawCircle(m_SX, m_SY, m_EX);
}
//画椭圆
if(m_UserShape == _T("椭圆"))
{
dc.SetPen( pen );
dc.SetBrush( brush );
dc.DrawEllipse(m_SX , m_SY,m_EX, m_EY );
}
//下面是wxGTK-2.8.6的samples里面的一个实例,
//把它放在这,大家参考一下。
if(m_UserShape == _T("图形实例"))
{
#if wxUSE_SPLINES
dc.DrawText(_T("Some splines"), 10, 5);
// values are hardcoded rather than randomly generated
// so the output can be compared between native
// implementations on platforms with different random
// generators
const int R = 300;
const wxPoint center( R + 20, R + 20 );
const int angles[7] = { 0, 10, 33, 77, 13, 145, 90 };
const int radii[5] = { 100 , 59, 85, 33, 90 };
const int n = 200;
wxPoint pts[n];
// background spline calculation
unsigned int radius_pos = 0;
unsigned int angle_pos = 0;
int angle = 0;
for ( int i = 0; i < n; i++ )
{
angle += angles[ angle_pos ];
int r = R * radii[ radius_pos ] / 100;
pts[ i ].x = center.x + (wxCoord)( r * cos( M_PI * angle / 180.0) );
pts[ i ].y = center.y + (wxCoord)( r * sin( M_PI * angle / 180.0) );
angle_pos++;
if ( angle_pos >= WXSIZEOF(angles) ) angle_pos = 0;
radius_pos++;
if ( radius_pos >= WXSIZEOF(radii) ) radius_pos = 0;
}
// background spline drawing
dc.SetPen(*wxRED_PEN);
dc.DrawSpline(WXSIZEOF(pts), pts);
// less detailed spline calculation
wxPoint letters[4][5];
// w
letters[0][0] = wxPoint( 0,1); // O O
letters[0][1] = wxPoint( 1,3); // * *
letters[0][2] = wxPoint( 2,2); // * O *
letters[0][3] = wxPoint( 3,3); // * * * *
letters[0][4] = wxPoint( 4,1); // O O
// x1
letters[1][0] = wxPoint( 5,1); // O*O
letters[1][1] = wxPoint( 6,1); // *
letters[1][2] = wxPoint( 7,2); // O
letters[1][3] = wxPoint( 8,3); // *
letters[1][4] = wxPoint( 9,3); // O*O
// x2
letters[2][0] = wxPoint( 5,3); // O*O
letters[2][1] = wxPoint( 6,3); // *
letters[2][2] = wxPoint( 7,2); // O
letters[2][3] = wxPoint( 8,1); // *
letters[2][4] = wxPoint( 9,1); // O*O
// W
letters[3][0] = wxPoint(10,0); // O O
letters[3][1] = wxPoint(11,3); // * *
letters[3][2] = wxPoint(12,1); // * O *
letters[3][3] = wxPoint(13,3); // * * * *
letters[3][4] = wxPoint(14,0); // O O
const int dx = 2 * R / letters[3][4].x;
const int h[4] = { -R/2, 0, R/4, R/2 };
for ( int m = 0; m < 4; m++ )
{
for ( int n = 0; n < 5; n++ )
{
letters[m][n].x = center.x - R + letters[m][n].x * dx;
letters[m][n].y = center.y + h[ letters[m][n].y ];
}
dc.SetPen( wxPen( wxT("blue"), 1, wxDOT) );
dc.DrawLines(5, letters[m]);
dc.SetPen( wxPen( wxT("black"), 4, wxSOLID) );
dc.DrawSpline(5, letters[m]);
}
#else
dc.DrawText(_T("Splines not supported."), 10, 5);
#endif
}
}
最后头文件要
#include "MyDialog.h"
#include "CircleDialog.h"
#include "RangeDialog.h"
#include <wx/dialog.h>
#include <wx/colour.h>
#include <wx/dcclient.h>
#include <stdlib.h>
OK,程序到此就结束了,编译运行,各个界面运行结果如下:
主窗体:
画直线:
画椭圆:
画圆:
图形实例:
参考:
http://www.wxwidgets.org/manuals/2.8.0/wx_wxdc.html
http://www.wxwidgets.org/manuals/2.8.0/wx_wxpaintdc.html
最后说一下ubuntu下code::blocks的wxString转int型的问题。wxString类本身没有转换为int的方法,到网上查了下,网友建议用下面的方法转换:
int x; wxString string;
x = atoi(string.c_str());
我试了下,在ubuntu下仍然报错。但wxString类有转换为double的方法(http://www.wxwidgets.org/manuals/2.8.0/wx_wxstring.html)。于是我们就可以用double类型转换一下。
自定义一个转换函数:
int wxStringToInt(wxString str)
{
double temp;
int result;
str.ToDouble(&temp);
result = int(temp); //强制转换
return result;
}
但这样转换的缺陷也是显而易见的,将double强制转换为int,小数点后面的数就都被舍掉了。如果你的输入也都是int型的,也就无所谓了。不过还是要慎用哦。