自主研发界面库

一直在使用Qt开发桌面程序 然后发现默认的组件特别的丑 通过设置QSS样式和重画组件也无法满足自己的效果 因为我对界面的特效要求比较高 后来 就直接基于QWidget完全自己定制 果然自己定制的组件比较好看 但是后来我也发现了问题 因为Qt库我能用到的功能就是一个QWidget 很多组件不会去使用 所以我就在想 为什么不自己开发一个QWidget基础类呢 那样还轻量级 因为Qt写的程序打包出去要几十兆上百兆 实在是太臃肿了 于是 从前几年开始 我就开始开发界面库 因为底层组件实现起来比较麻烦 所以 底层的组件用C语言去开发 然后用C语言设计一个接口 通过这个接口来实现用C++定制组件 下面是C语言底层接口

特点

事件处理机制使用的是C++模版 不用单独调用moc.exe编译额外的文件 

组件本身支持直接设置透明度 不用再单独创建QGraphicsOpacityEffect或设置样式

性能高 创建几十万个组件一点都不卡 而QT超过1万个就特别的卡

组件存储方式采用链表树 插入删除移动性能特别高,举个例子,当绘制组件的时候,一般都是正序遍历,而当鼠标事件进入的时候,则是倒序遍历。还有一个情况,在处理局部刷新算法的时候。当鼠标事件进入组件,要遍历从当前组件的下级组件和父组件的下级组件,计算受影响的其他组件,以及计算每个组件的重绘区域,在处理这个算法的时候,使用链表性能是最高的。你想想,链表支持从当前组件直接获取下一个,不用从头开始遍历。如果是用数组存储组件的话,就要从头开始遍历。获取当前的组件数组下标索引[index] 那如果这个组件是第1000个位置呢,那就要每次都有1000次循环,这样性能是最低的 所以,开发界面库使用链表是最正确的选择。而且链表没有大小限制,只要内存足够大就可以无限插入。

轻量级 编译出来不到500KB QT要依赖几十M的动态库

更灵活 因为是自己设计的 所以使用上特别灵活

 

界面库底层C接口

#ifndef MRUI_H
#define MRUI_H

#include <Windows.h>

/**
 *
 * @brief   从堆中申请指定长度的内存
 *
 * @param   指针长度
 *
 * @return  成功返回内存首地址 失败返回NULL
 *
 */

EXTERN_C LPVOID mruiMalloc(SIZE_T dwBytes);

/**
 *
 * @brief   释放内存指针
 *
 * @param   指针首地址
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiFreePointer(HANDLE hMem);

/**
 *
 * @brief   检查内存是否有效
 *
 * @param   指针首地址
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiIsUsable(HANDLE hMem);

/**
 *
 * @brief   创建组件
 *
 * @param   父句柄
 *
 * @return  成功返回组件资源句柄 失败返回NULL
 *
 */

EXTERN_C HANDLE mruiCreateControl(HANDLE hParent);

/**
 *
 * @brief   创建窗口
 *
 * @param   扩展样式
 *
 * @param   窗口样式
 *
 * @param   窗口类名
 *
 * @param   窗口标题
 *
 * @return  成功返回窗口资源句柄 失败返回NULL
 *
 */

EXTERN_C HANDLE mruiCreateWindow(DWORD dwExStyle,DWORD dwStyle,LPCWSTR lpClassName,LPCWSTR lpWindowName);

/**
 *
 * @brief   删除组件并释放组件内存
 *
 * @param   组件资源句柄
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiClose(HANDLE hControl);

/**
 *
 * @brief   运行消息循环
 *
 * @param   窗口或窗口资源句柄 允许NULL
 *
 * @return  成功返回退出代码 失败返回0
 *
 */

EXTERN_C LRESULT mruiExec(HANDLE hControl);

/**
 *
 * @brief   设置父组件
 *
 * @param   组件资源句柄
 *
 * @param   父组件资源句柄
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiSetParent(HANDLE hControl,HANDLE hParent);

/**
 *
 * @brief   获取父组件
 *
 * @param   组件资源句柄
 *
 * @return  成功返回父组件资源句柄 失败返回NULL
 *
 */

