C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

컴포넌트/라이브러리
Delphi/C++Builder Programming Components&Libraries
[532] 좌우 상하 업다운 버턴 컴포넌트 입니다.
김태선 [cppbuilder] 12900 읽음    2008-08-14 04:17
예전에 델파이로 된 좌우 업다운버턴 컴포넌트를
C++빌더로 옮기면서 몇가지 기능을 추가한 것인데
조금 손을 더봐서 올립니다.


아주 정미하게 작업이 된 것은 아니지만 실전에 써도 무리는 없을 것입니다.
버턴모양은 Direction 프로퍼티에 arV, arH, arV_H, arH_V 값중 하나를 넣으면 될 것입니다.


소스를 늘이자면 아래와 같습니다. 나중에 긁어 쓰기 편하게 ㅡ..ㅡa

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

#ifndef TShapeButtonH
#define TShapeButtonH
//---------------------------------------------------------------------------
#include 
#include 
#include 
//---------------------------------------------------------------------------

class TShapeButton;

enum TButtonDirection { arV, arH, arV_H, arH_V, arUser1, arUser2, arUser3 }; 	//버튼모양 설정(좌우,상하)
enum TButtonDown  { btNone, btLeft, btRight}; 					//버튼이 눌러졌을경우 어느버튼이 누렸는지 나타냄 상하인경우, 위에 것이 Left에 해당.
typedef void (__closure *TButtonClickEvent)(TShapeButton* Sender, TButtonDown Button);
// 사용자 드로우의 경우.
typedef void (__closure *TUserDrawEvent)(TShapeButton* Sender, TButtonDirection Button, HRGN& area1, HRGN& area2);

class PACKAGE TShapeButton : public TGraphicControl
{
	typedef	TGraphicControl  inherited;
private:
	TButtonDirection  FDirection; 	//버튼모양
	TColor  FButtonColor; 			//바탕색설정
	TColor  FButtonLineColor;
	TColor  FButtonDownColor; 		//눌렸을경우 색상
	TColor  FButtonDownLineColor; 
	bool	FButtonDown; 			//눌렸나 안눌렸나
	TButtonDown 	FButtonDownType;//눌렸으면 어떤놈인가
	TButtonClickEvent FButtonClick; //클릭이벤트로 보냄
	TUserDrawEvent	FUserDrawEvent; //사용자 그리기.
	int		FButtonGap; 			//두개버튼사이의 간격
	int		FButtonMag; 			//버튼그릴때의 마진
	TPoint 	FPnts1[3]; 				//삼각형(좌)의 꼭지점3개
	TPoint 	FPnts2[3]; 				//삼각형(우)의 꼭지점3개
	HRGN	FRgn1; 					//버튼의 클릭영역 좌
	HRGN	FRgn2; 					//버튼의 클릭영역 우

	void __fastcall	SetDirection(TButtonDirection value);
	void __fastcall	SetButtonColor(TColor value);
	void __fastcall	SetButtonDownColor(TColor value);
	void __fastcall	SetButtonLineColor(TColor value);
	void __fastcall	SetButtonDownLineColor(TColor value);
	void __fastcall	SetButtonGap(int value);
	void __fastcall	SetButtonMag(int value);
	void __fastcall	FreeRegion1();
	void __fastcall	FreeRegion2();
	void __fastcall Click2(TButtonDown Button);

protected:
	virtual void __fastcall Paint();
	virtual void __fastcall DrawButton();
	MESSAGE void __fastcall WMLButtonDown(TWMLButtonDown& Message); //마우스를 누루면 다른색상표시
	MESSAGE void __fastcall WMLButtonUp(TWMLButtonUp& Message); 	//마우스를 놓았을경우 색상복귀

