Q_Jizi(七之子)的专栏

计算机视觉相关博客:http://cvart.blog.163.com/

ubuntu下codeblocks起步(七)-下

上两篇都做完后就可以开始我们的绘图函数了:给主窗体添加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型的,也就无所谓了。不过还是要慎用哦。

 
阅读更多
想对作者说点什么? 我来说一句

codeblocks下图形编程起步

2013年05月07日 3.35MB 下载

ubuntucodeblocks起步(三)

Q_Jizi Q_Jizi

2007-10-01 00:50:00

阅读数:3010

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