EXTERN_C HANDLE mruiGetParent(HANDLE hControl);

/**
 *
 * @brief   移除组件
 *
 * @param   组件资源句柄
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiRemove(HANDLE hControl);

/**
 *
 * @brief   设置组件过滤器
 *
 * @param   组件资源句柄
 *
 * @param   事件回调函数 函数原型 BOOL(*)(LPVOID object,UINT message,LPVOID arg1,LPVOID arg2,LPVOID arg3);
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiSetFilter(HANDLE hControl,LPVOID filter);

/**
 *
 * @brief   获取事件过滤器的回调函数
 *
 * @param   组件资源句柄
 *
 * @return  成功返回回调函数地址 失败返回NULL
 *
 */

EXTERN_C LPVOID mruiGetFilter(HANDLE hControl);

/**
 *
 * @brief   投递组件事件
 *
 * @param   组件资源句柄
 *
 * @param   消息
 *
 * @param   参数1
 *
 * @param   参数2
 *
 * @param   参数3
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C LRESULT mruiInvokeFilter(HANDLE hControl,UINT message,LPVOID arg1,LPVOID arg2,LPVOID arg3);

/**
 *
 * @brief   设置类指针
 *
 * @param   组件资源句柄
 *
 * @param   类指针
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiSetClass(HANDLE hControl,LPVOID handle);

/**
 *
 * @brief   获取类指针
 *
 * @param   组件资源句柄
 *
 * @return  成功返回类指针 失败返回NULL
 *
 */

EXTERN_C LPVOID mruiGetClass(HANDLE hControl);

/**
 *
 * @brief   设置组件ID
 *
 * @param   组件资源句柄
 *
 * @param   组件ID
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiSetId(HANDLE hControl,LPVOID id);

/**
 *
 * @brief   获取组件ID
 *
 * @param   组件资源句柄
 *
 * @return  成功返回组件ID 失败返回NULL
 *
 */

EXTERN_C LPVOID mruiGetId(HANDLE hControl);

/**
 *
 * @brief   检查组件句柄是否有效
 *
 * @param   组件资源句柄
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiIsHandle(HANDLE hControl);

/**
 *
 * @brief   检查句柄是否是窗口
 *
 * @param   组件资源句柄
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiIsWindow(HANDLE hControl);

/**
 *
 * @brief   检查句柄是否有组件
 *
 * @param   组件资源句柄
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiIsControl(HANDLE hControl);

/**
 *
 * @brief   重绘组件区域
 *
 * @param   组件资源句柄
 *
 * @param   要重绘的区域 为空将重绘整个组件
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiRedrawRect(HANDLE hControl,LPRECT lpRect);

/**
 *
 * @brief   获取组件位于窗口的真实矩形
 *
 * @param   组件资源句柄
 *
 * @param   存放矩形的RECT指针 
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiGetScreenRect(HANDLE hControl,LPRECT lpRect);

/**
 *
 * @brief   获取组件客户区矩形
 *
 * @param   组件资源句柄
 *
 * @param   存放矩形的RECT指针 
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiGetClientRect(HANDLE hControl,LPRECT lpRect);

/**
 *
 * @brief   获取组件真实矩形
 *
 * @param   组件资源句柄
 *
 * @param   存放矩形的RECT指针 
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiGetRect(HANDLE hControl,LPRECT lpRect);

/**
 *
 * @brief   获取重绘的矩形 在组件重绘事件中使用
 *
 * @param   组件资源句柄
 *
 * @param   存放矩形的RECT指针 
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiGetPaintRect(HANDLE hControl,LPRECT lpRect);

/**
 *
 * @brief   设置组件位置和大小
 *
 * @param   组件资源句柄
 *
 * @param   左边
 *
 * @param   顶边 
 *
 * @param   宽度
 *
 * @param   高度
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiSetGeometry(HANDLE hControl,LONG x,LONG y,LONG width,LONG height);

/**
 *
 * @brief   检查是否为分层窗口
 *
 * @param   组件资源句柄
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiIsLayereWindow(HANDLE hControl);

/**
 *
 * @brief   检查组件是否在矩形内
 *
 * @param   组件资源句柄
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiUnderMouse(HANDLE hControl);

/**
 *
 * @brief   获取窗口资源句柄
 *
 * @param   组件资源句柄
 *
 * @return  成功返回窗口资源句柄 失败返回NULL
 *
 */

