热门标签 | 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; //事件
}

 
 

 
 



推荐阅读
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了一个程序,可以输出1000内能被3整除且个位数为6的所有整数。程序使用了循环和条件判断语句来筛选符合条件的整数,并将其输出。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • Igotthiscode(IknowitsinSpanishIcantranslateifneeded)wheretheygivemethefunctionS ... [详细]
  • 数据结构-图详解(图基本概念、图的存储结构及C++实现)
    本文主要介绍关于数据结构,c++,图论的知识点,对【数据结构-图详解(图基本概念、图的存储结构及C++实现)】和【数据结构图的存储结构代码】有兴趣的朋友可以看下由【NUC_Dodamce】投稿的技术文 ... [详细]
  • C++语言学习(六)——二阶构造模式
    C++语言学习(六)——二阶构造模式一、构造函数的问题构造函数存在的问题:A、构造函数只提供自动初始化成员变量的机会B、不能保证初始化逻辑 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文讲述了CodeForces1016C题目的解法。文章首先介绍了一种错误的理解,然后给出了正确的解法。其中,当位于一个角上时,有两种选择,一种是先一直走一行再返回来走,另一种是走到这一列的另一行上然后再往右走一列。作者给出了两种解法,一种是直接计算,一种是动态规划。最后,取两种解法的最优解作为答案。文章附上了源代码。 ... [详细]
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社区 版权所有