예전에 델파이로 된 좌우 업다운버턴 컴포넌트를
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