SAI色輪的實(shí)現(xiàn)方法
????以下圖片來自于我自己模仿SAI1實(shí)現(xiàn)的軟件xcai(小彩).

????接下來介紹它的實(shí)現(xiàn)方法, 這也是SAI1的實(shí)現(xiàn)方法.
????首先, 可以把上圖看作一個(gè)整體, 這個(gè)整體由3個(gè)部分組成: 色環(huán)(對(duì)應(yīng)色相), 矩形區(qū)域(對(duì)應(yīng)飽和度和明度), 其他區(qū)域.?

色輪(Color Wheel)
????整個(gè)色輪可以用一個(gè)Windows 窗口表示, 在收到WM_PAINT消息繪制它, 在收到鼠標(biāo)消息時(shí)改變它的狀態(tài). 需要處理的鼠標(biāo)消息有WM_LBUTTONDOWN, WM_MOUSEMOVE, WM_LBUTTONUP.
????在鼠標(biāo)按下時(shí), 判斷鼠標(biāo)所處區(qū)域, 不同區(qū)域需要執(zhí)行不同的代碼.
????在鼠標(biāo)移動(dòng)時(shí), 如果鼠標(biāo)沒有按下, 則只需要根據(jù)鼠標(biāo)所處區(qū)域修改光標(biāo), 在色環(huán)部分的光標(biāo)是一個(gè)普通的Windows 箭頭去掉了柄后的樣子, 在矩形區(qū)域內(nèi)則是滴管形狀的取色器, 其他部分是普通的Windows箭頭光標(biāo).
????如果鼠標(biāo)移動(dòng)時(shí), 鼠標(biāo)是按下狀態(tài), 那么根據(jù)鼠標(biāo)按下時(shí)所處區(qū)域執(zhí)行不同的代碼.?
????如果是色環(huán)部分, 則將鼠標(biāo)位置與圓環(huán)圓心連線, 連線與環(huán)的相交線段的中點(diǎn)記為當(dāng)前色相, 也就是圓環(huán)內(nèi)的小圓圈的圓心. 根據(jù)色相更新矩形區(qū)域的顏色(修改位圖, 并使用修改后的位圖繪制矩形區(qū)域).
????如果鼠標(biāo)按下時(shí)是矩形區(qū)域, 則只需要取鼠標(biāo)移動(dòng)時(shí)的點(diǎn)對(duì)應(yīng)矩形區(qū)域位圖中的像素顏色設(shè)置為當(dāng)前顏色就行了.
色環(huán)(Hue)
????色環(huán)實(shí)際上是固定的一副位圖, 因?yàn)樗恍枰淖?
矩形區(qū)域(Saturation Value)
????矩形區(qū)域?qū)?yīng)了一副位圖, 這副位圖是根據(jù)色相動(dòng)態(tài)修改的.