当前位置: 首页 > news >正文

使用soui4实现一个拾色器

拾色器类

#pragma once
class CClrPickerCtrl : public SWindow
{DEF_SOBJECT(SWindow, L"clrpicker")
public:CClrPickerCtrl(void);~CClrPickerCtrl(void);//跟solider控件设置色调void SetSliderPos(int nPos);//获取选取位置的颜色COLORREF GetColor();
protected:LRESULT OnCreate(LPVOID);void OnPaint(IRenderTarget* pRT);void OnLButtonDown(UINT nFlags, SOUI::CPoint pt);void OnLButtonUp(UINT nFlags, SOUI::CPoint pt);void OnMouseMove(UINT nFlags, SOUI::CPoint point);SOUI_MSG_MAP_BEGIN()MSG_WM_CREATE(OnCreate)MSG_WM_PAINT_EX(OnPaint)MSG_WM_LBUTTONDOWN(OnLButtonDown)MSG_WM_LBUTTONUP(OnLButtonUp)MSG_WM_MOUSEMOVE(OnMouseMove)SOUI_MSG_MAP_END()SOUI_ATTRS_BEGIN()SOUI_ATTRS_END()protected://将HSV色彩模型转为RGB颜色值COLORREF HSV2RGB(const double hsv[3]);private:SOUI::CPoint m_point;int	m_nSoliderPos;COLORREF m_clrSelect;
};
#include "stdafx.h"
#include "CClrPickerCtrl.h"CClrPickerCtrl::CClrPickerCtrl()
{m_nSoliderPos = 0;
}CClrPickerCtrl::~CClrPickerCtrl()
{
}LRESULT CClrPickerCtrl::OnCreate(LPVOID)
{SetMsgHandled(FALSE);return __super::OnCreate(NULL);
}
COLORREF CClrPickerCtrl::HSV2RGB(const double hsv[3])
{//RGB的0.0-1.0表示double r = 0.0;double g = 0.0;double b = 0.0;int h_i = (int)abs(hsv[0] / 60.0);double f = hsv[0] / 60.0 - h_i;double p = hsv[2] * (1 - hsv[1]);double q = hsv[2] * (1 - f * hsv[1]);double t = hsv[2] * (1 - (1 - f) * hsv[1]);switch (h_i) {case 0:r = hsv[2]; g = t; b = p;break;case 1:r = q; g = hsv[2]; b = p;break;case 2:r = p; g = hsv[2]; b = t;break;case 3:r = p; g = q; b = hsv[2];break;case 4:r = t; g = p; b = hsv[2];break;case 5:r = hsv[2]; g = p; b = q;break;}//转换成0-255int R = (int)(r * 255 + 0.5);int G = (int)(g * 255 + 0.5);int B = (int)(b * 255 + 0.5);return RGBA(R, G, B, 255);
}
void CClrPickerCtrl::OnPaint(IRenderTarget* pRT)
{SetMsgHandled(FALSE);pRT->SetAntiAlias(TRUE);CRect rcClient = GetWindowRect();int nStep = rcClient.Width() / 100;for (int i = 0; i < 100; i++){double hsv[3] = { m_nSoliderPos, (double)i / 100, 1};COLORREF crUp = HSV2RGB(hsv);COLORREF crDown = RGBA(0, 0, 0, 255);CRect rcDraw = { rcClient.left + nStep * i,	rcClient.top, rcClient.left + nStep * (i + 1), rcClient.bottom };GradientItem gradients[2] = { crUp, 0.0f, crDown, 1.0f };pRT->DrawGradientRect(rcDraw, TRUE, CPoint(), gradients, 2, 0xff);}m_clrSelect = pRT->GetPixel(m_point.x, m_point.y);//绘制鼠标选中区域CAutoRefPtr<IPen> pen, oldpen;COLORREF clrBorder = GETCOLOR(L"RGBA(255,255,255,255)");pRT->CreatePen(PS_SOLID | PS_ENDCAP_SQUARE, clrBorder, 2, &pen);pRT->SelectObject(pen, (IRenderObj**)&oldpen);CRect rcClrArea;rcClrArea.top = m_point.y;rcClrArea.left = m_point.x;rcClrArea.right = m_point.x + 6;rcClrArea.bottom = m_point.y + 6;pRT->DrawRectangle(rcClrArea);pRT->SelectObject(oldpen, NULL);
}
void CClrPickerCtrl::OnLButtonDown(UINT nFlags, SOUI::CPoint pt)
{SetMsgHandled(FALSE);m_point = pt;Invalidate();
}
void CClrPickerCtrl::OnLButtonUp(UINT nFlags, SOUI::CPoint pt)
{SetMsgHandled(FALSE);//将颜色通过事件传递至上层Invalidate();
}
void CClrPickerCtrl::OnMouseMove(UINT nFlags, SOUI::CPoint point)
{SetMsgHandled(FALSE);CRect rcClient = GetClientRect();if ((nFlags & MK_LBUTTON)){m_point = point;if (point.x < rcClient.left) m_point.x = rcClient.left;else if (point.x > rcClient.right) m_point.x = rcClient.right;if (point.y < rcClient.top) m_point.y = rcClient.top;else if (point.y > rcClient.bottom) m_point.y = rcClient.bottom;}Invalidate();
}
void CClrPickerCtrl::SetSliderPos(int nPos)
{m_nSoliderPos = 359 - nPos;Invalidate();
}
COLORREF CClrPickerCtrl::GetColor()
{return m_clrSelect;
}

