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

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[140] [GR32] 스크롤과 확대 예제
이정구 [appleii] 13935 읽음    2007-08-30 23:45

먼저, 설치방법에 대해서 알아봅시다.

Graphics32 는 Delphi 를 사용하여 만들어졌지만 C++Builder 에서도 사용할 수 있도록 컴파일러
지시자를 이용하여 적절하게 처리해 주고 있습니다. 그러나 작성과정에서 실수가 있어서
C++ Builder 사용자 입장에서는 함수가 중복되는 문제가 발생합니다.
버전이 올라가도 바뀌지 않는것을 보면 아직 모르는 것 같습니다. 뭐, 하여간 해결방법은
다음을 참조하세요.

http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=component&no=445



그럼, Graphics32 기능중에서 두가지 기능을 익혀봅시다.

1. 화면을 스크롤 하는 기능
2. 화면을 확대하는 기능

1번의 화면을 스크롤하는 기능은 스크롤바가 있는 ImgView 라는 컴포넌트를 사용하면
가능합니다. 다른 방법을 사용해서 구현할 수도 있겠지만 남들이 만들어놓은 부품을 사용하면
간단하게 해결할 수 있지요. 화면을 확대하는 기능또한 간단하게 해결가능합니다.

화면을 스크롤 하는 기능을 구현해 봅시다. ImgView32 에는 기본적으로 스크롤 바가 달려있습니다.
이미지가 커지면 스크롤바가 활성화되어서 화면을 전체적으로 볼 수 있습니다. 이것은 간단하니까
넘어가고 AlSee 에서 보는 것처럼 스크롤 바를 없애고 마우스 포인터를 끌어서 화면을 스크롤하는 기능을 구현해
보겠습니다. 스크롤 바를 없애려면 ScrollBars 의 Visibility 를 svHidden 으로 합니다.



AlSee 에서 그림이 화면보다 클 때 마우스 커서가 손바닥 모양으로 변하면서
끌기를 하면 주먹을 움켜쥐는 모양으로 바뀌는 것을 알 수 있습니다. 마우스 버튼이 위에 있을때
불려지는 MouseUp 이벤트 핸들러와 끌기를 할 때 불려지는 MouseMove 이벤트 핸들러에서
커서 모양을 바꾸어 주면 됩니다. 그런데 손바닥 모양의 커서와 움켜쥐는 모양의 커서는 빌더에서
기본적으로 지원하지 않는 커서이므로 사용자가 만들어서 추가해야 합니다.

사용자가 커서를 추가하려면 res 파일에 커서를 추가해야 합니다. 커서를 만들기 위해서는
빌더에 포함되어 있는 Image Editor 를 사용하면 됩니다.


Contents -> New -> Cursor 를 선택한 후 필요한 3개의 커서를 그립니다.


메인 메뉴에서 Project -> Add to Project 해서 만든 res 파일을 추가합니다.

커서를 부르기 위해서 다음과 같이 합니다.

TCursor crMouseMove = TCursor(7);
Screen->Cursors[crMouseMove] = LoadCursor(HInstance,"CR_MOUSEMOVE");
ImgView321->Cursor = crMouseMove;


TCursor 타입의 커서를 지정할 변수를 만들고
LoadCursor 를 이용하여 커서를 부르고
ImgView321 컴포넌트에서 사용할 커서를 지정합니다.

MouseMove 이벤트 핸들러에서 움켜쥐는 모양의 커서를 지정하고
MouseUp 이벤트 핸들러에서 손을 편 모양의 커서를 지정합니다.


현재위치를 OldMousePos 에 지정하고 Down 상태에서 Dragging 이 가능하도록 MouseDragging
을 true 로 지정합니다.

OldMousePos = Gr32::Point(X ,Y);
MouseDragging = True;


마우스를 끌면서 움직일 때 화면이 스크롤 되어야 하므로 다음과 같이 Scroll 함수를 사용합니다.

ImgView321->Scroll(OldMousePos.x-X,OldMousePos.y-Y);
OldMousePos = Gr32::Point(X,Y);
ImgView321->Update();


스크롤이 끝난 후 다음번 스크롤에서 사용할 위치를 OldMousePos로 지정합니다.
그리고 화면을 업데이트하면 됩니다.

그림이 ImgView32 보다 작으면 어떻게 할까요? 스크롤 하는 것은 의미가 없고 확대하는 기능이
있었으면 좋겠습니다. 확대하는 기능도 간단한 함수를 사용해서 해결할 수 있습니다.
IsScreenFitted 라는 변수를 이용하여 그림이 화면보다 큰 지 작은지 판단하여 스크롤할 것인지
확대할 것인지 판단하여 적절하게 처리하도록 합니다.

void __fastcall TMainForm::ImgView321MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y,
      TCustomLayer *Layer)
{
  if( Button == mbLeft )
  {
    if(IsScreenFitted == false)
    {
      OldMousePos = Gr32::Point(X ,Y);
      MouseDragging = True;
    }
    else
    {
      ImgView321->Scale = 5;
      IsScreenFitted = false;
    }
  }
}


ImgView321->Scale = 5; 를 통해서 5배로 화면을 확대하는 기능이 간단하게 구현됩니다.
그 뒤에 IsScreenFitted 를 false 로 하면 다음번에 왼쪽 버튼을 누르면 화면을 스크롤하는 기능이
작동합니다. 즉, 화면을 확대하고 스크롤할 수 있게 됩니다.

함수 몇개를 사용하여 간단하게 해결 가능하므로 설명보다는 직접 보는 것이 간단합니다.

장성호 [nasilso]   2007-08-31 08:16 X
예고했던 G32강좌가 드디어 시작되었네요
언제나 보는사람 편하게 만들어서 올리신 정성에 박수를 보닙니다.

맨날 TImage와 TBitmap만 써왔는데
강좌 잘 들어서 G32도 써봐야겠습니다.

강좌 잘 봤습니다. 2탄도 기대할께요
김태선 [cppbuilder]   2007-08-31 10:33 X
오~ 기대 만땅입니다.
이정구 [appleii]   2007-09-01 14:12 X
대단한 기능을 소개하기 보다는 Graphics32 에 이런 기능이 있다는 정도의 가벼운 내용으로 할 예정입니다. 복잡한 기능은 저도 잘 모릅니다. 회전, 확대, 이동등의 기능은 자체적으로 해결하기 보다는 믿을 만한 컴포넌트를 사용하는 것이 좋다고 생각하기 때문에 그런 기능을 소개하는 정도로 하겠습니다.

+ -

관련 글 리스트
140 [GR32] 스크롤과 확대 예제 이정구 13935 2007/08/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.