|
안녕하세요 지난번에 폼에 그림그리기 질문 "39207 - 답변" 정말 감사드립니다..
결국 스크롤 박스와 TImage를 사용하여 스크롤 이 되게 하였습니다..
근데 여기서 약간의 문제가 생기는군여
화면에 그리고 스크롤은 되는데 가끔 11M짜리 bmp를 읽어드리는데 가끔 이것이 읽어지지 않을때가 있습니다..
몇번 반복해서 읽으면 처음은 되나 3번째 정도 부터 이미지가 나오지 않고 화면이 흰색으로 변하더군
그리고 메모리가 계속 증가하는것을 느낄수 있었습니다.. 약 0.1메가정도씩 분명 파일을 닫을때 메모리는 다 풀어주는
이상하더군여 그리고 vs에서는 f4누르면 에러난부분으로 점프가 되는데 빌더에서는 이런단축키가없는지여 찾아봐도 없고 검색해도 도통 안나오더군여 아시는분좀 가르쳐 주세요
지난번이랑 바뀐부분은
---화면에 bmp그리기 ---
HDC hdc;
//이미지 내용지우기
SMain->Image1->Canvas->FillRect(SMain->Image1->Canvas->ClipRect); <-결국 무식하게 지우고 있습니다.
//SMain->Image1->Picture->Assign(NULL);
hdc = SMain->Image1->Picture->Bitmap->Canvas->Handle;
SMain->bmp.DrawBitmapDC(hdc,0,0);
------
이고 bmp로딩 부분은
----bmp 선언부
public: *filename;
BITMAPFILEHEADER *bmpfh; //비트맵 파일 해더
BITMAPINFOHEADER *bmpih; //비트맵 해더 정보
RGBQUAD *rgbq;
BYTE *img;
----bmp 읽어오기
//KMsg msg;
byte *buffer;
FILE *fp;
unsigned short bitcount= 0;
DWORD size;
ResetBmp();
if(!(fp=fopen(filename,"rb")))
{
//msg->Message(NULL,"%s 읽기 실패",filename);
return 1;
}
if(!(bmpfh = (BITMAPFILEHEADER *)malloc(sizeof(BITMAPFILEHEADER))))
{
fclose(fp);
return 2;
}
if(!(fread(bmpfh,sizeof(BITMAPFILEHEADER),1,fp)))
{
//ResetBmp();
fclose(fp);
return 3;
}
if(bmpfh->bfType != 0x4D42)
{
//ResetBmp();
fclose(fp);
return 4;
}
//BITMAPINFORHEADER의 메모리만 확보
size = bmpfh->bfOffBits-sizeof(BITMAPFILEHEADER);
if(!(bmpih = (BITMAPINFOHEADER *)malloc(size)))
{
//ResetBmp();
fclose(fp);
return 5;
}
if(!fread(bmpih,size,1,fp))
{
//ResetBmp();
fclose(fp);
return 6;
}
if(bmpih->biCompression) //압축되지 않은 파일만
{
//ResetBmp();
fclose(fp);
return 7;
}
if(bmpih->biSize != sizeof(BITMAPINFOHEADER))
{
//ResetBmp();
fclose(fp);
return 8;
}
//압축 타입 판별
switch(bmpih->biBitCount)
{
case 1:
bitcount = 2;
break;
case 4:
bitcount = 16;
break;
case 8:
bitcount = 256;
break;
case 24:
case 32:
bitcount = 0;
break;
default:
//ResetBmp();
fclose(fp);
return 9;
}
//RGBQUAD 얻어오기
if(bitcount)
{
buffer = (byte *)bmpih;
rgbq = (RGBQUAD *)(buffer+sizeof(BITMAPINFOHEADER));
}
size = bmpih->biSizeImage;
if(size ==0)
{
size = ((DWORD)bmpih->biWidth*bmpih->biBitCount+31)/32*4;
size = size *bmpih->biHeight; //압축안됨
}
if(!(img = (BYTE *)malloc(size)))
{
//ResetBmp();
fclose(fp);
return 10;
}
fread(img,size,1,fp);
fclose(fp);
if(!(filename = (char *)malloc(strlen(filename)+1)))
{
//ResetBmp();
return 11;
}
strcpy(filename,filename);
return 0;
-----------------
이렇게 합니다. 처음에 초기화를 다시켜주고 만약 에러가 나면 메모리는다 리셋됩니다...
|