控件使用:
1、注册控件

m_theApp->RegisterWindowClass<CClrPickerCtrl>();

2、在布局中使用

<clrpicker name="clrpick" pos="100,[10,@450,@250" colorBkgnd="#FFFFFF" />
<sliderbar name ="sliderbar" vertical="1" thumbInRail="1" pos="[-30,{0,@16,@250" thumbSkin="skin_color_pick_thum" posSkin="skin_null" bkgndSkin="skin_color_pick_bk" min="0" max="359"/>

3、效果
在这里插入图片描述
在这里插入图片描述
在solider控件更改滑块位置时需要通知拾色器控件

//函数定义
void OnSilderChange(EventArgs* pEvt);//事件关联
EVENT_NAME_HANDLER(L"sliderbar", EventSliderPos::EventID, OnSilderChange)//函数实现
void CMainDlg::OnSilderChange(EventArgs* pEvt)
{EventSliderPos* evt = (EventSliderPos*)pEvt;if (evt){SSliderBar* pSliderbar = FindChildByName2<SSliderBar>(L"sliderbar");CClrPickerCtrl* pClrPick = FindChildByName2<CClrPickerCtrl>(L"clrpick");SASSERT(pClrPick);pClrPick->SetSliderPos(evt->nPos);pClrPick->Invalidate();}
}

相关文章:

使用soui4实现一个拾色器

拾色器类 #pragma once class CClrPickerCtrl : public SWindow {DEF_SOBJECT(SWindow, L"clrpicker") public:CClrPickerCtrl(void);~CClrPickerCtrl(void);//跟solider控件设置色调void SetSliderPos(int nPos);//获取选取位置的颜色COLORREF GetColor(); protect…...

Thinkphp5 + Swoole实现邮箱异步通知

在 ThinkPHP 中实现邮箱异步通知的常见做法是通过队列系统来处理异步任务&#xff0c;结合 Swoole 来处理异步发送邮件的请求。这样可以避免同步处理邮件发送导致的阻塞&#xff0c;提高响应速度。 以下是基于 ThinkPHP5 框架和 Swoole 的异步邮件通知实现步骤&#xff1a; 一…...

