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

#ifndef gui_bmpbuttonH
#define gui_bmpbuttonH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------

class Tgui_bmpbutton_Form : public TForm
{
__published:	// IDE-managed Components
    TTimer *mouseLeaveTimer;
        void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y);
        void __fastcall FormMouseUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y);
    void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y);
    void __fastcall FormClick(TObject *Sender);
    void __fastcall mouseLeaveTimerTimer(TObject *Sender);
private:	// User declarations
public:		// User declarations

        __fastcall Tgui_bmpbutton_Form(TComponent* Owner);

        //[2012.05.11.금][완료!!!]
        __fastcall ~Tgui_bmpbutton_Form(void);

        //[서브클래싱]
        //{
            void __fastcall WndProc(Messages::TMessage &Message);
        //}

        //[VAR]
        //{
            //[환경변수]
            //{
                //[2007.10.02.화][추가!!!]
                struct  IDE_OPTION   *_ide_option;

            //}

            //[실제 그리는 영역]{------
            Graphics::TBitmap  *_bmp_;
            //}------------------------

            //표시할 이미지를 담고 있는 bitmap.
            Graphics::TBitmap  *_bitmap_;


            //[상태 변환 타이머 관련]
            //{
                //[2012.05.11.금][추가!!!]{--------------------------------
                //버튼을 바로 누르는 경우와, 누른채로 0.4초 정도 지난뒤
                //버튼의 동작을 달리하기 위한 특수 기능.
                //
                //[문법검사] 버튼 한개로 두개 동작을 수행하기 위하여 추가.
                //1) 기본동작          : 현재 편집중인 문서만 검사.
                //2) 0.4초 동안 누른뒤 : [설계묶음] 전체를 대상으로 검사.
                //
                //[상태변환] 은 <_modeTimerOvt:true> 인 경우가 해당.
                //}--------------------------------------------------------

                //[!]{--------------------------------------------------
                //0.4초 뒤 기능을 변경시킬수 있도록 하기 위한 타이머.
                //반드시, 사용하는 경우만 [생성] 하여 [낭비] 를 막는다.
                //
                //[버튼] 이 눌릴때 동작을 시작하고 올라올때 정지.
                TTimer  *_modeTimer;
                //}-----------------------------------------------------

                //[!]{--------------------------------------------------------------
                //[버튼] 이 눌릴때 <false> 로 초기화 된다.
                //<_modeTimer> 이벤트 발생시 <true> 로 설정.
                //
                //각 <_EVENT_XXX()> 에서 실제로 [상태변경] 을 확인하는 대상이 된다.
                bool  _modeTimerOvt; //(기본값:false)
                //}-----------------------------------------------------------------

                //[!]{---------------------------------------------------------------
                //[타이머:이벤트] 발생시 교체할수 있는 그림.
                //단, NULL 이 아닌 경우이고 [상태변경:타이머] 가 유효한 경우만 사용.
                //
                //사용하지 않는 경우는 반드시 NULL 로 처리.
                //메모리 낭비를 막기 위하여 반드시 사용시만 생성한다.
                Graphics::TBitmap  *_modeTimer_Bitmap;
                //}------------------------------------------------------------------

            //}


            //테두리 사용 유/무.(기본값 : false)
            bool                _border;
            
            //버튼이 눌린 경우 true.(기본값 : false)
            bool                _down;

            //마우스포인터가 안에 있는 경우는 true.
            //이는 OnClick [동작함수] 를 만들기 위하여 필요하다.
            //(BASE : false)
            bool                _in;

            //눌린 버튼의 종류를 기록한다.
            int                 _mouse_button;
            //{
                #define  d_mouse_null    0
                #define  d_mouse_left    1
                #define  d_mouse_right   2
                #define  d_mouse_middle  3

            //}

            int                 _image_x;
            int                 _image_y;
            //그림이 보여지는 영역의 크기를 갖는다.(그림 자체의 크기가 아니다.)
            int                 _image_width;
            int                 _image_height;

            //[index 적용여부]
            //{
                //--------------------------------------------------
                bool                _index_bitmap;
                int                 _index_width;
                int                 _index;
                //높이는 _bitmap_ 의 높이와 같은 것으로 본다.
                //index 로 접근하는데는 _index_width 값만 필요하다.
                //--------------------------------------------------
            //}

            //[2007.12.20.목][추가!!!]
            //{
                int    _colorBorder;  //테두리 색.

                int    _colorBack;    //배경색.

                int    _colorFront;   //그림색.

                //[2018.04.22.일][추가!!!]{--------------
                //[마우스진입] 시 선택색(가선택)을 지정.
                int    _colorSelect;
                //}--------------------------------------

            //}

            //[버튼 활성화 상태]
            //{
                //[2009.04.04.토][추가!!!]
                //활성화:true, 비활성화:false 상태만 저장한다(BASE: true).
                bool  _enable;

            //}

            //[풍선 도움말]
            //{
                //[2009.04.30.목][추가!!!]{-----------------------------------------
                //[풍선도움말] 에 출력할 문자열을 가진다.
                //단, 메모리 낭비를 막기 위하여 해당 사용이 설정된 경우만 처리한다.
                //}-----------------------------------------------------------------

                bool   _balloonHelpUse; //(기본 : false)

                //동적 생성시 크기를 주어 설정한다.
                char  *_balloonHelpStr;

            //}

        //}

        //[EVENT 함수]
        //{
            //[주의!!!]{------------------------------------------------------------------------
            //__closure 는 BCB 에만 있는 것이나 멤버함수 함수포인터를 사용하기 위하여 사용한다.
            //}---------------------------------------------------------------------------------

            //버튼의 동작에 따른 처리 함수 포인터를 설정한다.
            void __fastcall (__closure * _EVENT_Down)(void);
            void __fastcall (__closure * _EVENT_Up)(void);
            void __fastcall (__closure * _EVENT_Click)(void);

            void __fastcall (__closure * _EVENT_MouseEnter)(void);
            void __fastcall (__closure * _EVENT_MouseLeave)(void);
        //}

        //[FUNCTION]
        //{
            //[2009.04.30.목][완료!!!]{--------------------
            void __fastcall _BalloonHelpUse(bool    pUse);
            void __fastcall _BalloonHelpStr(char   *pStr);
            //}--------------------------------------------   

            //[2018.04.22.일][완료!!!]
            void __fastcall _Shape(//[2012.05.11.금][추가!!!]
                                   //상태변경 그림으로 보여준다면 <true>.
                                   //기본 사용시는 <false>.
                                   bool  pModeChange);

            //[속성]
            //{
                //[2006.11.12.일][생성!!!]
                void __fastcall _Border(bool  pBORDER);
                void __fastcall _Bitmap(AnsiString  pBITMAPname);

                void __fastcall _Left(int  pLEFT);
                void __fastcall _Top(int  pTOP);
                void __fastcall _Width(int  pWIDTH);
                void __fastcall _Height(int  pHEIGHT);

                void __fastcall _IndexBitmap(bool  pINDEXBITMAP);
                void __fastcall _IndexWidth(int  pINDEXWIDTH);
                void __fastcall _Index(int  pINDEX);

                void __fastcall _Image_X(int  pIMAGEx);
                void __fastcall _Image_Y(int  pIMAGEy);
                void __fastcall _Image_Width(int  pIMAGEwidth);
                void __fastcall _Image_Height(int  pIMAGEheight);

                //[2007.12.20.목][완료!!!]
                void __fastcall _ColorBorder(int   pColorBorder);
                void __fastcall _ColorBack(int   pColorBack);
                void __fastcall _ColorFront(int   pColorFront);

                //[2018.04.24.화][완료!!!]
                void __fastcall _ColorSelect(int  pColorSelect);

                //[2012.05.11.금][완료!!!]
                void __fastcall _Enable(bool  pEnable);

            //}

            //[<_modeTimer> 관련]
            //{
                //[2012.05.11.금][완료!!!]
                void __fastcall _ModeTimer(bool  pUse);

                //[2012.05.11.금][완료!!!]
                void __fastcall _Event_modeTimer(TObject *Sender);

                //[2012.05.11.금][완료!!!]
                void __fastcall _ModeTimer_Bitmap(char  *pPathNameExt);

            //}

            //[2006.11.09.목][완료!!!]
            void __fastcall _Draw(void);

        //}

};
//---------------------------------------------------------------------------
extern PACKAGE Tgui_bmpbutton_Form *gui_bmpbutton_Form;
//---------------------------------------------------------------------------
#endif
