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
[18223] Re:zoom in/out 기능을 구현방법 좀 가르쳐 주세요
유영인 [Chris] [cuperido] 1421 읽음    2002-05-07 13:14
돋보기 기능입니다. 여러가지 방법을 시도해봤지만, Stratch 기능을 이용하는게, 가장 빠르더군요.
관련 부분 소스도 같이 첨부하였습니다

화면 위치에 대하여 돋보기 위치는 바꾸는 루틴과, 커서를 따라다니는 루틴이 있습니다. 아마 지금은 커서를 따라다니는 루틴으로 되어있을껍니다. (화면 위치에 대한건 주석 처리...)


//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit_Magnifying.h"
#include "Unit_Main.h"
#include "Unit_Task.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TMagnifying        *Magnifying;

//---------------------------------------------------------------------------

__fastcall TMagnifying::TMagnifying(TComponent* Owner) : TForm(Owner)
{
}

//---------------------------------------------------------------------------

void __fastcall TMagnifying::FormCreate(TObject *Sender)
{

// Bitmap 생성
MAGNIFYING   = new Graphics::TBitmap();
ZOOMVALUE    = 2;

CURSOR_GAB_X = DEFAULT_CURSOR_GAB_X;
CURSOR_GAB_Y = DEFAULT_CURSOR_GAB_Y;

DoubleBuffered = true;

SetWindowSize();

}

//---------------------------------------------------------------------------

void __fastcall TMagnifying::SetWindowSize()
{

MAGNIFYING->Width  = _imMagnifying->Width  / ZOOMVALUE;
MAGNIFYING->Height = _imMagnifying->Height / ZOOMVALUE;

}

//---------------------------------------------------------------------------

void __fastcall TMagnifying::FormDestroy(TObject *Sender)
{

delete MAGNIFYING;

}

//---------------------------------------------------------------------------

void __fastcall TMagnifying::_tiTickTimer(TObject *Sender)
{

tagPOINT          tpPosition;
HWND              itDC;
int               itSourceX, itSourceY, itWinX, itWinY, itWindowPosition;
int               itSwapSpace;        // 좌표가 바뀌면 연산을 한번 더 함
int               itMagnifyX, itMagnifyY;
TCursor           tcCursor;


/*
화면 좌표에 대하여 바꾸는 루틴
int               POSITION[4][2] = { 20, Main->_imToolbarL->Height + 15,
                                      Screen->Width - Magnifying->Width - 30, Main->_imToolbarL->Height + 10,
                                      20, Screen->Height - Magnifying->Height - Task->Height - 35,
                                      Screen->Width - Magnifying->Width - 30, Screen->Height - Magnifying->Height - Task->Height - 35};
*/

GetCursorPos(&tpPosition);

if(PREVIOUS_X != tpPosition.x || PREVIOUS_Y != tpPosition.y) {
   PREVIOUS_X = tpPosition.x;
   PREVIOUS_Y = tpPosition.y;


/*
화면 좌표에 대하여 바꾸는 루틴
   // 윈도우 위치 설정
   itWindowPosition = 0;
   if(PREVIOUS_X < Screen->Width  / 2) itWindowPosition = itWindowPosition | 1;
                                  else itWindowPosition = itWindowPosition | 0;
   if(PREVIOUS_Y < Screen->Height / 2) itWindowPosition = itWindowPosition | 2;
                                  else itWindowPosition = itWindowPosition | 0;

   Magnifying->Left = POSITION[itWindowPosition][0];
   Magnifying->Top  = POSITION[itWindowPosition][1];
*/

   itWinX      = PREVIOUS_X + MAGNIFYING_INTERVAL;
   itWinY      = PREVIOUS_Y + MAGNIFYING_INTERVAL;
   itSwapSpace = 0;

   if(itWinX + Magnifying->Width  > Screen->Width)
     itWinX = PREVIOUS_X - Magnifying->Width - MAGNIFYING_INTERVAL;
   if(itWinY + Magnifying->Height + Task->Height + 10 > Screen->Height) {
     itWinY = PREVIOUS_Y - Magnifying->Height - MAGNIFYING_INTERVAL;
     // 윈도우가 더이상 내려가지 않게 하는 위치에서, 윈도우 위치가 마우스
     // 커서 위치로 인하여 바뀌게 되면, 연산을 바뀐 위치만큼 더 해주어야 한다
     itSwapSpace = MAGNIFYING->Height;
   }


   if(itWinX < MAGNIFYING->Width)  itWinX = MAGNIFYING->Width;
   if(itWinY < MAGNIFYING->Height) itWinY = MAGNIFYING->Height;
   if(itWinY > Screen->Height - Task->Height - Magnifying->Height - itSwapSpace)
     itWinY = Screen->Height - Task->Height - Magnifying->Height - itSwapSpace;

   Magnifying->Left = itWinX;
   Magnifying->Top  = itWinY;


   // 화면을 캡쳐한 후 Zoom 시킴
   itSourceX = PREVIOUS_X - (_imMagnifying->Width  / 2 / ZOOMVALUE);
   itSourceY = PREVIOUS_Y - (_imMagnifying->Height / 2 / ZOOMVALUE);

   if(itSourceX < 0) itSourceX = 0;
   if(itSourceY < 0) itSourceY = 0;
   if(itSourceX + MAGNIFYING->Width  > Screen->Width)  itSourceX = Screen->Width  - MAGNIFYING->Width;
   if(itSourceY + MAGNIFYING->Height > Screen->Height) itSourceY = Screen->Height - MAGNIFYING->Height;
  

   itMagnifyX = ((PREVIOUS_X - itSourceX) * ZOOMVALUE) + _imMagnifying->Left;
   itMagnifyY = ((PREVIOUS_Y - itSourceY) * ZOOMVALUE) + _imMagnifying->Top;

   itDC = GetDC(0);
   BitBlt(MAGNIFYING->Canvas->Handle, 0, 0,
          MAGNIFYING->Width, MAGNIFYING->Height, itDC,
          itSourceX, itSourceY,
          SRCCOPY);
   ReleaseDC(0, itDC);

   _imMagnifying->Picture->Bitmap->Assign(MAGNIFYING);

  
   _imMagnifying->Picture->Bitmap->Canvas->Draw(
     (itMagnifyX / ZOOMVALUE - 15) + CURSOR_GAB_X,
     (itMagnifyY / ZOOMVALUE - 15) + CURSOR_GAB_Y,
     _imCursor->Picture->Graphic
   );

// 커서를 다시 그리는 루틴
// OS에 따라 틀려진다는 단점이 있음
/*
   DrawIcon(_imMagnifying->Picture->Bitmap->Canvas->Handle,
            (itMagnifyX / ZOOMVALUE - 15) + CURSOR_GAB_X,
            (itMagnifyY / ZOOMVALUE - 15) + CURSOR_GAB_Y,
            LoadCursor(HInstance, IDC_ARROW));
*/
}

}

//---------------------------------------------------------------------------



초보자 님이 쓰신 글 :
: c++ builder로 zoom in/out 기능을 구현하고 싶은데
: 구현하는 방법좀 가르쳐 주세요.

+ -

관련 글 리스트
18218 zoom in/out 기능을 구현방법 좀 가르쳐 주세요 초보자 917 2002/05/07
18223     Re:zoom in/out 기능을 구현방법 좀 가르쳐 주세요 유영인 [Chris] 1421 2002/05/07
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.