basic drag and drop implement using SetWindowLongPtr
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

118 lines
3.5 KiB

//---------------------------------------------------------------------------
/*
$Log: not supported by cvs2svn $
Revision 1.3 2005/03/08 05:55:08 nao
same strategy as aviimage using AVIStreamOpenFromFile instead of
AVIFileOpen and AVIFileGetStream for suppress of FD access?
*/
//#include <vcl.h>
#include <stdio.h>
#include <tchar.h>
#include <vfw.h>
#include "aviimage.h"
aviimage::aviimage()
{
AVIFileInit();
}
aviimage::aviimage(wchar_t* fname)
{
wVideo=~0;
AVIFileInit();
AVIStreamOpenFromFile(&pstm,fname,streamtypeVIDEO,0,OF_READ,NULL);
// AVIFileOpen(&pavi,fname,OF_READ | OF_SHARE_DENY_NONE,NULL);
// AVIFileOpen(&pavi,fname,OF_READ ,NULL);
// if (AVIFileInfo(pavi,&fi,sizeof(AVIFILEINFO))!=0)
// ShowMessage("AVIFileInfo error");
// for (dwStream=0;dwStream<fi.dwStreams;dwStream++) {
// if (AVIFileGetStream(pavi,&ptmp,0,dwStream)!=0)
// ShowMessage("");
// if (AVIStreamInfo(ptmp,&si,sizeof(AVISTREAMINFO))!=0)
// ShowMessage("");
// switch (si.fccType) {
// case streamtypeVIDEO:
// if (pstm==NULL || si.wPriority<wVideo) {
// if (pstm!=NULL)
// AVIStreamRelease(pstm);
// pstm=ptmp;
// wVideo=si.wPriority;
// }
// continue;
// }
// AVIStreamRelease(ptmp);
// }
// above code will not function in Windows XP
// it works in 95 and/or 98se mode only
//
// if(AVIFileGetStream(pavi,&pstm,streamtypeVIDEO,0)!=0)
// ShowMessage("AVIFileGetStream");
if (pstm==NULL)
ShowMessage("pstm NULL");
if ((pfrm=AVIStreamGetFrameOpen(pstm,NULL))==NULL)
ShowMessage("GetFrameOpen");
lStart=AVIStreamStart(pstm);
lEnd=AVIStreamLength(pstm)+lStart -1; // oops
if ((pbmih=(LPBITMAPINFOHEADER)AVIStreamGetFrame(pfrm,0))==NULL)
ShowMessage("GetFrame error");
frect.top = 0;
frect.left = 0;
frect.bottom = pbmih->biHeight-1;
frect.right = pbmih->biWidth-1;
}
void aviimage::saveaframe(long fnum, TMemoryStream* out)
{
BITMAPFILEHEADER bmfh;
if ((pbmih=(LPBITMAPINFOHEADER)AVIStreamGetFrame(pfrm,fnum))==NULL)
ShowMessage("GetFrame error");
bmfh.bfType=0x4d42;
bmfh.bfReserved1=bmfh.bfReserved2=0;
if (pbmih->biClrUsed==0)
switch (pbmih->biBitCount) {
case 1:bmfh.bfOffBits=sizeof(RGBQUAD)*2;break;
case 4:bmfh.bfOffBits=sizeof(RGBQUAD)*16;break;
case 8:bmfh.bfOffBits=sizeof(RGBQUAD)*256;break;
case 24:bmfh.bfOffBits=0;break;
case 16:
case 32:
bmfh.bfOffBits=pbmih->biCompression==BI_RGB?0:sizeof(DWORD)*3;
}
else
bmfh.bfOffBits=pbmih->biClrUsed*sizeof(RGBQUAD);
bmfh.bfOffBits+=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
bmfh.bfSize=bmfh.bfOffBits+(pbmih->biSizeImage==0
?((pbmih->biWidth*pbmih->biBitCount+31)&~31)/8*abs(pbmih->biHeight)
:pbmih->biSizeImage);
out->Write(&bmfh,sizeof(BITMAPFILEHEADER));
out->Write(pbmih,bmfh.bfSize-sizeof(BITMAPFILEHEADER));
out->Seek(0,soFromBeginning);
}
//---------------------------------------------------------------------------
void aviimage::finish()
{
if (AVIStreamGetFrameClose(pfrm)!=0)
ShowMessage("");
AVIStreamRelease(pstm);
AVIFileRelease(pavi);
AVIFileExit();
}