|
"무수히 많은.." 이 정확히 몇개를 지칭하는지 몰라 약간 애매하네요. ^^;
왠만큼 많은 선, 원, 점 들이라면 TPaintBox로도 가능합니다.
Graphic32는 써보지 않아서 잘 모르겠지만, 하드웨어 가속을 받지 않는
이상 TPaintBox와 비슷한 성능을 가질 것 같네요.
하드웨어 가속을 받으시려면, OpenGL 이나 DirectX를 사용하시는 것도
좋으시겠습니다.
Dimemsion check 는 뭔지 모르겠고요, Zoom up & down (돋보기) 에 관한
예제를 아래 함께 첨부해 드립니다.
cuperido
//---------------------------------------------------------------------------
#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;
GetCursorPos(&tpPosition);
if(PREVIOUS_X != tpPosition.x || PREVIOUS_Y != tpPosition.y) {
PREVIOUS_X = tpPosition.x;
PREVIOUS_Y = tpPosition.y;
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
);
}
}
//---------------------------------------------------------------------------
최범호 님이 쓰신 글 :
: 무수히 많은 Point, Line, Curve Data 를 Panel 을 통해 그리고 싶습니다.
:
: OpenGL, GDI+, Graphic32 이런 컴포넌트(?) 를 이용하여서 표현하고 싶은데
:
: 이중에서 가장 적합한 것은 무엇일까요. ? 2D 전용이기 때문에 GDI+, Graphic32 가
:
: 더 적합할 것 같은데 너무 망막하기만 하네요.
:
: 단순히 Drawing 하는것 외에 Dimemsion check 와 Zoom up & down 도 구현해야 되는데..
:
: 어디 적합한 Sample 같은 건 없나요?
|