首页 > 其他分享 >使用soui4实现一个拾色器控件

使用soui4实现一个拾色器控件

时间:2024-09-15 10:53:04浏览次数:13  
标签:控件 point rcClient void int 拾色器 hsv soui4 CClrPickerCtrl

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="CuY10lQG-1726128483317" src="https://live.csdn.net/v/embed/423936"></iframe>

拾色器

拾色器类

#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 onm ouseMove(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-255
	int 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 = 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();
	}
}

标签:控件,point,rcClient,void,int,拾色器,hsv,soui4,CClrPickerCtrl
From: https://blog.csdn.net/ceffans/article/details/142169045

相关文章

  • 一款类excel可进行显示、在线编辑的纯js表格TableShow控件
        在进行前端显示设计时,传统的方法是以分页显示,逐条提取后修改及保存,非常不利于用户连贯阅读及在线修改。因此,本人将类似excel的一些table表格在线卷动显示、修改及集中保存功能进行了尝试,封装成了一个纯js控件,只通过一句代码进行调用,将数据库查询结果集进行显示和添......
  • QtDesigner控件提升为自定义控件
    创建自定义控件classMyTextEdit(QTextEdit):fanYi=Signal(str,QPoint)def__init__(self,parent=None):super(MyTextEdit,self).__init__(parent)#指定菜单self.setContextMenuPolicy(Qt.CustomContextMenu)#连接菜单函......
  • .NET 多版本 WinForm 开源控件库 SunnyUI
    合集-.NET开源工具(15) 1..NET开源快捷的数据库文档查询和生成工具07-312..NET结果与错误处理利器FluentResults08-013..NET+WPF桌面快速启动工具GeekDesk08-194.Gradio.NET支持.NET8简化Web应用开发08-265..NET开源实时监控系统-WatchDog08-276.实用接地......
  • 旋转按钮—C#自定义控件1
    C#自定义控件—旋转按钮 C#用户控件之旋转按钮按钮功能:手自动旋转,标签文本显示、点击二次弹框确认(源码在最后边);【制作方法】找到控件的中心坐标,画背景外环、内圆;再绘制矩形开关,进行角度旋转即可获得;【关键节点】No.1获取中心坐标,思考要绘制图形的相对坐标、宽度......
  • QT绘图控件
    下载示例代码voidPlanetSystem::initSystem(){//PlanetNode(公转半径,公转速度,自身半径,自转速度,颜色)rootPlanet=newPlanetNode(0,0.0f,40,1.5f,QColor(255,0,0));PlanetNode*p0=newPlanetNode(100,1.5f,15,1.5f,QColor(255,255,0));......
  • C#中设置自定义控件工具箱图标
    在设计自定义控件时,系统默认生成的图标比较单一且难看,如何为控件设计自己的图标呢,这里给出了一种基于ToolBoxBitmap 属性设置自定义控件工具箱图标的方法。1、首先将图标文件名改为自定义控件名,如自定义控件类为: public partial class UserDefindControl: UserControl {......
  • .NET 多版本 WinForm 开源控件库 SunnyUI
    前言给大家推荐一款开源的Winform控件库,可以帮助我们开发更加美观、漂亮的WinForm界面。项目介绍SunnyUI.NET是一个基于.NETFramework4.0+、.NET6、.NET7和.NET8的WinForm开源控件库,同时也提供了工具类库、扩展类库和多页面开发框架。基于.NETFramework4.0......
  • C# 控件的Tag的几种用法
    在C#中,Tag属性是一个非常灵活的特性,它允许开发者存储任意类型的数据到控件上。Tag属性广泛应用于WindowsForms、WPF以及其他基于控件的应用程序开发中。下面列举了几种Tag属性的常见用法:1.存储额外数据Tag属性可以用来存储与控件相关的额外信息,这些信息可能不是控......
  • WPF创建不规则窗体时WebBrowser控件不显示的问题
    最近有小伙伴需要在不规则窗体上放置WebBrowser控件,因为设置了WindowStyle="None"和AllowsTransparency="True"。导致WebBrowser控件不显示。 界面代码如下所示:1<Windowx:Class="WebBrowserDemo.MainWindow"3xmlns="http://schemas.microsoft.com/win......
  • python中Tkinter常用控件含义
    #python中Tkinter常用控件Button'按钮控件;在程序中显示按钮。'Canvas'画布控件;显示图形元素如线条或文本'Checkbutton'多选框控件;用于在程序中提供多项选择框'Entry'输入控件;用于显示简单的文本内容'Frame......