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

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Rust 异步编程

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

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...