热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++builder自绘控件框架

#ifndef__switch1__#define__switch1__#includegdi.h自定义GDI+函数库typedefvoid__fastcall(__clo
#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


在上述框架的基础上,用GDI+编写仿360按钮,调用如下:

void __fastcall TForm1::isOnClick(TObject * Sender)//按钮的响应事件
{
if(p->Status)
Label1->Caption = "点击开启";
else
Label1->Caption = "点击关闭";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
p = new TSwitchButton(Form1);
p->Setsize(TRect(20,20,150,50));
p->OnClick= isOnClick;

}

调用代码,.h文件如下:
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include
#include
#include
#include
#include "TScrollBoxControl.hpp"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TLabel *Label1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
TScrollBoxControl * p;//滚动条对象针
void __fastcall show(int a,int b);//滚动条事件
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
.CPP文件代码,如下:
void __fastcall TForm1::show(int a,int b)
{
Label1->Caption = "滚动条事件:"+(AnsiString(a)+","+b);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
p = new TScrollBoxControl(Form1);
p->SetWinodwColor(clBtnFace); //设置背景颜色
p->Setsize(TRect(20,20,36,300));//显示位置
p->SetShow(30,10); //总数据,一页数据
p->OnScrolloBox= show; //事件
}

 
 

 
 



推荐阅读
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 机器学习算法:SVM(支持向量机)
    SVM算法(SupportVectorMachine,支持向量机)的核心思想有2点:1、如果数据线性可分,那么基于最大间隔的方式来确定超平面,以确保全局最优, ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • VB.net 进程通信中FindWindow、FindWindowEX、SendMessage函数的理解
    目录一、代码背景二、主要工具三、函数解析1、FindWindow:2、FindWindowEx:3、SendMessage: ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
  • poj 3352 Road Construction ... [详细]
  • 详解 Qt 串口通信程序全程图文 (4)
    Qt串口通信程序全程图文是本文介绍的内容,本文一开始先讲解对程序的改进,在文章最后将要讲解一些重要问题。1、在窗口中加入一些组合框ComboBox&# ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 在探讨如何在Android的TextView中实现多彩文字与多样化字体效果时,本文提供了一种不依赖HTML技术的解决方案。通过使用SpannableString和相关的Span类,开发者可以轻松地为文本添加丰富的样式和颜色,从而提升用户体验。文章详细介绍了实现过程中的关键步骤和技术细节,帮助开发者快速掌握这一技巧。 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
author-avatar
111wen_292
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有