仿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; }
相关文章推荐
- 转载:天涯——散文天下——《一个人的悲剧人生》——作者:南方孤驴
- 【转】使用 vim + ctags + cscope + taglist 阅读源码
- div中的内容垂直居中的五种方法
- ML 徒手系列 最大似然估计
- python——简单爬虫
- LED平板灯结构解析与设计
- viewPager的使用(一)
- 高并发的epoll+线程池,业务在线程池内
- Numpy中矩阵对象(matrix)
- myeclipse中,项目上有个叉报错,文件没有错误【解决方案】
- 【转】将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope/Winmanager/NERDTree/OmniCppComplete(有图有真相)
- Asp.Net_的传值跟存储值操作
- MySQL 修改 root 密码
- saltstack--job
- Android.mk集成第三方jar与so的方法
- 线性表【项目4 线性表-- 顺序表应用】之一
- Boostrap学习心得
- 当你在内核源码路径里敲下make 时会发生什么。
- MySql安装及配置
- android SlidingUpPanel (一)