介绍 通常,我想要一个选择器或一个漂亮的HSL滑块或一个alpha通道。下面是一个用于代码的单文件库,它与Direct2D一起工作,并为选择颜色提供了一个现代界面。 使用的代码 你有一个单一的函数调用: 隐藏,复制Code
#include "colorpick.hpp" COLORPICK p; D2D1_COLOR_F c1 = {1.0f,0,0,1.0f}; // init with red HRESULT hr = p.Show(0, c); if (hr == S_OK) { ... } // Color is set
还有可能,传递一个带有更多选项的可选结构: 隐藏,复制Code
struct COLORPICKOPT { bool Alpha = 1; int Mode = 1; float rsl = 0.1f; bool Dlg = 1; bool LUpdate = 0; bool AlsoUseSystem = 1; bool UsePicker = 1; float Resolution = 0.1f; };
深入它 RGB和奥软 让我们深入研究一下。从RGB到HSL以及从HSL到RGB的转换是通过fromRGBtoHSL和fromHSLtoRGB函数完成的——请参阅更多内容。 画 所有的绘图都是由一个ID2D1HwndRenderTarget完成的,它将在WM_PAINT上创建。这,取决于使用的模式,将: 绘制117个方块与预先定义的颜色为RGB模式(从这里)。在HSL模式下画一个色轮。色轮是逐像素、逐线绘制的。每一行都有一个指定的色相值,当旋转时,它的最大值为360。,整个圆。这条线的半径是颜色的饱和度。色调滑块是用一个360值的Direct2D直线笔刷绘制的。 色相条可以用线性画笔绘制: 隐藏,收缩,复制Code
std::vector<D2D1_GRADIENT_STOP> gst(360); for (int i = 0; i < 360; i++) { float hsl[3] = { 1,1,L }; hsl[0] = (360 - i) / 360.0f; hsl[0] *= 6.0f; float rgb[3] = {}; fromHSLtoRGB(hsl, rgb); gst[i].position = i / 360.0f; gst[i].color.r = rgb[0]; gst[i].color.g = rgb[1]; gst[i].color.b = rgb[2]; gst[i].color.a = 1.0f; } pGradientStops = 0; lbr = 0; p->CreateGradientStopCollection( gst.data(), 360, D2D1_GAMMA_2_2, D2D1_EXTEND_MODE_CLAMP, &pGradientStops ); p->CreateLinearGradientBrush( D2D1::LinearGradientBrushProperties( D2D1::Point2F(LRect.left, LRect.top), D2D1::Point2F(LRect.right, LRect.bottom)), pGradientStops, &lbr);
这个线性渐变笔刷现在可以用来绘制色相条。其他线条(S、L或R、G、B、Alpha)都是纯实心笔刷。 键盘 WM_COMMAND和WM_KEYDOWN处理IDOK/IDCANCEL和VK_RETURN/VK_ESCAPE提交或取消颜色选择。 内联编辑 点击Alpha值,R,G,B(在RGB模式下)或H,S,L(在HSL模式下)值会显示一个内联编辑框(带有ES_NUMBER),允许你输入一个值(0-350表示H, 0-100表示Alpha, 0-255表示其他)。当编辑处于活动状态时,VK_RETURN/VK_ESCAPE作用于编辑值。 鼠标操作 点击: RGB值来选择点击的颜色,色轮来选择点击的颜色,R,G,B或H,S,L条来设置值,Alpha, R,G,B或H,S,L值来内联编辑值 阻力: RGB或HSL条设置值,色轮设置HSL值 轮行动: 在条上旋转值,在RGB/HSL值上旋转值 系统对话框 公共对话框选择器可以用于那些习惯它的人。按“S”键将显示常用对话框,并设置/获取所选值。 的选择器 通常情况下,你想选择你看到的颜色,但你不能说出它的名字。控件包括一个选择器,你可以点击它,然后把它拖到屏幕上(在颜色选择器之外),它会捕获它下面的任何颜色。它使用SetCapture API。 的参数 bool Alpha = 1;默认情况下,颜色选择器也显示alpha控件。如果你不想改变,传递0给它。返回的颜色将有一个1.0f的alpha值。int模式= 1;//从RGB开始。如果为0,则从HSL开始。bool Dlg = 1;//如果为0,则为窗口而不是对话框。bool LUpdate = 0;//如果1,在设置L时,色轮更新(较慢)bool = 1;//显示允许使用系统通用控件bool UsePicker = 1的“S”按钮;//显示启用选择器时的十字浮动分辨率= 0.1f;//色轮分辨率(较小值->较小的速度比;更好的视图) 这个项目 # include colorpick。hpp在您的应用程序中,您准备好了。github回购包括一个示例解决方案,您可以学习。 历史 2020年6月2日-第一次发布 本文转载于:http://www.diyabc.com/frontweb/news2548.html