EXTERN_C HANDLE mruiGetWindow(HANDLE hControl);

/**
 *
 * @brief   设置焦点
 *
 * @param   组件资源句柄
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiSetFocus(HANDLE hControl);

/**
 *
 * @brief   获取拥有焦点的组件
 *
 * @param   组件资源句柄
 *
 * @return  成功返回组件资源句柄 失败返回NULL
 *
 */

EXTERN_C HANDLE mruiGetFocus(HANDLE hControl);

/**
 *
 * @brief   检查组件是否拥有焦点
 *
 * @param   组件资源句柄
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiIsFocus(HANDLE hControl);

/**
 *
 * @brief   释放鼠标焦点
 *
 * @param   组件资源句柄
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiClearFocus(HANDLE hControl);

/**
 *
 * @brief   设置鼠标捕获权
 *
 * @param   组件资源句柄
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiSetCapture(HANDLE hControl);

/**
 *
 * @brief   获取拥有鼠标捕获权的组件
 *
 * @param   组件资源句柄
 *
 * @return  成功返回组件资源句柄 失败返回NULL
 *
 */

EXTERN_C HANDLE mruiGetCapture(HANDLE hControl);

/**
 *
 * @brief   释放鼠标捕获权
 *
 * @param   组件资源句柄
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiReleaseCapture(HANDLE hControl);

/**
 *
 * @brief   获取鼠标位置
 *
 * @param   组件资源句柄
 *
 * @param   接收坐标的POINT指针
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiGetPos(HANDLE hControl,LPPOINT lpPoint);

/**
 *
 * @brief   获取设备上下文
 *
 * @param   组件资源句柄
 *
 * @return  成功返回设备上下文 失败返回NULL
 *
 */

EXTERN_C HDC mruiGetDeviceContext(HANDLE hControl);

/**
 *
 * @brief   获取首子组件
 *
 * @param   组件资源句柄
 *
 * @return  成功返回组件资源句柄 失败返回NULL
 *
 */

EXTERN_C HANDLE mruiGetFirst(HANDLE hControl);

/**
 *
 * @brief   获取尾子组件
 *
 * @param   组件资源句柄
 *
 * @return  成功返回组件资源句柄 失败返回NULL
 *
 */

EXTERN_C HANDLE mruiGetFooter(HANDLE hControl);

/**
 *
 * @brief   获取鼠标停留组件
 *
 * @param   组件资源句柄
 *
 * @return  成功返回组件资源句柄 失败返回NULL
 *
 */

EXTERN_C HANDLE mruiGetMouse(HANDLE hControl);

/**
 *
 * @brief   获取上一个组件
 *
 * @param   组件资源句柄
 *
 * @return  成功返回组件资源句柄 失败返回NULL
 *
 */

EXTERN_C HANDLE mruiGetPrevious(HANDLE hControl);

/**
 *
 * @brief   获取下一个组件
 *
 * @param   组件资源句柄
 *
 * @return  成功返回组件资源句柄 失败返回NULL
 *
 */

EXTERN_C HANDLE mruiGetNext(HANDLE hControl);

/**
 *
 * @brief   设置组件在前方显示
 *
 * @param   组件资源句柄
 *
 * @return  成功返回组件资源句柄 失败返回NULL
 *
 */

EXTERN_C BOOL mruiRaise(HANDLE hControl);

/**
 *
 * @brief   获取窗口句柄
 *
 * @param   组件资源句柄
 *
 * @return  成功返回窗口句柄 失败返回NULL
 *
 */

