怎样更改这个循环

daohaosima007 2010-07-30 02:03:30
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
static int i=1;
Canvas-> Pen-> Color=clBlack;
Canvas-> Pen-> Style=psSolid;
Canvas-> Ellipse(300-i*3,300-i*3,300+i*3,300+i*3);
i++;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled=true;
}
//---------------------------------------------------------------------------





程序很简单 点击Button后 在Image1中就出现了在指定点位置逐渐放大的圆 但是现在的问题是 它停不下来了 = =
还有一个问题是 能不能让他放大到最大值(也就是Image1的边缘后 又开始新的一轮放射过程呢?)


之前问过关于画圆的问题比较纠结 这个问题应该相对简单 求教~ 先谢谢啦
...全文
147 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
daohaosima007 2010-08-02
  • 打赏
  • 举报
回复

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
static int i=1;
Canvas-> Pen-> Color=clBlack;
Canvas-> Pen-> Style=psSolid;
Canvas-> Ellipse(300-i*3,300-i*3,300+i*3,300+i*3);
i++;
if( i > 10 )
i = 1,Image1->Canvas->FillRect(Image1-> ClientRect); //加上后面半句,最外面的圆也会消失。
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled=true;<开始>
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Timer1->Enabled=false;//<暂停>
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Image1->Canvas->FillRect(Image1-> ClientRect); //<刷新>若想让此处刷新成与背景相同的颜色,那么应将Image的Transparent属性应改为TRUE!
}
//---------------------------------------------------------------------------

daohaosima007 2010-08-02
  • 打赏
  • 举报
回复
恩 谢谢大哥还关注小弟。

但。。。什么意思啊?

是说把
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Timer1->Enabled=false;//<暂停>
}
中的“Timer1->Enabled=false”改为“Timer->Enabled = !Timer->Enabled”?没明白啊 = =
draculamx 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ruoleng 的回复:]
引用 12 楼 jone7319 的回复:
Timer->Enabled=!Timer->Enabled;

不能的
Timer->Enabled 永远等于 Timer->Enabled
倒可以
Timer->Enabled = !Timer->Enabled
取下反嘛,管他 ture 还是false
[/Quote]

貌似你看得不仔细啊。。。
Function_ShiLei 2010-08-01
  • 打赏
  • 举报
回复
要有全局变量记录画的位置
还有这个Canvas是TForm的Canvas吧?窗体重绘后画的东西都没有了。
雨海 2010-08-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jone7319 的回复:]
Timer->Enabled=!Timer->Enabled;
[/Quote]
不能的
Timer->Enabled 永远等于 Timer->Enabled
倒可以
Timer->Enabled = !Timer->Enabled
取下反嘛,管他 ture 还是false
雨海 2010-08-01
  • 打赏
  • 举报
回复
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
static int i=1;
Canvas-> Pen-> Color=clBlack;
Canvas-> Pen-> Style=psSolid;
Canvas-> Ellipse(300-i*3,300-i*3,300+i*3,300+i*3);
i++;
if( i > 100 )
i = 1;
}
100可以根据你的边缘修改
draculamx 2010-07-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 onmyway001 的回复:]
提供点意见
if(Timer->Enabled == true)
Timer->Enabled= false;
if(Enabled == false)
Timer->Enabled= true;
这样 再点击的时候就停了。
[/Quote]

能不能直接写成:

Timer->Enabled=!Timer->Enabled;

貌似清晰很多。。。
jone7319 2010-07-30
  • 打赏
  • 举报
回复

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Timer1->Interval=1000;
Form1->DoubleBuffered=true;
const double Pi=3.1415926;
double x0=500,y0=400;
static int i=0;
int maxi=50; //这个值你根据你的情况自己定
if(i>maxi) //这里将重新从最小圆开始画
{
i=0;
Image1->Canvas->FillRect(Rect(0,0,1000,1000));
}

i+=5;

double r=i*10; //下面画图的方法你可以改成你自己的方式
for(double j=0;j<=360;j++)
{
double x=x0+r*cos(j*Pi/180),y=y0+r*sin(j*Pi/180);
if(j==0)
Image1->Canvas->MoveTo(x,y);
Image1->Canvas->LineTo(x,y);
//Sleep(10);//暂停一下,呵呵,所谓动画
Application->ProcessMessages();
}

}

CppFile 2010-07-30
  • 打赏
  • 举报
回复
图片的transparent设置为true即可解决白色背景的问题
daohaosima007 2010-07-30
  • 打赏
  • 举报
