SAI色轮的实现方法
以下图片来自于我自己模仿SAI1实现的软件xcai(小彩).

接下来介绍它的实现方法, 这也是SAI1的实现方法.
首先, 可以把上图看作一个整体, 这个整体由3个部分组成: 色环(对应色相), 矩形区域(对应饱和度和明度), 其他区域.

色轮(Color Wheel)
整个色轮可以用一个Windows 窗口表示, 在收到WM_PAINT消息绘制它, 在收到鼠标消息时改变它的状态. 需要处理的鼠标消息有WM_LBUTTONDOWN, WM_MOUSEMOVE, WM_LBUTTONUP.
在鼠标按下时, 判断鼠标所处区域, 不同区域需要执行不同的代码.
在鼠标移动时, 如果鼠标没有按下, 则只需要根据鼠标所处区域修改光标, 在色环部分的光标是一个普通的Windows 箭头去掉了柄后的样子, 在矩形区域内则是滴管形状的取色器, 其他部分是普通的Windows箭头光标.
如果鼠标移动时, 鼠标是按下状态, 那么根据鼠标按下时所处区域执行不同的代码.
如果是色环部分, 则将鼠标位置与圆环圆心连线, 连线与环的相交线段的中点记为当前色相, 也就是圆环内的小圆圈的圆心. 根据色相更新矩形区域的颜色(修改位图, 并使用修改后的位图绘制矩形区域).
如果鼠标按下时是矩形区域, 则只需要取鼠标移动时的点对应矩形区域位图中的像素颜色设置为当前颜色就行了.
色环(Hue)
色环实际上是固定的一副位图, 因为它不需要改变.
矩形区域(Saturation Value)
矩形区域对应了一副位图, 这副位图是根据色相动态修改的.