|
Fenrir 님이 쓰신 글 :
: 바탕화면을 캡쳐해서 뿌려주는 프로그램 소스거든요?
:
: void __fastcall TForm1::BitBtn1Click(TObject *Sender)
: {
: // 캡쳐
: HDC DeskTopDC;
: Graphics::TBitmap *tmpBitmap = new Graphics::TBitmap();
: TMemoryStream *tmpImage = new TMemoryStream();
: DeskTopDC = GetWindowDC(GetDesktopWindow());
: tmpBitmap->Handle = CreateCompatibleBitmap(DeskTopDC,
: Screen->Width, Screen->Height);
: BitBlt(tmpBitmap->Canvas->Handle,0,0,Screen->Width,
: Screen->Height,DeskTopDC,0,0,SRCCOPY);
:
: tmpBitmap->SaveToFile("C:\\bitmap.bmp");
: tmpImage->LoadFromFile("C:\\bitmap.bmp");
:
: //화면출력
: Image1->Picture->Bitmap->LoadFromStream(tmpImage);
:
: DeleteObject(tmpBitmap->Handle);
: delete tmpBitmap;
: ReleaseDC(0, DeskTopDC);
: }
:
: 이렇게 하면 캡쳐되서 뿌려지긴 하는데
: 파일로 저장하지 않고 비트맵을 스트림으로 저장한 다음
: Image1->Picture->Bitmap->LoadFromStream(스트림); 이런식으로
: 불러올수는 없나요? 다음처럼요..
:
: void __fastcall TForm1::BitBtn1Click(TObject *Sender)
: {
: // 캡쳐
: HDC DeskTopDC;
: Graphics::TBitmap *tmpBitmap = new Graphics::TBitmap();
: TMemoryStream *tmpImage = new TMemoryStream();
: DeskTopDC = GetWindowDC(GetDesktopWindow());
: tmpBitmap->Handle = CreateCompatibleBitmap(DeskTopDC,
: Screen->Width, Screen->Height);
: BitBlt(tmpBitmap->Canvas->Handle,0,0,Screen->Width,
: Screen->Height,DeskTopDC,0,0,SRCCOPY);
:
: tmpBitmap->SaveToStream(tmpImage); // 바뀐부분
:
: //화면출력
: Image1->Picture->Bitmap->LoadFromStream(tmpImage);
:
: DeleteObject(tmpBitmap->Handle);
: delete tmpBitmap;
: ReleaseDC(0, DeskTopDC);
: }
:
: 원래 만들려는 프로그램이 클라이언트에서 바탕화면을 캡쳐해서
: 서버로 보내고 서버에서 보여주는 프로그램이거든요...
: 근데 문제가 첫번째 소스처럼 일단 파일로 저장한다음에
: 보내면 문제없이 서버에서 보여지는데..
: 두번째 처럼 스트림으로 바로 보내버리면
: invalid bitmap이라면서 보여주질 못하더라구요..
: 그렇다고 파일로 저장하고 보내자니 저장하는 시간이 아깝고..
:
: 답변을 바랍니다..
: 행복하시길~
:
:
안녕하십니까?
한꼬맹이입니다.
한가지 실수를 하신것 같군요.. 스트림은 읽어올 위치를 세팅해 주셔야 합니다.
//---------------------------------------------------
tmpBitmap->SaveToStream(tmpImage); // 바뀐부분
이줄에 "tmpImage->Position = 0;"을 추가 하세요..
//화면출력
Image1->Picture->Bitmap->LoadFromStream(tmpImage);
//-----------------------------------------------------
그럼 도움되시길...
|