您的位置:首页 > 其它

仿360工具栏

2015-09-14 17:37 246 查看
原来写了一个控件,现在改成VCL类,感觉使用类有灵活性的优势,控件安装比较麻烦。在TWinControl控件类框架的基础上开发。

#ifndef __TTOOLBOXCONTROL__
#define __TTOOLBOXCONTROL__
#include "gdi.h"

typedef void __fastcall (__closure * MyOnClick)(int no);

class TToolBoxControl :public TCustomControl
{
   private:
      TCanvas * FCanvas;

      int m_left,m_top,m_width,m_height;
      Graphics::TBitmap * m_background_bmp;  //双缓冲背景图
      Graphics::TBitmap * m_active_bmp;      //双缓冲前景图

      AnsiString  m_png_path;                //路径
      AnsiString  m_background_png;          //工具栏背景图
      AnsiString  m_logo_png;                //工具栏log图
      int         m_area_line[20];           //区域编号
      int         m_active_sel_area_no;      //选中区域编号
      int         m_sel_area_no;             //选中区域编号

      void  DrawFocusRectangle(int no);      //画动态焦点
      void  DrawSelectFocusRectangle(int no);//画选中焦点

      MyOnClick  FOnClick;                   //定义外部事件

      int m_button_count;                       //按钮个数
   protected:
      void Draw();

      BEGIN_MESSAGE_MAP
          VCL_MESSAGE_HANDLER(CM_MOUSELE***E, TMessage, MouseLeave)
          VCL_MESSAGE_HANDLER(CM_MOUSEENTER, TMessage, MouseEnter)
      END_MESSAGE_MAP(TCustomControl)

      void __fastcall MouseLeave(TMessage & msg);//鼠标离开控件
      void __fastcall MouseEnter(TMessage & msg);//鼠标进入控件
      
