|
우선 답변주셔서 감사합니다.
영인님 조언에 따라 아래와 같이 수정하여 보았습니다.
제가 어딘가 잘못한 것 같은데, 이렇게 할 경우, 그림을 잘라오는 곳에서 오류가 발생합니다.
오류메세지는,
"Can only modify an image if it contains a bitmap"
무엇이 잘못된 것인지 모르겠습니다.
오류가 발생하는 부분은 BitBlt 부분입니다.
Image1은 아래쪽에 있는 그림입니다.
void __fastcall TForm1::Draw_Blank(int x, int y)
{
// 전체 검은색 칠하기
TRect r;
PB_Draw->Canvas->Pen->Width = 5;
PB_Draw->Canvas->Pen->Color = clBlack;
PB_Draw->Canvas->Pen->Mode = pmCopy;
PB_Draw->Canvas->Pen->Style = psSolid;
PB_Draw->Canvas->Brush->Color = clBlack;
PB_Draw->Canvas->Brush->Style = bsSolid;
r.left = 0;
r.top = 0;
r.right = Screen->Width;
r.bottom = Screen->Height;
PB_Draw->Canvas->Rectangle (r);
// 특정영역 복사
Graphics::TBitmap *bg_bmp = new Graphics::TBitmap ();
bg_bmp->Width = 100;
bg_bmp->Height = 100; //btimap 이미지의 영역크기(메모리) 변경
// bg_bmp->Dormant();
// bg_bmp->FreeImage();
BitBlt (bg_bmp->Canvas->Handle, 0, 0, bg_bmp->Width, bg_bmp->Height,
Image1->Canvas->Handle, x, y, SRCCOPY); // 오류발생부분
PB_Draw->Canvas->Draw (x, y, bg_bmp);
// bg_bmp->ReleaseHandle();
delete bg_bmp;
}
유영인.Chris 님이 쓰신 글 :
: 반대로 구현을 하시는게 훨씬 빠르지 않을까 싶네요.
:
: 우선, 검은색 배경을 모두 칠하고, 비트맵으로 원래의 이미지를 저장한 다음,
:
: 마우스 움직임에 따라서 비트맵에서 연산을 해서 원하는 부분을 잘라와서, 검은 화면 위에 뿌려주는 방식입니다.
:
:
:
: 하느리 님이 쓰신 글 :
: : 안녕하세요.
: :
: : 현재 PaintBox를 이용하여 그림을 처리하는 툴을 만들고 있는데, 마우스의 움직임에 따라 특정영역을 제외한 부분을 검은색으로 칠하는 것을 만들고 있습니다. 왜 이렇게 하느냐 하면, PaintBox 아래쪽에 있는 그림의 특정부분만을 볼려고 하는 것입니다.
: :
: : 우선 소스를 올립니다. 여기서 PB_Draw가 PaintBox입니다. 폼은 화면전체크기사이즈입니다.
: :
: : void __fastcall TForm1::PB_DrawMouseMove(TObject *Sender,
: : TShiftState Shift, int X, int Y)
: : {
: : Form1->DoubleBuffered = true;
: : Draw_Blank (X, Y);
: : }
: : void __fastcall TForm1::Draw_Blank(int x, int y)
: : {
: : TRect r;
: : PB_Draw->Refresh (); // 현재 그려져 있는 부분을 지우기
: :
: : PB_Draw->Canvas->Pen->Width = 5;
: : PB_Draw->Canvas->Pen->Color = clBlack;
: : PB_Draw->Canvas->Pen->Mode = pmCopy;
: : PB_Draw->Canvas->Pen->Style = psSolid;
: : PB_Draw->Canvas->Brush->Color = clBlack;
: : PB_Draw->Canvas->Brush->Style = bsSolid;
: :
: : r.left = 0;
: : r.top = 0;
: : r.right = Screen->Width;
: : r.bottom = y;
: : PB_Draw->Canvas->Rectangle (r);
: :
: : r.left = 0;
: : r.top = y;
: : r.right = x;
: : r.bottom = y+100;
: : PB_Draw->Canvas->Rectangle (r);
: :
: : r.left = x+100;
: : r.top = y;
: : r.right = Screen->Width;
: : r.bottom = y+100;
: : PB_Draw->Canvas->Rectangle (r);
: :
: : r.left = 0;
: : r.top = y+100;
: : r.right = Screen->Width;
: : r.bottom = Screen->Height;
: : PB_Draw->Canvas->Rectangle (r);
: : }
: :
: : 여기서 문제는 PB_Draw->Refresh ()부분에서 화면 번쩍임 현상이 발생한다는 것입니다. 이를 해결할 수 있는 방법이 없을까요 ?
: :
|