EXTERN_C HWND mruiGetWid(HANDLE hControl);

/**
 *
 * @brief   通过窗口句柄获取资源句柄
 *
 * @param   窗口句柄
 *
 * @return  成功返回窗口资源句柄 失败返回NULL
 *
 */

EXTERN_C HANDLE mruiWidToWindow(HWND hWnd);

/**
 *
 * @brief   设置可见状态
 *
 * @param   组件资源句柄
 *
 * @param   状态
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiSetVisible(HANDLE hControl,BOOL visible);

/**
 *
 * @brief   获取可见状态
 *
 * @param   组件资源句柄
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiGetVisible(HANDLE hControl);

/**
 *
 * @brief   设置组件可用状态
 *
 * @param   组件资源句柄
 *
 * @param   状态
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiSetDisabled(HANDLE hControl,BOOL disabled);

/**
 *
 * @brief   获取组件可用状态
 *
 * @param   组件资源句柄
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiGetDisabled(HANDLE hControl);

/**
 *
 * @brief   设置组件鼠标穿透
 *
 * @param   组件资源句柄
 *
 * @param   状态
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiSetMousePenetr(HANDLE hControl,BOOL penetr);

/**
 *
 * @brief   检查组件是否鼠标穿透
 *
 * @param   组件资源句柄
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiGetMousePenetr(HANDLE hControl);

/**
 *
 * @brief   设置属性值
 *
 * @param   组件资源句柄
 *
 * @param   属性
 *
 * @param   属性值
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiSetAttribute(HANDLE hControl,DWORD attribute,BOOL state);

/**
 *
 * @brief   获取属性值
 *
 * @param   组件资源句柄
 *
 * @param   属性
 *
 * @return  成功返回属性值 失败返回NULL
 *
 */

EXTERN_C BOOL mruiGetAttribute(HANDLE hControl,DWORD attribute);

/**
 *
 * @brief   设置组件透明度
 *
 * @param   组件资源句柄
 *
 * @param   透明度
 *
 * @return  成功返回TRUE 失败返回FALSE
 *
 */

EXTERN_C BOOL mruiSetOpacity(HANDLE hControl,FLOAT opacity);

/**
 *
 * @brief   获取组件透明度
 *
 * @param   组件资源句柄
 *
 * @param   透明度
 *
 * @return  成功返回透明度 失败返回0
 *
 */

EXTERN_C FLOAT mruiGetOpacity(HANDLE hControl);

//========================================================================================================================
//= 事件类型 在过滤器事件参数中使用 ======================================================================================
//========================================================================================================================

enum mruiEvent{
	
	EventNone,            //无事件
	EventClose,           //关闭事件
	EventTimer,           //定时器事件
	EventKeyPress,        //按键按下事件
	EventKeyRelease,      //按键释放事件
	EventKeyInput,        //字符输入
	EventSetFocus,        //焦点进入事件
	EventKillFocus,       //焦点离开事件
	EventPaint,           //绘制事件
	EventMove,            //移动事件
	EventResize,          //大小改变事件
	EventShow,            //显示事件
	EventHide,            //隐藏事件
	EventMousePress,      //鼠标按钮按下事件
	EventMouseRelease,    //鼠标按钮释放事件
	EventMouseDblClick,   //鼠标按钮双击事件
	EventMouseMove,       //鼠标移动事件
	EventMouseHover,      //鼠标进入事件
	EventMouseLeave,      //鼠标离开事件
	EventMouseWheel,      //滚轮事件
	EventReleaseCapture,  //失去鼠标捕获权
	EventWindowMessage,   //窗口消息
	EventUser,            //用户自定义事件
	
};

//========================================================================================================================
//= 按钮类型 在鼠标事件参数中使用 ========================================================================================
//========================================================================================================================

enum MouseButton{

	MouseNone,           //没有按下
	MouseLeftButton,     //左键
	MouseRightButton,    //右键
	MouseMiddleButton,   //中键

};

//========================================================================================================================
//= 属性 =================================================================================================================
//========================================================================================================================

