|
알고리즘에 관한 문제는 죽이되던 밥이되던.. -_-;; 스스로 연구해 보시는것도 나쁘지는 않다고 생각합니다. 자신의 프로젝트 알고리즘은 어떻게 구현해야 좋은지 자신이 가장 잘 알테구.. 이런 알고리즘 부분은 하면 할수록 느는 부분인것 같다는 생각이 들어서요..
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define MARGIN 20 // 자석 구현할 거리
TForm1 *Form1;
int PREVIOUS_X, PREVIOUS_Y, PREVIOUS_FORM_X, PREVIOUS_FORM_Y;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
Form1->BorderStyle = bsNone;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
// 폼 2 열기
if(!Form2->Visible) {
Form2->BorderStyle = bsNone;
Form2->Show();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Panel1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
tagPOINT tpPosition;
int itNewLeft, itNewTop;
bool blSticked = false;
// 왼쪽 버튼이 눌러진 상태로 이동을 하면...
if(Shift.Contains(ssLeft)) {
GetCursorPos(&tpPosition);
// 과거의 위치에서 얼마나 커서가 눌려진 상태로 이동했나를 보고,
// 폼의 위치 계산
itNewLeft = PREVIOUS_FORM_X + (tpPosition.x - PREVIOUS_X);
itNewTop = PREVIOUS_FORM_Y + (tpPosition.y - PREVIOUS_Y);
if(Form1->Left == Form2->Left - Form1->Width) blSticked = true;
if(!blSticked) {
// 자석 구현
if(abs(Form2->Left - (itNewLeft + Form1->Width)) <= MARGIN)
itNewLeft = Form2->Left - Form1->Width;
if(abs(Form2->Top - itNewTop) <= MARGIN)
itNewTop = Form2->Top;
}
// 이렇게 따로 변수를 만들지 않고 직접 Form1->Left에 대입하면,
// 폼의 Left가 연산될때마다 폼이 이리저리 막 튕겨다닙니다
Form1->Left = itNewLeft;
Form1->Top = itNewTop;
if(blSticked) Form2->Left = Form1->Left + Form1->Width;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Panel1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
tagPOINT tpPosition;
GetCursorPos(&tpPosition);
// 과거의 폼의 위치와, 마우스 좌표를 기억
PREVIOUS_FORM_X = Form1->Left;
PREVIOUS_FORM_Y = Form1->Top;
PREVIOUS_X = tpPosition.x;
PREVIOUS_Y = tpPosition.y;
}
heartsim 님이 쓰신 글 :
: 예.......감사합니다. 유영인님덕분에 모두 해결을 했습니다.
: 고맙게도 자석폼 구현도 잘 되네요.감사합니다.^^
:
: 그런데........
: 한가지 더 질문을 드릴게요...^^;;
: 염치불구 하고 질문드립니다.
:
: 가령, 서브폼이 메인폼 상위에 붙어 있습니다.
: 서브폼을 마우스로 드래그할 때 자석효과도 잘 됩니다.
:
: 만일 메인폼을 마우스로 드래그 했을때, 서브폼도 붙은 상태에서 메인폼을 따라오는 효과를 내고 싶은데..맘대로 잘 안되는군요.
:
: 음...여러가지 방법으로 구현시도를 해보았는데...역시나 계속 실패.............
:
: 참고로 제가 시도한 방법은 대략 이렇습니다.
: void __fastcall TForm1::Form1MouseMove(TObject *Sender, TShiftState Shift,
: int X, int Y)
: {
: tagPOINT tpPosition;
: //int itNewLeft, itNewTop;
:
: //왼쪽 버튼이 눌려진 상태로 이동을 하면...
: if(Shift.Contains(ssLeft))
: {
: GetCursorPos(&tpPosition);
:
: PREVIOUS_FORM_X2=Form2->Left+tpPosition.x;
: PREVIOUS_FORM_Y2=Form2->Top+tpPosition.y;
: }
:
: }
: 이런 식으로 일단 Form2의 Left와 Top좌표를 구해서 PREVIOUS_FORM_X2와 PREVIOUS_FORM_Y2에 저장을 했습니다.
:
: 그 다음은 이 Form2의 좌표를 이벤트에다 할당을 하면 될것 같은데..여러가지 이벤트로 시도해보았으나 잘 안된느군요.@@;
:
: 약간의 힌트라도 주심 감사하겠습니다.^^;
:
: 즐거운 하루 되십시요...
:
:
:
:
:
|