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
[51604] Re:Re:Re:감사합니다. 그런데 제가 원하는 것은...
장성호 [nasilso] 2509 읽음    2007-12-13 14:22
음...

[폼 캡쳐]

    VCL에서는 GetFormImage()라는 함수를 제공합니다.
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        Graphics::TBitmap *bmp=GetFormImage();
        Form2->Image1->Picture->Bitmap->Assign(bmp);
        Form2->Image1->AutoSize=true;
        Form2->Show();
        delete bmp;
    }

[Panel을 일부 구멍 ]
   말을 잘못한것 같네요 투명이 아니라 완전히 구멍을 내는것입니다.

   Panel도 윈도우입니다. 윈도우에 구멍을 낸다던가?
   윈도우를 xp스타일로  사각 가장자리에 라운드 처리한다던가 하는 얘기는 들어보셨죠?
    //라운드 샘플..
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
        HRGN rgn=CreateRoundRectRgn(0,0,Width,Height,50,50);
        SetWindowRgn(Handle,rgn,0);
        DeleteObject(rgn);
    }
   // CreateRoundRectRgn 에서 맨뒷쪽 값을 조정하면 round정도가 조절됩니다.

    HRGN 을 만들어서 윈도우에 셋하면 윈도우를 구멍을 낼수도 있고
    원하는 모양대로 만들수 있습니다.
    
    CreateRectRgn ,  CombineRgn ,  이 두함수를 이용해서
    가운데 뚤린 사각형 HRGN을 만들어서 SetWindowRgn 하면 됩니다.
      CombineRgn 으로 여기 검색해 보세요 많이 나올겁니다.


그럼..     
 
     

해리 님이 쓰신 글 :
: 개략적인 아이디어는 이해를 하겠는데,
: 폼을 어떻게 캡쳐하죠?
: 그리고 한가지 Panel 의 canvas 의 일부를 투명하게 할 수 있나요?
:
: 감사합니다.
: 해리.
:
: 장성호 님이 쓰신 글 :
: : 음... 저도 그렇게는 해보지 않았네요
: : Delphi 나 BCB에서 Design타임때  그리기를 어떻게 하는지도 잘 모르겠구요
: :
: : 생각나는 방법을 말씀드리면
: :
: : [방법1]
: : 0. Select는 Control의 DC에 기본적으로 그리구요
: : 1. 움직이기 직전에 폼 전체를  캡쳐해 둡니다.
: : 2. 그리고 동적으로 Panel같은 Control을 생성해서 폼의 맨앞에 폼의 Client에 꽉차게 만들구요
: : 3. 그 동적 생성한 Panel위에 캡쳐한 Image를 draw합니다.
: : 4. 그런다음 Panel위에 원하는 이미지를 그리고
: : 5. 마우스를 이동하면 이동한 만큼 옮겨주고... 하면 될것 같습니다.
: :
: : [방법2]
: : 1. Select는 Control의 DC에 기본적으로 그리구요
: : 2. 투명 윈도우를  현재 폼과 같은 크기로 만들어서 현재폼 앞에 띄웁니다.
: : 3. 그런다음 투명윈도우에다가 Select한 Control을 그리고
: : 4. MouseMove때  투명윈도우에 Control을 움직인 위치로 다시 그려주면 될것 같습니다.
: :    ( 여기서 투명윈도우란 알파속성이 적용된것이 아니라 TransparentColor가 적용된 폼입니다.)
: :  
: :   ; 이방법으로 하면 active윈도우가 바뀌어버리겠죠..
: :
: : [방법3]
: : 1. DeskTop Canvas에 직접 Draw하는것도 괜찮을것 같습니다.
: : 2. 단 현재 폼위에만 그려야 하므로 ClipCursor로 마우스가 Form의 Client영역을 벗어나지 않도록 주의하시구요
: :      Draw할때도 그부분을 신경쓰셔야 하여야 할것 같구요...
: :
: :
: : [방법4] - 추가
: : 1. 방법1과 같이 또다른 컨트롤을 이용하는데요
: : 2. 폼 이미지를 캡쳐하는것이 아니라 폼을 투명하게 짤라서 만듭니다.
: :     관련 api는 
: :     CreateRectRgn ,  CombineRgn ,  SetWindowRgn  등이 있습니다.
: : 3.  ClipCursor로 마우스 움직임을 제한해야 하는것은 똑같구요
: :
: :
: : [기타]
: :    - hint윈도우 같은것을 이용해서도 할수 있을것 같습니다.
: :
: :     
: : 음... 나중에 추가한 방법4가 잘 만들면 가장 깔끔하게 나올것도 같네요
: :
: :
: : 간단한 방법이 있을것 같은데... 잘모르겠네요
: : 언제 시간날때 함 연구해 봐야겠네요
: :
: :
: :
: :
: : 해리 님이 쓰신 글 :
: : : 대단히 감사합니다.
: : : 예제대로 해 봤더니 잘 동작하네요. 새로운 것을 배웠습니다.
: : : 한가지, TEdit 의 Border는 영역에서 제외가 되서 그 안쪽에만 그릴 수가 있더군요.
: : :
: : : 그런데 제가 실제로 원하는 것은,
: : : 폼 위에 여러개의 컴포넌트들을 올려 놓고 이들을 disable 한 뒤
: : : 그 위에 컴포넌트를 무시하고 마음대로 그림을 그릴 수는 없을까요?
: : :
: : : Multi Selection 을 하려면,
: : : 먼저 마우스를 누르고 드레그하여 영역을 정하는 동안 점선의 rectangle 도 그려야 하고...
: : : 하여간, 하나의 컴포넌트 내에서 만이 아니라 여러개에 걸쳐진 선을 그려야 하는데...
: : :
: : : 다시 한번 답변 부탁드립니다.
: : :
: : : 대단히 감사합니다.
: : : 해리
: : :
: : :
: : : 장성호 님이 쓰신 글 :
: : : : Edit는  TForm이나 TPanel 같이 다른 컨트롤을 올려놓을수 있는 컨테이너 컨트롤이 아닙니다.
: : : : 그래서 올려놓을수 없는것입니다.
: : : :
: : : : 컴포넌트를 선택했을때 컴포넌트위에 박스를 그리고자 한다면?
: : : : Handle이 있는 window컨트롤은 DC를 얻어서 draw하시면 됩니다.
: : : :
: : : :
: : : : 1. TForm같은 경우  원하는 그림을 Form->Canvas에 그리면 됩니다.
: : : :
: : : : 2. 그런데 TPanel 이나 TButton , TEdit 등 Canvas 속성이 없는 Control은 어떻게 해야할까요?
: : : :     모든 윈도우 Control은 화면을 자신의 DC에 그려줍니다.
: : : :     그러므로 Panel에 원하는 그림을 그리고자 한다면 Panel의 DC를 얻어오면 되죠
: : : :     보통 DC는 GetDC라는 api로 얻을수 있습니다.
: : : :  
: : : :     원하는 그림은 HDC dc=GetDC(Edit1->Handle);
: : : :     RECT rc;
: : : :     ...
: : : :     DrawFocusRect(Can->Handle,&rc); 
: : : :
: : : : 3. 2번에서 api를 이용해서 그림을 그리기 불편하면 VCL의 TCanvas를 이용하는 방법이 있습니다.
: : : :    
: : : :    TCanvas *can=new TCanvas;
: : : :     can->Handle = GetDC(Edit1->Handle);
: : : :     can->Draw...
: : : :      ......     
: : : :     delete can;  
: : : :
: : : :     위와같이 하면 TCanvas에 있는 GDI그래픽 함수들을 쉽게 쓸수 있죠
: : : :
: : : :
: : : : 결론적으로 TShape를 기존 Control위에 올리려고 하지 마시구요
: : : : 직접 Control의 DC에 그림을 그려서 처리하도록 하십시요
: : : :
: : : : 참조
: : : : http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=38049
: : : : http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=49461
: : : :
: : : : 그럼..
: : : :
: : : :
: : : :
: : : : 해리 님이 쓰신 글 :
: : : : : 안녕하세요?
: : : : :
: : : : : C++Builder 의 form editor 와 비슷한 것을 만들고 있습니다.
: : : : : Component 를 선택했을 때, 그 Component 위로 박스를 그리고 싶은데
: : : : : TShape 을 사용하는 경우에 이것이 항상 TEdit 의 아래로 가버립니다.
: : : : :
: : : : : TEdit 의 위에 그림을 또는 선을 그리는 방법이 없을까요?
: : : : :
: : : : : 감사합니다.
: : : : : 해리.

+ -

관련 글 리스트
51587 TEdit 위에 TShape 올리기 해리 1087 2007/12/12
51593     Re:TEdit 위에 TShape 올리기 장성호 1241 2007/12/12
51597         감사합니다. 그런데 제가 원하는 것은... 해리 1104 2007/12/12
51599             Re:감사합니다. 그런데 제가 원하는 것은... 장성호 1308 2007/12/12
51602                 Re:Re:감사합니다. 그런데 제가 원하는 것은... 해리 1269 2007/12/13
51604                     Re:Re:Re:감사합니다. 그런데 제가 원하는 것은... 장성호 2509 2007/12/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.