enum Attribute{

	AttributeNone,           //空属性
	AttributeAlphaChannel,   //启用透明通道
	AttributeUser,           //用户自定义属性

};

#endif

下面是C++基础类

 

#ifndef CCONTROL_H
#define CCONTROL_H

#include <Windows.h>
#include <mrui.h>
#include <CClass.h>
#include <CEvent.h>
#include <CPoint.h>
#include <CSize.h>
#include <CRect.h>

//========================================================================================================================
//= 基础类 ===============================================================================================================
//========================================================================================================================

class CControl{

public:

	CControl(CControl * parent);
	~CControl();

public:
    //关联信号和槽
	template<class T>
    BOOL connect(LONG event,T * t,const BOOL(T::*f)(CControl&,CEvent&));

public:

	virtual BOOL filterEvent(CEvent & event);//事件过滤器
	virtual BOOL closeEvent(CEvent & event);//关闭事件
	virtual BOOL timerEvent(CEvent & event);//定时器事件
	virtual BOOL keyPressEvent(CEvent & event);//按键按下事件
	virtual BOOL keyReleaseEvent(CEvent & event);//按键释放事件
	virtual BOOL keyInputEvent(CEvent & event);//字符输入
	virtual BOOL setFocusEvent(CEvent & event);//焦点进入事件
	virtual BOOL killFocusEvent(CEvent & event);//焦点离开事件
	virtual BOOL paintEvent(CEvent & event);//绘制事件
	virtual BOOL moveEvent(CEvent & event);//移动事件
	virtual BOOL resizeEvent(CEvent & event);//大小改变事件
	virtual BOOL showEvent(CEvent & event);//显示事件
	virtual BOOL hideEvent(CEvent & event);//隐藏事件
	virtual BOOL mousePressEvent(CEvent & event);//鼠标按钮按下事件
	virtual BOOL mouseReleaseEvent(CEvent & event);//鼠标按钮释放事件
	virtual BOOL mouseDblClickEvent(CEvent & event);//鼠标按钮双击事件
	virtual BOOL mouseMoveEvent(CEvent & event);//鼠标移动事件
	virtual BOOL mouseHoverEvent(CEvent & event);//鼠标进入事件
	virtual BOOL mouseLeaveEvent(CEvent & event);//鼠标离开事件
	virtual BOOL mouseWheelEvent(CEvent & event);//滚轮事件
	virtual BOOL releaseCaptureEvent(CEvent & event);//失去鼠标捕获权
	virtual BOOL windowMessageEvent(CEvent & event);//窗口消息

public:

	const BOOL close();//关闭组件
	const BOOL remove();//移除组件
	const BOOL setGeometry(CRect & rect);//设置矩形
	const BOOL setGeometry(CPoint & pt);//设置矩形
	const BOOL setGeometry(CSize & size);//设置矩形
	const BOOL setGeometry(CPoint & pt,CSize & size);//设置矩形
	const BOOL setGeometry(LONG x,LONG y,LONG width,LONG height);//设置矩形
	const BOOL move(CPoint & pt);//设置位置
	const BOOL move(LONG x,LONG y);//设置位置
	const BOOL resize(CSize & size);//设置尺寸
	const BOOL resize(LONG width,LONG height);//设置尺寸
	const CRect paintRect();//获取重绘的区域
	const CRect screenRect();//获取屏幕坐标
	const CRect clientRect();//获取客户区坐标
	const CRect rect();//获取矩形
	const LONG x();//获取左边
	const LONG y();//获取顶边
	const LONG width();//获取宽度
	const LONG height();//获取高度
	const CPoint pos();//获取鼠标点
	const BOOL setEnabled(BOOL enabled);//设置可用状态
	const BOOL isEnabled();//检查是否可用
	const BOOL setVisible(BOOL visible);//设置显示状态
	const BOOL isVisible();//是否显示
	const BOOL show();//显示
	const BOOL hide();//隐藏
	const BOOL setFocus();//设置焦点
	const BOOL clearFocus();//释放焦点
	const CControl * focus();//获取焦点组件
	const BOOL isFocus();//是否拥有焦点
	const BOOL setParent(CControl * parent);//设置父组件
	const CControl * parent();//获取父组件
	const BOOL update();//刷新窗口
	const BOOL underMouse();//检查是否在矩形内
	const HDC hdc();//组件上下文
	const HWND Wid();//获取窗口句柄
	const CControl * window();//获取窗口
	const CControl * first();//首子组件
	const CControl * footer();//尾子组件
	const CControl * mouse();//鼠标停留控件
	const CControl * previous();//上一个组件
	const CControl * next();//下一个组件
	const BOOL isWindow();//是否是窗口
	const BOOL isControl();//是否是组件
	const BOOL isLayereWindow();//是否为分层窗口
	const BOOL raise();//在顶层显示
	const BOOL setCapture();//设置鼠标捕获权
	const BOOL isCapture();//是否有捕获权
	const BOOL releaseCapture();//释放捕获权
	const BOOL setId(LPVOID id);//设置ID
	const LPVOID id();//获取ID
	const LRESULT exec();//运行消息循环
	const BOOL setAttribute(INT attribute,BOOL state);//设置属性
	const BOOL attribute(INT attribute);//获取属性
	const BOOL setOpacity(FLOAT opacity);//设置透明度
	const FLOAT opacity();//获取透明度

};