	BEGIN_MESSAGE_MAP
		VCL_MESSAGE_HANDLER(WM_LBUTTONDOWN, TWMLButtonDown, WMLButtonDown)
		VCL_MESSAGE_HANDLER(WM_LBUTTONUP, TWMLButtonUp, WMLButtonUp)
	END_MESSAGE_MAP(TGraphicControl)

public:
	__fastcall TShapeButton(TComponent* Owner);
	virtual __fastcall ~TShapeButton();

__published:
	__property Enabled;
	__property ParentShowHint;
	__property ShowHint;
	__property Visible;

	__property TColor ButtonColor = { read=FButtonColor, write=SetButtonColor };
	__property TColor ButtonDownColor = { read=FButtonDownLineColor, write=SetButtonDownColor };
	__property TColor ButtonLineColor = { read=FButtonLineColor, write=SetButtonLineColor };
	__property TColor ButtonDownLineColor = { read=FButtonDownColor, write=SetButtonDownLineColor };
	__property int ButtonGap = { read=FButtonGap, write=SetButtonGap };
	__property int ButtonMag = { read=FButtonMag, write=SetButtonMag };
	__property TButtonDirection Direction = { read=FDirection, write=SetDirection };

	__property TButtonClickEvent OnClick = { read=FButtonClick, write=FButtonClick };
	__property TUserDrawEvent OnUserDraw = { read=FUserDrawEvent, write=FUserDrawEvent };
};
//---------------------------------------------------------------------------
#endif




/*
	프로그램명 : 좌우 업다운버튼
	제작일 : 2001.6.4 (델파이)
	원작자 : 김유중

	Migration to C++Builder
	Update by 김태성
		- 외곽선 추가
		- 상하 업다운버턴 추가
		- 좌 위로 우 아래로 업다운버턴 추가.
		- 위 좌로 아래 우로 업다운버턴 추가.
*/
//---------------------------------------------------------------------------

#include 

#pragma hdrstop

#include "TShapeButton.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//

static inline void ValidCtrCheck(TShapeButton *)
{
	new TShapeButton(NULL);
}
//---------------------------------------------------------------------------
__fastcall TShapeButton::TShapeButton(TComponent* Owner) : TGraphicControl(Owner)
{
	ControlStyle = TControlStyle() << csClickEvents << csCaptureMouse;
	Width = 40;
	Height = 20;
	FButtonClick = NULL;
	FUserDrawEvent = NULL;
	FDirection = arH;
	FButtonLineColor = clGray;
	FButtonColor = clGray;
	FButtonDownLineColor = clNavy;
	FButtonDownColor = clLime;
	FRgn1 = 0;
	FRgn2 = 0;
	FButtonDown = false;
	FButtonDownType = btNone;
	FButtonGap = 4;
	FButtonMag = 2;
}

__fastcall TShapeButton::~TShapeButton()
{
	if (FRgn1) FreeRegion1();
	if (FRgn2) FreeRegion2();
}
//---------------------------------------------------------------------------
namespace Tshapebutton
{
	void __fastcall PACKAGE Register()
	{
		TComponentClass classes[1] = {__classid(TShapeButton)};
		RegisterComponents("Samples", classes, 0);
	}
}
//---------------------------------------------------------------------------

void __fastcall	TShapeButton::SetDirection(TButtonDirection value)
{
	if (value != FDirection)
	{
		FDirection = value;
		Invalidate();
	}
}
void __fastcall	TShapeButton::SetButtonColor(TColor value)
{
	if (value != FButtonColor)
	{
		FButtonColor = value;
		Invalidate();
	}
}
void __fastcall	TShapeButton::SetButtonDownColor(TColor value)
{
	if (value != FButtonDownColor)
	{
		FButtonDownColor = value;
		Invalidate();
	}
}
void __fastcall	TShapeButton::SetButtonLineColor(TColor value)
{
	if (value != FButtonLineColor)
	{
		FButtonLineColor = value;
		Invalidate();
	}
}
void __fastcall	TShapeButton::SetButtonDownLineColor(TColor value)
{
	if (value != FButtonDownLineColor)
	{
		FButtonDownLineColor = value;
		Invalidate();
	}
}
void __fastcall	TShapeButton::SetButtonGap(int value)
{
	if (value != FButtonGap)
	{
		FButtonGap = value;
		Invalidate();
	}
}
void __fastcall	TShapeButton::SetButtonMag(int value)
{
	if (value != FButtonMag)
	{
		FButtonMag = value;
		Invalidate();
	}
}
void __fastcall	TShapeButton::FreeRegion1()
{
	if (FRgn1) DeleteObject(FRgn1);
	FRgn1 = 0;
}
void __fastcall	TShapeButton::FreeRegion2()
{
	if (FRgn2) DeleteObject(FRgn2);
	FRgn2 = 0;
}
//---------------------------------------------------------------------------

