C++builder自绘控件框架

    本文地址:http://tongxinmao.com/Article/Detail/id/198

    http://blog.csdn.net/chinayu2007/article/details/48244769
    #ifndef __switch1__
    #define __switch1__
    #include "gdi.h"  //自定义GDI+函数库
    
    typedef void __fastcall(__closure * TMyEvent)(int a,int b);//多个参数事件类型
    class TSwitchButton : public TGraphicControl
    {
        private:
          int m_left;
          int m_top;
          int m_width;
          int m_height;
          ::Graphics::TBitmap * m_background_bmp;
          ::Graphics::TBitmap * m_active_bmp;
          TNotifyEvent FOnClick;//定义事件类型,仅一个参数Sender
    
          unsigned int window_color;//设置背景色,用于控件透明
        protected:
            BEGIN_MESSAGE_MAP
                VCL_MESSAGE_HANDLER(CM_MOUSELEAVE, TMessage, MouseLeave)
            END_MESSAGE_MAP(TGraphicControl)
            void __fastcall MouseLeave(TMessage & msg);
        public:
          unsigned int background_start_color; //背景色
          unsigned int background_end_color;
    
          unsigned int foreground_start_color;
          unsigned int foreground_end_color;
    
          void SetControlTransparentColor(unsigned int color);//修改控件透明色
          bool Status;
    
          void Setsize(TRect & r);
          void Draw();
          virtual void __fastcall Paint(void);
          DYNAMIC void __fastcall MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y);
          DYNAMIC void __fastcall MouseMove(Classes::TShiftState Shift, int X, int Y);
          DYNAMIC void __fastcall MouseUp(TMouseButton Button, Classes::TShiftState Shift, int X, int Y);
    
          __fastcall TSwitchButton(TComponent* AOwner);
          __fastcall ~TSwitchButton();
    
          __property Left   ;
          __property Top    ;
          __property Width  ;
          __property Height ;
    
          __published:  
              __property TNotifyEvent OnClick={read=FOnClick,write=FOnClick};//声明成属性器,方便调用
    };
    //构造函数
    __fastcall TSwitchButton::TSwitchButton(TComponent* AOwner):TGraphicControl(AOwner)
    {
         m_background_bmp = new ::Graphics::TBitmap;
         m_active_bmp     = new ::Graphics::TBitmap;
    
         this->Parent =(TWinControl *) AOwner;
    
         GdiInit();
    }
    void TSwitchButton::Setsize(TRect & r)
    {
         m_background_bmp->Width  = r.Width();
         m_background_bmp->Height = r.Height();
    
         m_active_bmp->Width      = r.Width()/2-2;
         m_active_bmp->Height     = r.Height()-2;
    
         m_left   = r.left;
         m_top    = r.top;
         m_width  = r.Width();
         m_height = r.Height();
    
         this->Left   = m_left;
         this->Top    = m_top;
         this->Width  = m_width;
         this->Height = m_height;
         //-----------------------------------------------------
         GdiCreateHandle1(m_background_bmp->Canvas->Handle);
    
         GdiPen(0xffff0000,1);
         GdiDrawRoundRect(0,0,m_width-1,m_height-1,30,30);
    
    
         GdiReleaseGraphics();
    }
    
    void TSwitchButton::Draw()//绘图集中操作函数
    {
         m_active_bmp->Assign(m_background_bmp);//复制背景
    
         GdiCreateHandle1(m_active_bmp->Canvas->Handle);
    
         //...绘图功能函数
    
         GdiReleaseGraphics();
    }
    
    void __fastcall TSwitchButton::Paint(void)
    {
        TRect a(0,0,m_width,m_height);
        TRect b(0,0,m_width,m_height);
        Canvas->CopyMode = SRCCOPY;
        Canvas->CopyRect(a,m_background_bmp->Canvas,b);
    }
    void __fastcall TSwitchButton::MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
    {
        Paint();
        if(FOnClick)//激活自定义事件
        {
            FOnClick(this);//调用点击外部挂接的事件
        }
    }
    __fastcall TSwitchButton::~TSwitchButton()
    {
        delete m_background_bmp;
        delete m_active_bmp;
        GdiClose();
    }
    void TSwitchButton::SetControlTransparentColor(unsigned int color)
    {
        window_color = color;
        Setsize(TRect(m_left,m_top,m_width+m_left,m_height+m_top));
        Draw();
        Paint();
    }
    void __fastcall TSwitchButton::MouseLeave(TMessage & msg)
    {
        //...
        Draw();
        Paint();
    }
    #endif


    上一篇:mingw32 mingw64 msys cygwin TDM-GCC
    下一篇:C++builder彩色汽泡提示