#endif

定制一个按钮

#ifndef CBUTTON_H
#define CBUTTON_H

#include <Windows.h>
#include <CClass.h>
#include <CControl.h>

class CButton : public CControl{

public:

	CButton(CControl * parent = nullptr);

public:

	virtual BOOL paintEvent(CEvent & event);//绘制事件
	virtual BOOL mousePressEvent(CEvent & event);//鼠标按钮按下事件
	virtual BOOL mouseReleaseEvent(CEvent & event);//鼠标按钮释放事件
	virtual BOOL mouseHoverEvent(CEvent & event);//鼠标进入事件
	virtual BOOL mouseLeaveEvent(CEvent & event);//鼠标离开事件
	virtual BOOL releaseCaptureEvent(CEvent & event);//失去鼠标捕获权

private:

	INT m_state;//状态

};

//========================================================================================================================
//= 按钮状态 =============================================================================================================
//========================================================================================================================

enum ButtonState{

	ButtonStateNone,//常规
	ButtonStateEnter,//鼠标进入
	ButtonStateProcess,//鼠标按下
	ButtonStateEnabled,//禁止
	ButtonStateBehind,//后处理
};



#endif


#include <CButton.h>


//========================================================================================================================
//= 构造函数 =============================================================================================================
//========================================================================================================================

CButton::CButton(CControl * parent):CControl(parent){

	m_state = ButtonStateNone;

}

//========================================================================================================================
//= 绘制事件 =============================================================================================================
//========================================================================================================================

