首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

怎样等图片完全送显后进行其他操作&怎样对一次动态创建的N个Form再进行后续的操作?解决方法

2012-03-16 
怎样等图片完全送显后进行其他操作&怎样对一次动态创建的N个Form再进行后续的操作?如题,在向Image控件加载

怎样等图片完全送显后进行其他操作&怎样对一次动态创建的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;
}


热点排行