一直在使用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;
}