回复
恩 是的 但是问题不太一样
1。你用数学方法画的 但是我想通过这种方式解决这个圆的问题
2。循环问题没有解决,而且其实不需要暂停的,就让圆慢慢放射 到达Image的边际之后又回到圆心 开始新的放射 这样循环往复。
3。刷新界面遇到了7楼中同样的问题 变白了...
[Quote=引用 8 楼 jone7319 的回复:]
这个问题在你先前发的贴里我已帮你写好了,自己去看一下。
[/Quote]
jone7319 2010-07-30
  • 打赏
  • 举报
回复


//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <math.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool start=false;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Timer1->Interval=1000;
Form1->DoubleBuffered=true;
const double Pi=3.1415926;
double x0=500,y0=400;
static int i=0;

if(start)
{
i=0;
start=false;
}

i+=5;

double r=i*10;
for(double j=0;j<=360;j++)
{
double x=x0+r*cos(j*Pi/180),y=y0+r*sin(j*Pi/180);
if(j==0)
Image1->Canvas->MoveTo(x,y);
Image1->Canvas->LineTo(x,y);
//Sleep(10);//暂停一下,呵呵,所谓动画
Application->ProcessMessages();
}

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender) //暂停(继续)按钮
{
Timer1->Enabled=!Timer1->Enabled;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Timer1->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender) //重绘按钮
{
Timer1->Enabled=false;
Image1->Canvas->FillRect(Rect(0,0,1000,1000));
start=true;

}
//---------------------------------------------------------------------------



jone7319 2010-07-30
  • 打赏
  • 举报
回复
这个问题在你先前发的贴里我已帮你写好了,自己去看一下。
daohaosima007 2010-07-30
  • 打赏
  • 举报
回复

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
static int i=1;
Canvas-> Pen-> Color=clBlack;
Canvas-> Pen-> Style=psSolid;
Canvas-> Ellipse(300-i*3,300-i*3,300+i*3,300+i*3);
i++;

if(i>5)
{
Timer1->Enabled = false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Image1->Canvas->FillRect(Image1-> ClientRect);
}
//---------------------------------------------------------------------------


1。能保证圈的大小 但是无法循环啊 = =
2。对于FillRect的用法...是这样么?像是覆盖 但是Image的区域确实白色 不是透明 (这个函数不大会使)
[Quote=感谢 3、4 楼 大哥大姐 的回复:]

[/Quote]
CppFile 2010-07-30
  • 打赏
  • 举报
回复

int x1;
int y1;
int x2;
int y2;

void __fastcall TForm1::btn2Click(TObject *Sender)
{
tmr1->Enabled=true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::tmr1Timer(TObject *Sender)
{
static int i=1;
//img1->Canvas->Brush->Color =clRed;

img1->Canvas-> Pen-> Color=clBlack;
img1->Canvas-> Pen-> Style=psSolid;
x1=30-i*3;
y1=30-i*3;
x2=30+i*3;
y2=30+i*3;
if(x1<0 || y1<0 || x2>img1->Width || y2>img1->Height )
{
//超出范围
btn2->Caption="超出范围";
i=1;
TRect rect;

rect.left=0;
rect.top=0;
rect.right=img1->Width;
rect.Bottom =img1->Height;
img1->Canvas->FillRect(rect);
return;
}
img1->Canvas-> Ellipse(x1,y1,x2,y2);
i++;

}
//----------
daohaosima007 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 onmyway001 的回复:]
刚才手残了 Enabled 写成了Edabled
鄙视下自己
[/Quote]
呵呵 没事儿 我已经人工修改了 哈哈



恩 我去看看
[Quote=引用 3 楼 onmyway001 的回复:]

在定时器里面加好了 判断一下 i的值 在Enabled =false;[/Quote]
CppFile 2010-07-30
  • 打赏
  • 举报
回复
1,到边缘重新开始的问题,需要判断画圆的2个参数,左上角和右下角是否超出了image的范围,如果超过,则需要把图片用背景色填充(清空图片),然后,重新从小到大画
清空图片可以用FillRect..函数来做
onmyway001 2010-07-30
  • 打赏
  • 举报
回复
在定时器里面加好了 判断一下 i的值 在Enabled =false;
刚才手残了 Enabled 写成了Edabled
鄙视下自己
daohaosima007 2010-07-30
  • 打赏
  • 举报
回复

谢谢 不过我还是想不用点击就能解决 [Quote=引用 1 楼 onmyway001 的回复:]
提供点意见
if(Timer->Edabled == true)
Timer->Edabled = false;
if(Timer->Edabled == false)
Timer->Edabled = true;
这样 再点击的时候就停了。
[/Quote]
onmyway001 2010-07-30
  • 打赏
  • 举报
回复
提供点意见
if(Timer->Edabled == true)
Timer->Edabled = false;
if(Timer->Edabled == false)
Timer->Edabled = true;
这样 再点击的时候就停了。
就是要流量 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊大家多给评论 点赞 关注啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