为什么在运行中不能显示出来? (双屏缓冲)

bill_anson 2005-12-12 07:00:24
void __fastcall TForm1::Button1Click(TObject *Sender)
{

int FWidth = 0;
int FHeight = 0;

Graphics::TBitmap *FBMP = new Graphics::TBitmap;
FBMP->LoadFromFile("D:\\asap.bmp");
FHeight = FBMP->Height;
FWidth = FBMP->Width;
HDC DestDC = Image1->Canvas->Handle;
HDC WorkDC = CreateCompatibleDC(DestDC);


SelectObject(WorkDC, FBMP->Handle);



for (int i = 0; i <= FHeight -1 ; i++)
{


BitBlt(DestDC, 0, 0, FWidth, i, WorkDC, 0, FHeight - i, SRCCOPY);
Sleep(10);
//Application->ProcessMessages();
//Image1->Refresh();
}
}


而改成为 就行了,为什么

void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{

int FWidth = 0;
int FHeight = 0;

Graphics::TBitmap *FBMP = new Graphics::TBitmap;
FBMP->LoadFromFile("D:\\asap.bmp");
FHeight = FBMP->Height;
FWidth = FBMP->Width;


Image1->Canvas->Brush->Color = clBlack;
Image1->Canvas->FillRect(Image1->ClientRect);
this->DoubleBuffered = true;

for (int i = 0; i <= FHeight -1 ; i++)
{

TRect sur = TRect(0, 0, FWidth, i);
TRect des = TRect(0, FHeight - i, FWidth, FHeight);
Image1->Canvas->CopyRect(sur, FBMP->Canvas, des);


Image1->Refresh();
}
}
...全文
231 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jishiping 2006-01-09
  • 打赏
  • 举报
回复
楼主的那段代码,初看没有问题,但是实际上问题的。
1、Image1->Canvas->Handle 实际上是 Image1->Bitmap->Handle,也就是说,你使用BitBlt时,仅仅是将 FBMP 的图像复制到 Image1->Bitmap中,但是并没有Image1在Form上的图像。
2、如果你在BitBlt之后加上Image1->Refresh(),那么还是不行,原因在于 Image1->Canvas->Handle 是动态产生的,VCL内部会动态释放Canvas->Handle。当你调用Image1->Refresh() 后,Image1->Canvas->Handle 已经变化了,一开始取得的句柄已经是非法的了,所以从循环的第二次开始DestDC就是非法的句柄,因而BitBlt也就无效了。鱿鱼第一次循环i为0,所以第一次执行BitBlt时也没有复制任何内容。如果你将循环的i的促使值改为1,那么你就会看到第一次的BitBlt有效了。正确的代码,应该是:
//......
for (int i = 0; i <= FHeight -1 ; i++)
{
BitBlt(Image1->Canvas->Handle, 0, 0, FWidth, i, WorkDC, 0, FHeight - i, SRCCOPY);
Sleep(10);
Image1->Refresh();
Application->ProcessMessages(); //这一行视乎你的需要,最好加上
}

或者是:

//......
for (int i = 0; i <= FHeight -1 ; i++)
{
DestDC = Image1->Canvas->Handle; //重新取得Canvas->Handle
BitBlt(DestDC, 0, 0, FWidth, i, WorkDC, 0, FHeight - i, SRCCOPY);
Sleep(10);
Image1->Refresh();
Application->ProcessMessages(); //这一行视乎你的需要,最好加上
}
mugi 2005-12-28
  • 打赏
  • 举报
回复
for (int i = 0; i <= FHeight -1 ; i++)
{

TRect sur = TRect(0, 0, FWidth, i);
TRect des = TRect(0, FHeight - i, FWidth, FHeight);
Image1->Canvas->CopyRect(sur, FBMP->Canvas, des);

// 这里加上这句:
Application->ProcessMessages();
Image1->Refresh();
}
bill_anson 2005-12-13
  • 打赏
  • 举报
回复
应该不是兼容的问题,因为最后,还是显示出来了,只是 在Image上无法显示其下移的过程,但
在 Form的Canvas上却能显示其下移的过程.
alloutoflove 2005-12-13
  • 打赏
  • 举报
回复
第一个不行可能因为FBMP和WorkDC是不兼容的吧.
bill_anson 2005-12-13
  • 打赏
  • 举报
回复
不是这个问题.而是图片一次就出来了,没有那过程.加了Image1->Refresh() 等也没用.
GaoLun 2005-12-12
  • 打赏
  • 举报
回复
你是不是说上边的图片在移动的时候,有闪烁,
上边那段程序里 加如
this->DoubleBuffered = true;

应该也是可以的
bill_anson 2005-12-12
  • 打赏
  • 举报
回复
程序的意图是 图片向下移.

要显示移动的过程.

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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