void __fastcall TShapeButton::Paint()
{
	inherited::Paint();
	FreeRegion1(); 	//영역초기화
	FreeRegion2(); 	//영역초기화
	DrawButton(); 	//버튼그림
}

void __fastcall TShapeButton::DrawButton()
{
	if (!FButtonDown) // 초기화 또는 버튼이 떼어 졌으면
	{
		Canvas->Brush->Color = FButtonColor;
		Canvas->Pen->Color = FButtonLineColor;
	}
	else
	{	 // 버튼클릭시 그림
		Canvas->Brush->Color = FButtonDownColor;
		Canvas->Pen->Color = FButtonDownLineColor;
	}
	//내부삼각형 채울때의 색상
	if (!FButtonDown)
		Canvas->Brush->Color = FButtonColor;
	else
		Canvas->Brush->Color = FButtonDownColor;

	switch(FDirection)
	{
		case arH :
			//좌측 삼각형 버튼
			FPnts1[0] = Point(Width / 2 - FButtonGap, FButtonMag);
			FPnts1[1] = Point(FButtonMag, Height / 2);
			FPnts1[2] = Point(Width / 2 - FButtonGap, Height - FButtonMag);

			//우측 삼각형 버튼
			FPnts2[0] = Point(Width / 2 + FButtonGap, FButtonMag);
			FPnts2[1] = Point(Width - FButtonMag, Height / 2);
			FPnts2[2] = Point(Width / 2 + FButtonGap, Height - FButtonMag);
			break;
		case arV :
			//위측 삼각형 버튼
			FPnts1[0] = Point(FButtonMag, Height / 2 - FButtonGap);
			FPnts1[1] = Point(Width / 2, FButtonMag);
			FPnts1[2] = Point(Width - FButtonMag, Height / 2 - FButtonGap);

			//아래측 삼각형 버튼
			FPnts2[0] = Point(FButtonMag, Height / 2 + FButtonGap);
			FPnts2[1] = Point(Width / 2, Height - FButtonMag);
			FPnts2[2] = Point(Width - FButtonMag, Height / 2 + FButtonGap);
			break;
		case arH_V :
			//좌측 위로삼각형 버튼
			FPnts1[0] = Point(FButtonMag, Height - FButtonMag);
			FPnts1[2] = Point(Width / 2 - FButtonMag - FButtonGap, Height - FButtonMag);
			FPnts1[1] = Point((Width / 2 - FButtonGap) / 2, FButtonMag);

			//우측 아래로삼각형 버튼
			FPnts2[0] = Point(Width - FButtonMag, FButtonMag);
			FPnts2[2] = Point(Width / 2 + FButtonMag + FButtonGap, FButtonMag);
			FPnts2[1] = Point(Width - (Width / 2 - FButtonGap) / 2, Height - FButtonMag);
			break;
		case arV_H :
			//위측 좌로삼각형 버튼
			FPnts1[0] = Point(Width - FButtonMag, FButtonMag);	// 우상
			FPnts1[1] = Point(FButtonMag, (Height / 2 - FButtonGap) / 2);   	// 좌
			FPnts1[2] = Point(Width - FButtonMag, Height / 2 - FButtonMag - FButtonMag); // 우하

			//아래측 우로삼각형 버튼
			FPnts2[0] = Point(FButtonMag, Height / 2 + FButtonMag + FButtonGap); // 좌상
			FPnts2[1] = Point(Width - FButtonMag, Height - (Height / 2 - FButtonGap) / 2); // 우
			FPnts2[2] = Point(FButtonMag, Height - FButtonMag); // 좌하
			break;
		default :
        	// 사용자 그리기. 그리고 싶은 사람만... ㅎㅎ;
			if (FUserDrawEvent)
				FUserDrawEvent(this, FDirection, FRgn1, FRgn2);
			else
				return;
	}

	//클릭영역설정
	FRgn1 = CreatePolygonRgn(FPnts1, 3, ALTERNATE);
	FRgn2 = CreatePolygonRgn(FPnts2, 3, ALTERNATE);

	//외곽선 그림 : 이건 연구가 조금 필요하다.
//	int  w = Width - FButtonMag;
//	int  h = Height - FButtonMag;
//	switch(FButtonDownType)
//	{
//		case btNone :
//			FrameRgn(Canvas->Handle, FRgn1, Canvas->Brush->Handle, w, h);
//			FrameRgn(Canvas->Handle, FRgn2, Canvas->Brush->Handle, w, h);
//			break;
//		case btLeft :
//			FrameRgn(Canvas->Handle, FRgn1, Canvas->Brush->Handle, w, h);
//			break;
//		case btRight :
//			FrameRgn(Canvas->Handle, FRgn2, Canvas->Brush->Handle, w, h);
//			break;
//	}

	//버튼내부를 그린다
	switch(FButtonDownType)
	{
		case btNone :
			Canvas->Polygon(FPnts1, 2);
			Canvas->Polygon(FPnts2, 2);
			break;
		case btLeft :
			Canvas->Polygon(FPnts1, 2);
			break;
		case btRight :
			Canvas->Polygon(FPnts2, 2);
			break;
	}
}

