当前位置: 首页 > 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;看懂了就去分享给你的码吧。 描述 给定一个无序…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...