读书人

怎样等图片完全送显后进行其他操作amp;怎

发布时间: 2012-03-16 16:34:56 作者: rapoo

怎样等图片完全送显后进行其他操作&怎样对一次动态创建的N个Form再进行后续的操作?
如题,在向Image控件加载一张jpg图片时需要一定时间解码然后送显,这让我所需要进行的下一个动作变得失败:
SingleFileName=FileList-> FileName;
PictureView-> Image1-> Picture-> LoadFromFile(SingleFileName);
ShowCalArea(clRed,psDot,10,10,50,50);
其中ShowCalArea()只是一个画矩形的小函数:
void ShowCalArea(TColor color,TPenStyle style,int x1,int y1,int x2,int y2)
{
PictureView-> Canvas-> Pen-> Width=1;
PictureView-> Canvas-> Pen-> Color=color;
PictureView-> Canvas-> Pen-> Style=style;
PictureView-> Canvas-> Brush-> Style=bsClear;
PictureView-> Canvas-> Rectangle(x1,y1,x2,y2);
}
在运行时是先画出了矩形框,然后显示图片盖住了前面画出的框。用了下面的延时函数(i_love_pc(杰子)在其他贴在中贴的代码)后,哪怕是只Delay(1);都可以同时画出来呢?
void Delay(DWORD DT)
{
long tt;
tt=GetTickCount();
while(GetTickCount()-tt <DT)
{
Application-> ProcessMessages();
if((GetTickCount()-tt) <=0)
{
tt=GetTickCount();
}
}
}

还有就是,加入我用下面这个自己写的函数同时动态创建几个Form,后面怎样再对它进行其他操作?我不大懂怎样取得每个Form的地址,并用这个地址或者其他什么对它进行操作,比如加一些控件,象上面一样话图形等等。哪位强人请教教我吧!
void NewFormCreat(int number)
{
//If PictureView-> FormStyle=fsMDIForm is set at first,
//the picture won 't be shown.
PictureView-> FormStyle=fsMDIForm;

//New a form in PictureView dynamicly.
NewForm=new TForm(Application);
NewForm-> Caption=number;
NewForm-> FormStyle=fsMDIChild;
NewForm-> BorderStyle=bsSingle;

//Removes the maximize button.
TBorderIcons tmpBI=NewForm-> BorderIcons;
tmpBI> > biMaximize;
NewForm-> BorderIcons=tmpBI;



NewForm-> ClientHeight=480;
NewForm-> ClientWidth=640;
//btn-> OnClick=Form1-> MyEvent;

//New a image in the NewForm.
TImage *NewImage=new TImage(NewForm);
NewImage-> Parent=NewForm;
NewImage-> Height=NewForm-> ClientHeight;
NewImage-> Width=NewForm-> ClientWidth;
NewImage-> Stretch=true;
NewImage-> Picture-> LoadFromFile( "d:\\sn.jpg ");
NewForm-> Show();
NewForm-> OnClose=PictureView-> FormClose;
}

[解决办法]
将一个form最大化时触发什么事件啊?
在OnResize里
[解决办法]
1.没看明白
2.使用TList保存窗体对象数组指针,使用的时候动态转换
3.OnResize事件里判断窗体的WindowState属性
[解决办法]
第一个问题:
PictureView的Canvas和PictureView-> Image1-> Canvas不是同一个Canvas,
因而可能会产生时序上的问题.
你把PictureView-> Canvas改为PictureView-> Image1-> Canvas就不会产生上述问题.
另外PictureView应该是个TForm吧,Form的Canvas没有记忆功能,如果必须要在Form的Canvas
中画框,那正确的方法应该在需要重绘窗口的时候(OnPaint,OnResize...)重新ShowCalArea;
第二个问题:
你可以用一个指针数组保存你的Form窗体指针,如:
TPictureView *FormList[100];
for(i=0;i <n;i++)
{ FormList[i]=new TPictureView(this);
FormList[i]-> Formstyle=....
......
}

最后释放:
for(i=0;i <n;i++)
{ delete FormList[i];
}

[解决办法]
你用TJPEGImage对象试试
示例代码
#include <jpeg.hpp>
.....
{
TJPEGImage *Jpeg=new TJPEGImage();
Jpeg-> LoadFromFile(FileName);
Image1-> Width=Jpeg-> Width;
Image1-> Height=Jpeg-> Height;
Image1-> Canvas-> Draw(0,0,Jpeg);
ShowCalArea(clRed,psDot,10,10,500,500); //函数中PictureView-> Canvas应改为PictureView-> Image1-> Canvas
delete Jpeg;
}


读书人网 >C++ Builder

热点推荐