   public:
                                //按钮个数
      TStringList *box_png_name;                //图片名称
      TStringList *box_caption;                 //文字标题
      void SetPngPath(AnsiString value);        //设置UI路径
      AnsiString GetPngPath();                  //获取UI路径
      void SetSize(TRect &r,int left,int spacing,AnsiString background_png,AnsiString logo_png);
      //--------------------------------------------------
      __fastcall TToolBoxControl(TComponent* Owner);
      __fastcall ~TToolBoxControl();
      //--------------------------------------------------父类成员函数
      void __fastcall Paint(void);
      void __fastcall CreateParams(TCreateParams &Params);
      DYNAMIC void __fastcall MouseUp(TMouseButton Button, Classes::TShiftState Shift, int X, int Y);
      DYNAMIC void __fastcall MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y);
      DYNAMIC void __fastcall MouseMove(Classes::TShiftState Shift, int X, int Y);
      //--------------------------------------------------属性
      __property Graphics::TCanvas* Canvas = {read=FCanvas};
      __property Width;
      __property Height;
      __property Font;
      __property AnsiString PNGPath={read=GetPngPath,write=SetPngPath};
      __property MyOnClick OnClick={read=FOnClick,write=FOnClick};
};
 __fastcall  TToolBoxControl::TToolBoxControl(TComponent* Owner)
        : TCustomControl(Owner)
{
     TCustomControl * Win = (TCustomControl *)(Owner);
     this->Parent = Win;

     m_background_bmp =  new Graphics::TBitmap;
     m_active_bmp =  new Graphics::TBitmap;

     FCanvas = TCustomControl::Canvas;

     m_png_path       = "UI";
     m_background_png ="bg.png";
     m_logo_png       ="logo.png";
     m_button_count   =0;

     box_png_name  = new TStringList;
     box_caption   = new TStringList;
     //-------------------------------------------------
     GdiInit();
}
void __fastcall TToolBoxControl::CreateParams(TCreateParams &Params)
{
     TWinControl::CreateParams(Params);
}
//left起始,spacing间距
void TToolBoxControl::SetSize(TRect &r,int left=30,int spacing=30,AnsiString background_png="",AnsiString logo_png="")
{
    this->Left   = r.left;
    this->Top    = r.top;
    this->Width  = r.Width();
    this->Height = r.Height();

    m_left = r.left;
    m_top  = r.top;
    m_width= r.Width();
    m_height=r.Height();

    m_background_bmp->Width = m_width;
    m_background_bmp->Height= m_height;
    m_active_bmp->Width = m_width;
    m_active_bmp->Height= m_height;
    //--------------------------------------------
    AnsiString l_path_str,l_logo_str;
    if(background_png == "")
      l_path_str = m_png_path+"\\"+m_background_png;
    if(logo_png == "")
      l_logo_str = m_png_path+"\\"+m_logo_png;
    //--------------------------------------------------------
    GdiCreateHandle1(m_background_bmp->Canvas->Handle);

    GdiSetFont("微软雅黑",10);
    GdiDrawImage(l_path_str,0,0,m_width,m_height);//画背景图
    //画小图标
    for(int i=0;i < box_png_name->Count ;i++)
    {
       GdiDrawImage(m_png_path +"\\"+ box_png_name->Strings[i],left+i*48+i*spacing,20,48,48);
       GdiDrawString(box_caption->Strings[i],left+i*48+i*spacing+10,20+48,0xffffffff);
       m_area_line[i]= left+i*48+i*spacing;
    }
    m_area_line[box_png_name->Count]= left+box_png_name->Count*48+box_png_name->Count*spacing;

    m_button_count = box_png_name->Count;//按钮个数

    GdiReleaseGraphics();
    //--------------------------------------------------------
    Draw();
    Paint();
}
void TToolBoxControl::Draw()
{
    m_active_bmp->Assign(m_background_bmp);
    GdiCreateHandle1(m_active_bmp->Canvas->Handle);

    DrawSelectFocusRectangle(m_sel_area_no);
    DrawFocusRectangle(m_active_sel_area_no);//动态焦点

    GdiReleaseGraphics();
}
void __fastcall TToolBoxControl::Paint(void)
{
   TRect a(0,0,m_width,m_height);
   TRect b(0,0,m_width,m_height);
   FCanvas->CopyRect(a,m_active_bmp->Canvas,b);

}
//鼠标进入控件区
void __fastcall TToolBoxControl::MouseEnter(TMessage & msg)
{

}
//鼠标离开控件区
void __fastcall TToolBoxControl::MouseLeave(TMessage & msg)
{
      m_active_sel_area_no = 0;
      Draw();
      Paint();
}
void __fastcall TToolBoxControl::MouseUp(TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
{
   if(m_active_sel_area_no != 0 )
   {
     m_sel_area_no = m_active_sel_area_no;//选中焦点
   }
   Draw();
   Paint();

   if(FOnClick)
   {
      FOnClick(m_sel_area_no);
   }
}
void __fastcall TToolBoxControl::MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
{

}
//处理鼠标滑动时的焦点
void __fastcall TToolBoxControl::MouseMove(Classes::TShiftState Shift, int X, int Y)
{

   m_active_sel_area_no = 0;
   for(int i=0;i<20;i++)
   {
       if(m_area_line[i] == 0) break;

       if( X >= m_area_line[i]-12 && X < m_area_line[i]+70-12 && Y>80) //焦点宽度70,高度80
       {
          if(i+1 <= m_button_count)
             m_active_sel_area_no = i + 1;

          Draw();
          Paint();

          break;
       }
   }

   if(X > m_area_line[box_png_name->Count]) //鼠标在最右边的图标外
   {
      m_active_sel_area_no = 0;
      Draw();
      Paint();
   }
      Draw();
      Paint();
}
__fastcall TToolBoxControl::~TToolBoxControl()
{
   delete m_background_bmp;
   delete m_active_bmp;
}
void TToolBoxControl::SetPngPath(AnsiString value) //设置UI路径
{
   m_png_path = value;
}
AnsiString TToolBoxControl::GetPngPath()           //获取UI路径
{
   return m_png_path;
}
//鼠标滑过时,动态焦点
void TToolBoxControl::DrawFocusRectangle(int no)
{
   if(no > 0 && m_sel_area_no != m_active_sel_area_no)
   {
      GdiPen(0xff297DD0,1);
      GdiDrawRoundRect(m_area_line[no-1]-12,17,70,80,3,3);

      GdiPen(0xff6DBDEE,1);
      GdiDrawRoundRect(m_area_line[no-1]-12+1,17+1,70-2,80-2,3,3);

      GdiBursh(m_area_line[no-1]-12,20,70,80,0x10ffffff,0x10ffffff,1);
      GdiFillRoundRectangle(m_area_line[no-1]-12,17,70,80,3,3);
   }
}
//焦点被选中
void TToolBoxControl::DrawSelectFocusRectangle(int no)
{
   if(no > 0)
   {
      //外边框
      GdiPen(0xff297DD0,1);
      GdiDrawRoundRect(m_area_line[no-1]-12,17,70,80,3,3);
      //内边框
      GdiPen(0xff6DBDEE,1);
      GdiDrawRoundRect(m_area_line[no-1]-12+1,17+1,70-2,80-2,3,3);
      //填充颜色
      GdiBursh(m_area_line[no-1]-12,20,70,80,0x10ffffff,0x10ffffff,1);
      GdiFillRoundRectangle(m_area_line[no-1]-12,17,70,80,3,3);
      //高亮
      GdiBursh(m_area_line[no-1]-12,20,70,40,0x10ffffff,0x30ffffff,1);
      GdiFillRectangle(m_area_line[no-1]-12,17,70,40);

   }
}
#endif



.h文件
#include "TToolBoxControl.hpp"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TLabel *Label1;
private:	// User declarations
public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
        TToolBoxControl * tControl;
        void __fastcall TToolBoxOnClick(int a);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
.cpp文件
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
     tControl = new TToolBoxControl(this);
     //图标
     tControl->box_png_name->Add("add.png");
     tControl->box_png_name->Add("alert.png");
     tControl->box_png_name->Add("dvd.png");
     tControl->box_png_name->Add("globe.png");
     tControl->box_png_name->Add("map.png");
     //文字
     tControl->box_caption->Add("增加");
     tControl->box_caption->Add("报警");
     tControl->box_caption->Add("数据");
     tControl->box_caption->Add("地球");
     tControl->box_caption->Add("地图");

     tControl->SetSize(TRect(0,0,1024,115));
     tControl->OnClick = TToolBoxOnClick;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TToolBoxOnClick(int a)
{
   Label1->Caption = a;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: