음... 저도 그렇게는 해보지 않았네요
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 의 위에 그림을 또는 선을 그리는 방법이 없을까요?
: : :
: : : 감사합니다.
: : : 해리.