LLM - 理解 多模态大语言模型 (MLLM) 的预训练与相关技术 (三)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142063880 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 完备(F…...

工具篇之Joda-Time

在Java应用程序开发中&#xff0c;处理日期和时间是一项常见且复杂的任务。尽管Java标准库提供了基本的日期和时间操作类&#xff0c;但它们的使用常常不够直观和灵活。Joda-Time 是一个强大的日期和时间库&#xff0c;提供了丰富的API&#xff0c;用于简化日期和时间的操作。本…...

架构师应该懂得东西,软考应该具备的

架构师应该懂得知识 架构师作为软件系统设计和开发的关键角色&#xff0c;需要掌握广泛的知识和技能。具体来说&#xff0c;他们应该懂得以下几方面的知识&#xff1a; 编程语言&#xff1a;掌握至少一种编程语言&#xff0c;如Java、C、Python等&#xff0c;以便于进行系统设…...

图论篇--代码随想录算法训练营第五十一天打卡| 99. 岛屿数量(深搜版),99. 岛屿数量(广搜版),100. 岛屿的最大面积

99. 岛屿数量&#xff08;深搜版&#xff09; 题目链接&#xff1a;99. 岛屿数量 题目描述&#xff1a; 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而…...

什么是API网关(API Gateway)?

1. 什么是API网关&#xff08;API Gateway&#xff09;&#xff1f; 在微服务体系结构中&#xff0c;客户端可能与多个前端服务进行交互。 API 网关位于客户端与服务之间。 它充当反向代理&#xff0c;将来自客户端的请求路由到服务。 它还可以执行各种横切任务&#xff0c;例…...

对话:LLC磁集成能否成为充电桩模块电源常态产品?

编者按&#xff1a;在终端需求疲软的影响下&#xff0c;前两年火热的新能源汽车、光伏、储能等新能源领域也掀起了价格战&#xff0c;储能已正式进入0.5元时代&#xff0c;新能源汽车领域价格战更是一轮接一轮&#xff0c;成本管控成为2024年企业绕不开的话题。 接下来我们将围…...

基于SSM的二手物品交易管理系统的设计与实现 (含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的二手物品交易管理系统7拥有两种角色 管理员&#xff1a;用户管理、分类管理、商品管理、订单管理、系统管理等 用户&#xff1a;登录注册、充值、收货、评价、收藏、购物车、订…...

视觉语言模型中的人脸社会感知

本文研究了视觉语言模型CLIP在处理人脸图像时的社会感知能力及其潜在偏见。研究者们构建了一个名为CausalFace的合成人脸数据集&#xff0c;通过系统地独立变化年龄、性别、人种、面部表情、照明和姿势等六个维度来评估模型的社会感知。他们发现&#xff0c;尽管CLIP是在多样化…...

JAVA学习-练习试用Java实现“最小覆盖子串”

问题&#xff1a; 给定一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a;如果 s 中存在这样的子串&#xff0c;我们保证它是唯一的答案。 示例 1&…...

关于axios同步获取数据的问题

axios同步获取数据 Axios介绍问题代码修改 总结 Axios介绍 Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 X…...

java-在ANTLR中,如何从java文件中提取类名和方法名0.1.8

java-在ANTLR中&#xff0c;如何从java文件中提取类名和方法名0.1.0 目标java源文件java的g4文件生成antlr代码最终代码调测结果阶段性总结 2024年9月12日11:16:01----0.1.8 目标 从一个java文件中提取出类名和方法名 java源文件 文件名是main.java&#xff0c;具体内容如下…...

十大护眼灯钢琴灯品牌是智商税吗?十大钢琴灯品牌排行榜

十大护眼灯钢琴灯品牌是智商税吗&#xff1f;不良的光线不仅会使得孩子在读写用眼时眼睛不舒服&#xff0c;还会引起视觉疲劳伤眼视力健康&#xff0c;这个时候要能有一台可靠的护眼灯钢琴灯&#xff0c;那真是再好不过了。但是市面上护眼灯钢琴灯的种类太多&#xff0c;盲目挑…...

搜维尔科技:CyberGlove将实时捕捉运动信号和触觉反馈,将其重新定位到人形机器人进行驱动

CyberGlove将实时捕捉运动信号和触觉反馈&#xff0c;然后将其重新定位到人形机器人上。 这款18个传感器&#xff08;有18节点和22节点两个型号&#xff0c;22节点早期用于美国军事方面&#xff0c;支持无线通信、蓝牙、WiFi、射频&#xff09;数据手套的每个手指上有两个弯曲…...

数据结构:堆的算法

目录 一堆的向上调整算法二堆的向下调整算法三堆的应用:堆排序四TOPK问题 一堆的向上调整算法 我们在堆中插入一个数据一般实在堆的最后插入然后可以一步一步与上层结点&#xff08;父结点进行比较&#xff09;&#xff0c;继而进行交换&#xff0c;完成二叉树的结构&#xff0…...

python画图|3D直方图基础教程

前述已经完成了直方图和3D图的基本学习&#xff0c;链接如下&#xff1a; 直方图&#xff1a;python画图|水平直方图绘制-CSDN博客 3D图&#xff1a;python画图|水平直方图绘制-CSDN博客 现在我们尝试把二者结合&#xff0c;画3D直方图。 【1】官网教程 首先&#xff0c;依…...

C语言中的函数,实参,形参,递归

1&#xff1a;什么是函数 2&#xff1a;定义带形式参数的函数和带实际参数的函数 3&#xff1a;递归 --------------------------------------------------------------------------------------------------------------------------------- 1&#xff1a;在 C 语言中&…...

ICM20948 DMP代码详解(15)

接前一篇文章&#xff1a;ICM20948 DMP代码详解&#xff08;14&#xff09; 上一回开始对icm20948_sensor_setup函数中第3段代码即inv_icm20948_initialize函数进行解析。为了便于理解和回顾&#xff0c;再次贴出其源码&#xff0c;在EMD-Core\sources\Invn\Devices\Drivers\IC…...

NC 和为K的连续子数组

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定一个无序…...

Mem Reduct下载官网最新版|免费电脑内存清理工具使用教程

着急下载 Mem Reduct 软件的&#xff0c;直接提供下载地址&#xff1a;Mem Reduct中文版安装包 Mem Reduct 是一款轻量级的 Windows 内存清理工具&#xff0c;通过调用底层 Native API 深度释放非活动内存数据&#xff0c;缓解系统卡顿。它的核心优势是极致轻量&#xff08;安装…...

终极免费AI图像放大工具Upscayl完整指南:高效提升图片分辨率

终极免费AI图像放大工具Upscayl完整指南&#xff1a;高效提升图片分辨率 【免费下载链接】upscayl &#x1f199; Upscayl - #1 Free and Open Source AI Image Upscaler for Linux, MacOS and Windows. 项目地址: https://gitcode.com/GitHub_Trending/up/upscayl Upsc…...

告别手动水印:如何用Semi-Utils将批量照片处理时间从5小时缩短到5分钟

告别手动水印&#xff1a;如何用Semi-Utils将批量照片处理时间从5小时缩短到5分钟 【免费下载链接】semi-utils 一个批量添加相机机型和拍摄参数的工具&#xff0c;后续「可能」添加其他功能。 项目地址: https://gitcode.com/gh_mirrors/se/semi-utils 还在为数百张照片…...

昇思大模型垂域模型

昇思 MindSpore 垂域模型是基于通用大模型基座 行业数据微调 领域技术增强构建的行业专用 AI 模型&#xff0c;依托 MindSpore Transformers 套件与昇腾硬件&#xff0c;在医疗、金融、电力、法律、工业等领域实现深度落地&#xff0c;兼顾通用能力与行业专业性&#xff0c;训…...

可穿戴声音装置DIY:用Adafruit Audio FX板制作互动节日毛衣

1. 项目概述&#xff1a;一件会“说话”的节日毛衣又到年底节日扎堆的时候了&#xff0c;除了琢磨穿什么衣服&#xff0c;你有没有想过让衣服本身成为节日气氛的一部分&#xff1f;我说的不是简单的亮片或印花&#xff0c;而是让衣服能发出声音——比如一按袖子就响起清脆的铃铛…...

三星固件下载神器Bifrost:三分钟学会跨平台官方固件下载与解密

三星固件下载神器Bifrost&#xff1a;三分钟学会跨平台官方固件下载与解密 【免费下载链接】Bifrost Cross-platform tool for downloading Samsung mobile device firmware. 项目地址: https://gitcode.com/gh_mirrors/sa/Bifrost 还在为找不到三星官方固件而烦恼吗&am…...

Windows电脑直接运行安卓应用:APK安装器完全指南

Windows电脑直接运行安卓应用&#xff1a;APK安装器完全指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾幻想过在Windows电脑上流畅运行安卓应用&#xff…...

H5GG iOS模组引擎:基于JavaScript的iOS应用内存操作与界面定制技术实现

H5GG iOS模组引擎&#xff1a;基于JavaScript的iOS应用内存操作与界面定制技术实现 【免费下载链接】H5GG an iOS Mod Engine with JavaScript APIs & Html5 UI 项目地址: https://gitcode.com/gh_mirrors/h5/H5GG H5GG是一款创新的iOS模组引擎&#xff0c;通过Java…...

折叠表达式:左折叠,右折叠

关于何为左右折叠表达式可以直接通过 C Insights (C Insights) 来进行查看原理。左折叠template <typename... Args> auto getSum(Args... args) {return (args ...); }int main() {getSum(1, 2, 3, 4, 5); } template <typename... Args> auto getSum(Args... ar…...

AI Agent设计模式:从ReAct到Plan-and-Execute

Agent 设计模式&#xff1a;ReAct 与 Plan-Execute 讲透Function Calling 让 Agent 会用工具&#xff0c;但真正让 Agent「聪明」的&#xff0c;是它的思考模式。这就像给你一本字典不意味着你会写文章——你需要方法论。ReAct 和 Plan-Execute 就是 Agent 的两种核心方法论。一…...