C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[23328] Re:Re:[질문] PaintBox를 이용하여 특정영역을 제외하고 그리기
하느리 [handebug] 1766 읽음    2002-12-23 15:21
우선 답변주셔서 감사합니다.
영인님 조언에 따라 아래와 같이 수정하여 보았습니다.
제가 어딘가 잘못한 것 같은데, 이렇게 할 경우, 그림을 잘라오는 곳에서 오류가 발생합니다.
오류메세지는,
"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 ()부분에서 화면 번쩍임 현상이 발생한다는 것입니다. 이를 해결할 수 있는 방법이 없을까요 ?
: :

+ -

관련 글 리스트
23326 [질문] PaintBox를 이용하여 특정영역을 제외하고 그리기 하느리 866 2002/12/23
23327     Re:[질문] PaintBox를 이용하여 특정영역을 제외하고 그리기 유영인.Chris 1068 2002/12/23
23328         Re:Re:[질문] PaintBox를 이용하여 특정영역을 제외하고 그리기 하느리 1766 2002/12/23
23329             Re:Re:Re:[질문] PaintBox를 이용하여 특정영역을 제외하고 그리기 유영인.Chris 1704 2002/12/23
23332                 Re:Re:Re:Re:[질문] PaintBox를 이용하여 특정영역을 제외하고 그리기 하느리 1067 2002/12/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.