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