BOOL CButton::paintEvent(CEvent & event){

	HFONT hFont = { 0 };
	HBRUSH hBrush = { 0 };
	TRIVERTEX vert[2] = { 0 };
	GRADIENT_RECT gRect = { 0 };
	
	/** 获取矩形 */
	CRect paint = CControl::paintRect();
	RECT rect = {paint.left(),paint.top(),paint.right(),paint.bottom()};
		
	/** 绘制常规状态 */
	if(m_state == ButtonStateNone){
	
		/** 绘制矩形 */
		hBrush = CreateSolidBrush(RGB(255,255,255));
		FillRect(hdc(),&rect,hBrush);
		DeleteObject(hBrush);

		/** 绘制边框 */
		hBrush = CreateSolidBrush(RGB(200,200,200));
		FrameRect(hdc(),&rect,hBrush);
		DeleteObject(hBrush);
	
		/** 绘制字体 */
		DrawTextW(hdc(),L"button",(INT)6,&rect,DT_VCENTER | DT_SINGLELINE | DT_CENTER | DT_END_ELLIPSIS);
	
		return TRUE;

	}

	
	/** 绘制进入状态 */
	if(m_state == ButtonStateEnter){
	
		/** 绘制矩形 */
		hBrush = CreateSolidBrush(RGB(230,230,230));
		FillRect(hdc(),&rect,hBrush);
		DeleteObject(hBrush);

		/** 绘制边框 */
		hBrush = CreateSolidBrush(RGB(111,111,255));
		FrameRect(hdc(),&rect,hBrush);
		DeleteObject(hBrush);
	
		/** 绘制字体 */
		DrawTextW(hdc(),L"button",(INT)6,&rect,DT_VCENTER | DT_SINGLELINE | DT_CENTER | DT_END_ELLIPSIS);
	
		return TRUE;

	}

			
	/** 绘制按下状态 */
	if(m_state == ButtonStateProcess){
	
		/** 绘制矩形 */
		hBrush = CreateSolidBrush(RGB(200,200,200));
		FillRect(hdc(),&rect,hBrush);
		DeleteObject(hBrush);

		/** 绘制边框 */
		hBrush = CreateSolidBrush(RGB(111,119,255));
		FrameRect(hdc(),&rect,hBrush);
		DeleteObject(hBrush);
	
		/** 绘制字体 */
		DrawTextW(hdc(),L"button",(INT)6,&rect,DT_VCENTER | DT_SINGLELINE | DT_CENTER | DT_END_ELLIPSIS);
	
		return true;

	}



	return TRUE;
}

//========================================================================================================================
//= 鼠标按钮按下事件 =====================================================================================================
//========================================================================================================================

BOOL CButton::mousePressEvent(CEvent & event){

	setCapture();

	m_state = ButtonStateProcess;

	update();

	return TRUE;
}

//========================================================================================================================
//= 鼠标按钮释放事件 =====================================================================================================
//========================================================================================================================

BOOL CButton::mouseReleaseEvent(CEvent & event){

	releaseCapture();

	if(underMouse()){
	
		m_state = ButtonStateEnter;

	}else{
	
		m_state = ButtonStateNone;

	}


	update();

	return TRUE;
}

//========================================================================================================================
//= 鼠标进入事件 =========================================================================================================
//========================================================================================================================

BOOL CButton::mouseHoverEvent(CEvent & event){

	m_state = ButtonStateEnter;

	update();

	return TRUE;
}

//========================================================================================================================
//= 鼠标离开事件 =========================================================================================================
//========================================================================================================================

BOOL CButton::mouseLeaveEvent(CEvent & event){
	
	m_state = ButtonStateNone;

	update();

	return TRUE;
}

//========================================================================================================================
//= 失去鼠标捕获权 =======================================================================================================
//========================================================================================================================

BOOL CButton::releaseCaptureEvent(CEvent & event){


	if(underMouse()){
	
		m_state = ButtonStateEnter;

	}else{
	
		m_state = ButtonStateNone;

	}

	update();

	return TRUE;
}

开始使用

#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
#include "CControl\CControl.h"
#include "CControl\CButton.h"


class MainWindow : public CControl{


public:


	MainWindow(CControl * parent = nullptr):CControl(parent){

		//创建按钮
		CButton * button = new CButton(this);

		//设置位置
		button->setGeometry(100,100,100,50);

		//设置组件透明度
		button->setOpacity(0.5f);

		//关联鼠标抬起信号 
		button->connect(EventMouseRelease,this,&MainWindow::OnClick);

	}

    //槽函数
	const BOOL OnClick(CControl & object,CEvent & event){
	
		::MessageBoxA(Wid(),"点击事件",0,0);
	
		return FALSE;
	
	}






    //关闭事件
	virtual BOOL closeEvent(CEvent & event){
	
		PostQuitMessage(0);	

		CControl::closeEvent(event);

		return TRUE;
	}







};

//========================================================================================================================
//= 程序入口 =============================================================================================================
//========================================================================================================================

int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow){

	MainWindow window(nullptr);

	window.show();

	window.exec();

	return 0;

}

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值