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
[18635] Re:최종위치값을 레지스터리에 저장하는 방법을 알고 싶습니다.~
유영인 [Chris] [cuperido] 1524 읽음    2002-05-17 19:09
레지스트리는 김백일님이 답변을 잘 해주신것 같구요..

자석폼은.. 여러가지 방법이 있겠지만.. 최대한 Winamp 효과를 내기 위하여.. 폼의 스타일을 bsNone으로 하고 (툴바를 없애는 겁니다) 그리고, 원래는 창 이동시에 테두리만 그려지는데, 직접 드래그를 처리하여 하는 루틴으로 하시는것이 보기에 좋을것 같습니다.

응용이 필요한 부분이라서 이건.. 어떻게 답변을 드려야 할지 모르겠네요. 아무튼 중간중간 주석을 넣었습니다.

아래는 말씀하신 Winamp 모양대로 폼을 보이고 Form1이 움직이면 Form2에 자석처럼 붙게하는 예제입니다. 시간이 없어서 Form1 밖에 처리하지 못했네요.. Form2도 똑같이 처리하시면 되겠죠~?

폼이 나눠져서.. 돌려보실때 불편하실것 같아서 소스코드 첨부하였습니다.
아래 기능에서 빠진 부분 여러 부분은 열심히 연구하셔서 추가시켜 주세요..  :)


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

#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;


// 왼쪽 버튼이 눌러진 상태로 이동을 하면...
if(Shift.Contains(ssLeft)) {
   GetCursorPos(&tpPosition);

   // 과거의 위치에서 얼마나 커서가 눌려진 상태로 이동했나를 보고,
   // 폼의 위치 계산
   itNewLeft   = PREVIOUS_FORM_X + (tpPosition.x - PREVIOUS_X);
   itNewTop    = PREVIOUS_FORM_Y + (tpPosition.y - PREVIOUS_Y);

   // 자석 구현
   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;
}

}
//---------------------------------------------------------------------------
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;

}
//---------------------------------------------------------------------------



이용주 님이 쓰신 글 :
: 프로그램을 실행해서 그것의 크기나 위치를 바꾸고 난뒤에 그것에 해당하는 레지스터리를 저장하는 방법이 궁금해서 이렇게 글을 올립니다.
: 오늘 너무 질문 많이 한다구 귀찮게 생각하지 마시고, 자라나는 프로그래머 한명 살린다 생각하고 좀 갈켜주세요~ ^^
: 폼을 닫고 다시 열었을때 최종적으로 위치한 위치값으로 다시 폼이 열리게 하고 싶거든요. 크기든 위치던지..
: 그리고 한가지만더요~ 혹시 윈엠프처럼 하나의 폼에 다른 폼이 자동으로 붙게 되는 방법을 알고 싶습니다.
: 윈엠프의 메임창에 다른 창을 갖다 되면 근처에 갔을 경우, 그냥 딱 붙더군요. 혹시 그런 기능을 구현할수 있는지 궁금하고 가능하다면 방법을 알고 싶습니다 고수님들의 많은 답변 부탁드립니다.

+ -

관련 글 리스트
18633 최종위치값을 레지스터리에 저장하는 방법을 알고 싶습니다.~ 이용주 887 2002/05/17
18635     Re:최종위치값을 레지스터리에 저장하는 방법을 알고 싶습니다.~ 유영인 [Chris] 1524 2002/05/17
18634     Re:최종위치값을 레지스터리에 저장하는 방법을 알고 싶습니다.~ 김백일 1135 2002/05/17
18640         Re:Re:최종위치값을 레지스터리에 저장하는 방법을 알고 싶습니다.~ 이용주 1024 2002/05/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.