죄송하지만 C++ 빌더소스예요..ㅠ_ㅠ
그래도 비슷하니. ^^;;
바탕화면을 캡쳐해서 뿌려주는 프로그램 소스거든요?
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이라면서 보여주질 못하더라구요..
그렇다고 파일로 저장하고 보내자니 저장하는 시간이 아깝고..
답변을 바랍니다..
행복하시길~
이렇게 해보시면 될것같은데...
음... 스트림이라는게 원래 파일처럼 똑같은 거라...
제가 보기엔 SaveTOstream후에 스트림의 포지션을 0으로
맞춰줘야할 것 같군요..
맞는지는 모르겠지만...
savetostream후에..
tmpImage->position = 0;
을 추가하시면 될듯 싶죠?
Fenrir wrote:
> 죄송하지만 C++ 빌더소스예요..ㅠ_ㅠ
> 그래도 비슷하니. ^^;;
> 바탕화면을 캡쳐해서 뿌려주는 프로그램 소스거든요?
>
> 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이라면서 보여주질 못하더라구요..
> 그렇다고 파일로 저장하고 보내자니 저장하는 시간이 아깝고..
>
> 답변을 바랍니다..
> 행복하시길~