循环中画的点怎样才能画一个显示一个,而不是一下子显示出来?(100分)

  • 主题发起人 主题发起人 lesley_1
  • 开始时间 开始时间
L

lesley_1

Unregistered / Unconfirmed
GUEST, unregistred user!
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(int i=0;i<Image1->Height;i++)
{
for(int j=0;j<Image1->Width;j++)
{
Image1->Canvas->Pixel[j] = clRed;
//Application->ProcessMessages();
}
//Application->ProcessMessages();
}
}


代码如上,画的图要等所有的点全部画完才一下子显示出来,
如果加上Application->ProcessMessages();
则可以逐个点显示,但速度太慢,不行。
怎样才能画一个点显示一个点呢,又不影响速度呢?
 
你可以每3个点显示一下,速度不就加快3倍了吗
 
如果直接使用IMGAGE控件,则在设置点的颜色的时候可能会涉及到很多其他的东西,因此你
看是否可以首先声明一个BMP,然后在BMP的CANVAS上画点,然后使用BITBLT函数将图贴到
IMAGE上。
一般情况下如果我做画图的软件的话,我会采用TPAINTBOX来做,这个东东比较简练,速度足够
快,只是需要在初始化或者更改的时候保存当前图象到一个BMP上,然后在WMPAINT中完成
对PAINTBOX的BLT,速度非常流畅
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(int i=0;i<Image1->Height;i++)
{
for(int j=0;j<Image1->Width;j++)
{
Image1->Canvas->Pixel[j] = clRed;
Image1->Refresh;
//Application->ProcessMessages();
}
//Application->ProcessMessages();
}
}
 
解决了,用线程,Jufeng_zhu的方法也可以,不过还要改其他东西,比较麻烦
void __fastcall TForm1::Button4Click(TObject *Sender)
{
DWORD ThreadID;
HANDLE ht;
ht=::CreateThread(0,0,ThreadFunc,0,0,&amp;ThreadID);
if(!ht)
{
Application->MessageBox("Failed to creat thread!","Error",MB_OK+MB_ICONERROR);
return;
}

}
//---------------------------------------------------------------------------
DWORD CALLBACK ThreadFunc(void *P)
{
for(int i=0;i<Form1->Image1->Height;i++)
{
for(int j=0;j<Form1->Image1->Width;j++)
{
Form1->Image1->Canvas->Pixels[j] = clRed;
Form1->Image1->Canvas->Pixels[j] = clRed;
//Sleep(1);
}
//Sleep(1);

}
Form1->Image1->Invalidate();
return 0;
}
 

Similar threads

I
回复
0
查看
612
import
I
I
回复
0
查看
732
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
843
import
I
后退
顶部