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
[75879] Re:Re:Re:FD2DCanvas 에서 그림을 이동후, Refresh() 를 하면 원점으로 이동 한것처럼 보입니다.
빌더(TWx) [builder] 1223 읽음    2020-06-04 18:47
뽀뽀중 님이 쓰신 글 :
: 설명하신 내용을 생소한 점이 있어. http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=75510  을 참고로 작성을 하려 하였습니다.
: 참고로 한 다른 예제는 오래된 것이라. 윈 API를 LRESULT OnPaint(HWND hWnd,WPARAM wParam,LPARAM lParam); 와 같은 방식으로 사용을 합니다.
:
: HWND hWnd 를 어떻게 처리? 하는지 방법을 몰라서. 빌더에 내장된 이벤트를 사용 하였습니다.
:
: 제가 작성한 예제(?)는 첨부를 하였습니다.
:
: 화면 크기가 변경이 되었을 때, 여전히 FD2DCanvas->Refresh(); 를 사용 하였는데, 어떤 함수를 사용해야 하나요?
:
: Refresh(); 사용하지 않으면, 폼의 크기를 변경 하면, 그려진 도형이 가로세로비율이 변경되어 찌그러집니다.
:
: 이런 찌그러짐을 없애려 하는데, 어떻게 해야 하는지 방법을 모르겠습니다.
:
: 빌더(TWx) 님이 쓰신 글 :
: : 뽀뽀중 님이 쓰신 글 :
: : :
: : : 그림을 그린 폼 크기를 변경 하면, 그림이 찌그러지는 현상이 있어서 FD2DCanvas->Refresh(); 를 사용했습니다.
: : :
: : : 그런데, 첨부 파일처럼 그림을 이동후, 폼을 리사이즈 하면 이동한 그림이 원정으로 이동한것처럼 보입니다.
: : : 이상태에서 다시 이동을 하면, 직전에 이동한 위치에서 이동을 하게 됩니다.
: : :
: : : FD2DCanvas->Refresh(); 후 원점으로 이동한 것이 아닌, 마지막 이동한 위치가 유지되도록 보이게 하려면, 어떻게 해야 하나요?
: :
: :
: :
: :
: : 답변:
: :
: :
: :
: : Refresh 라는 용어 자체에 혹해서 API를 잘못 사용하고 있는 것 같은데...
: :
: : TDirect2DCanvas::Refresh() 는 DirectX Surface를 repaint 하는 역할을 하는 함수가 아니고...
: : 2D 캔버스 Internal 객체들을 reset 하는 역할 밖에 하지 않아요. 화면 갱신 역할을 하는 함수가 아님.
: :
: : 화면 왼쪽을 드로잉 영역으로... 오른쪽을 Tab 영역으로 쓸거라면...
: :
: : 왼쪽 영역을 TPanel 상속해서 wm_size, wm_paint, wm_mousemove 등의 윈도우 메세지를 오버라이드 해서
: : 행렬식을 이용해서 Zoom, Panning, Scale, Skew 등 Transformation 처리를 해주면 간단한 작업임.
: :
: :
: :
: :
: :
: :

답변:


이전 답변 글에서 다 설명이 되어있으므로 생략하고...

마우스 더블클릭해서 이벤트핸들러 이용하는 식으로는 VCL 라이브러리 내부에서
불필요한 코드들이 수행되므로 기대했던 대로 동작하지 않는 side effect 문제가 있으므로

TPanel 상속해서 virtual 함수인 WndProc() 하나만 오버라이드 해서 처리하면 되고.
WM_SIZE 메세지 발생 시,  ID2D1HwndRenderTarget 인터페이스의 Resize() 메소드를 호출하는 것으로
창 크기 조절은 더 이상 처리할 부분이 없고.

Panning 처리는 virtual 함수인 Repaint()를 호출하면 프레임웍 내부에서
WM_PAINT 메세지가 라우팅 되도록 되어 있으므로 행렬식을 이용해서 Transformation 해주면 되는 거고.

WndProc() 에서
WM_PAINT, WM_SIZE, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE 윈도우 메세지를 처리하면 되고
화면이 깜빡이는 플리커 현상을 없애려면 WM_ERASEBKGND 메세지를 추가적으로 처리하면 됌.




+ -

관련 글 리스트
75868 FD2DCanvas 에서 그림을 이동후, Refresh() 를 하면 원점으로 이동 한것처럼 보입니다. 뽀뽀중 1053 2020/05/20
75871     Re:FD2DCanvas 에서 그림을 이동후, Refresh() 를 하면 원점으로 이동 한것처럼 보입니다. 빌더(TWx) 1169 2020/05/22
75877         Re:Re:FD2DCanvas 에서 그림을 이동후, Refresh() 를 하면 원점으로 이동 한것처럼 보입니다. 뽀뽀중 1047 2020/06/03
75879             Re:Re:Re:FD2DCanvas 에서 그림을 이동후, Refresh() 를 하면 원점으로 이동 한것처럼 보입니다. 빌더(TWx) 1223 2020/06/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.