MESSAGE void __fastcall TShapeButton::WMLButtonDown(TWMLButtonDown& Message)
{
	if (PtInRegion(FRgn1, Message.XPos, Message.YPos))
		FButtonDownType = btLeft; 	//좌측클릭
	if (PtInRegion(FRgn2, Message.XPos, Message.YPos))
		FButtonDownType = btRight; 	//우측클릭

	if (FButtonDownType == btNone)
		return; 					//영역밖을 클릭하면 취소
	FButtonDown = true;
	DrawButton(); 					//버튼을 다시 그려라
	Click2(FButtonDownType); 		//클릭이벤트 호출
	//inherited::WMLButtonDown(Message);
}

MESSAGE void __fastcall TShapeButton::WMLButtonUp(TWMLButtonUp& Message)
{
	if (!FButtonDown)
		return; 					//버튼이 아직 눌려있으면 취소
	FButtonDown = false; 			//버튼감지 초기화
	FButtonDownType = btNone; 		//영역감지 초기화
	DrawButton(); 					//원래모양으로 그려라
	//inherited;:WMLButtonUp(Message);
}
//---------------------------------------------------------------------------

void __fastcall TShapeButton::Click2(TButtonDown Button)
{
	if (FButtonClick)
		FButtonClick(this, Button);
}
//---------------------------------------------------------------------------




원작자의 델파이 버전은
http://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=0&st=C&keyword=%uC0BC%uAC01%uD615&indx=195210&keyword1=삼각형&keyword2=&page=1
이치고 [seokj777]   2011-06-14 15:05 X
초보입니다. 쓰는 법 어떻게 스는거에요?
부산촌님 [powere]   2016-08-07 11:13 X
한참을 찾아다녔는데 뜻밖에 여기에서 찾아 냈네요...

그런데 컴포넌트 등록은 어떻게 하나요?

오전에 작성 되기 했지만 저에겐 지금 필요한 기능 입니다..... 부탁드립니다.

+ -

관련 글 리스트
532 좌우 상하 업다운 버턴 컴포넌트 입니다. 김태선 12900 2008/08/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.