안녕하세요?
보이지 않는 scrollbox 영역에 있는 모든 내용을
하나의 이미지 파일로 저장하려고 하는데
어케 해야하는지 감이 안잡힙니다.
아래와 같이 하면 보이는 보분은 이미지로 캡춰가 잘 되지만....
여기서 더 이상 진도가 못나가고 있습니다.
주말동안 인터넷을 누비고 찾아 다녔지만 결국 해결하지 못했습니다.
여러 고수님들의 많은 지도 편달과 도움을 부탁드립니다.
미리 감사드립니다...
procedure Tform1.Button1Click(Sender: TObject);
var dc : HDC;
iBmp : TBitmap;
begin
dc := GetDC(scrollbox1.Handle);
iBmp := TBitmap.Create;
iBmp.Width := scrollbox1.Width;
iBmp.Height := scrollbox1.Height+1000;
BitBlt(iBmp.Canvas.Handle, 0, 0, iBmp.Width, iBmp.Height, dc, 0, 0, SRCCOPY);
iBmp.SaveToFile('c:\mymymy.bmp');
iBmp.Free;
ReleaseDC(scrollbox1.Handle, dc);
end;
ScrollBox의 안보이는 영역에 control의 이미지까지 캡쳐 하는것은 위방법으로는 안됩니다.
[보통 컨트롤 캡쳐할때]
보통 컨트롤의 화면을 캡쳐할때 위방식을 이용합니다만
vcl에서 제공하는 방법중에 PaintTo라는 메소드가 있습니다.
procedure TForm1.Button1Click(Sender: TObject);
var
bmp: TBitmap;
begin
bmp:=TBitmap.create;
bmp.width:=Panel1.Width;
bmp.Height:=Panel1.Height;
Panel1.PaintTo(bmp.Canvas.Handle,0,0 ); //함수1 DC를 넘기기도하고
Panel1.PaintTo(bmp.Canvas,0,0 ); //함수2 Canvas를 넘길수도 있음
end;
PaintTo 함수는 TWinControl에 있는 함수로써 모든 핸들이 있는 control에 사용할수 있습니다.
그런데 Controls유닛에서 TWinControl.PaintTo 함수를 살펴보면
WM_PAINT 메세지를 보내면서 wParam으로 dc를 보내서 캡쳐하는 합니다.
Perform(WM_PAINT, DC, 0); //
즉 직접 코딩하다면
Panal1.Perform(WM_PAINT, bmp.Canvas.Handle, 0); //뭐 이런식이 되죠
[GetFormImage 함수를 보면..]
VCL에는 GetFormImage라는 함수가 있습니다.
이 함수의 동작으로 보면
1. bitmap을 자신의 크기만큼 생성하고
2. 자신을 bitmap에 그리고
3. 자신위에 있는 모든 control에 루프를 돌리면서 PaintTo를 호출합니다.
이 GetFormImage를 GetPanelImage함수를 만들어 본적이 있죠
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=753
[ScrollBox 안보이는 영역까지 캡쳐]
위 GetFormImage함수의 원리를 이용하여
ScrollBox위에 이미지를 캡쳐하려면
1. bitmap을 생성하다
2. bitmap의 크기를 scrollbox의 안보이는 크기까지 계산해서 잡는다.
(ScrollBox.HorzScrollBar.Range , ScrollBox.VertScrollBar.Range)
3. scrollbox를 bitmap에 그린다.
4. scrollbox위에 있는 모든 control에 offset을 계산해서 PaintTo를 호출해준다.
이 원리로 한번 해보십시요
하다가 안되면 Naver에서 GetScrollBoxImage를 검색해보세요
그럼..