Colorz - RGB 助手






3.46/5 (13投票s)
协助开发者进行颜色强度处理
描述
在开发了应用程序和网页一段时间后,我意识到在典型的编程范式中存在一个重大不足,那就是除非你碰巧使用 WYSIWYG 或 RAD 环境,否则在代码中可视化精细的颜色值几乎是不可能的。而且,在仍然会使用这类环境的情况下,仍然有很多情况。
即使是 HTML 的命名颜色概念也从未真正有所帮助,因为它只适用于基本值(即,<body bgcolor="white">
),或者有一个晦涩难懂的名称,没有人知道它是什么。最后,大多数开发人员已经知道了基本颜色,例如 RGB 255, 255, 255 表示白色,RGB 0, 255, 255 表示青色,等等。
这仍然引发了一个问题,如果你想看到一种颜色,也许以一种独立于环境的方式协调颜色,这种方式快速易用,并且允许轻松复制粘贴以实现伪集成机制。而且,无论我选择哪种编辑器,我总会有一种方法可以做到这一点。因此,Colorz
应运而生。
Colorz
是一个微小的程序,它允许你通过三个滚动条在 RGB 颜色空间中指定颜色,通过操作颜色的 R 强度、G 强度和 B 强度,同时向你展示它的外观和相应的数值,本质上让你在选择颜色时能够实时看到它。
尽管 Colorz
是网络上同类应用中的最早之一,但现实地说,这个想法并不是我独有的。因此,我的目标是专注于 Colorz
应该是什么。考虑到这一点,我的想法是保持它小巧轻便,只提供所需的功能,不多余。它的内存占用比记事本还小,所以不会占用系统资源。
规格
- 模式
在前景(文本颜色)和背景模式之间切换。这使你能够协调颜色值,并直观地看到哪种颜色与哪种颜色搭配得当。
- 格式
- 十进制 -- 此选项允许你以十进制表示法指定 RGB 颜色,每种强度的值在 0 到 255 之间(适用于 Windows API 等环境)。
- 浮点数 -- 此选项允许你以浮点数表示法指定 RGB 颜色,每种强度的值在 0.0 到 1.0 之间(适用于 OpenGL 等环境)。
- 十六进制 -- 此选项允许你以十六进制表示法指定 RGB 颜色,每种强度的值在 0 到 FF 之间(适用于 HTML 等环境)。
- 选项
- 灰度 -- 此选项保持滚动条均匀,仅允许灰度色阶。
- 置顶 -- 此选项将
Colorz
窗口置于其他窗口之上,方便你在工作时进行放置。 - 拾色器 -- 此选项可能是大多数人使用此应用程序的原因。它将允许你使用光标从屏幕上的任何点拾取 RGB 颜色。如果你找到了完美的颜色并想知道其值,这可以节省大量时间。开启此选项后,按住 CTRL 键即可激活它。
- 自动复制 -- 此功能允许你直接将值粘贴到你的代码中!启用此功能后,你指定的任何值(或从屏幕上拾取的颜色)都会自动复制到剪贴板。
- 特点
- 内存占用小,不会占用系统资源。
- 根据“自动复制”选择高亮文本输出。
- 允许你使用三种不同的方式来指定颜色;因此,无论在何种环境中,
Colorz
都能与之兼容。
- 修复
- “拾色器”的激活热键已更改为 CTRL,以避免与菜单和快捷键冲突。
- 现在,在背景和前景模式之间切换时,
Colorz
会保留各自的值。 - 拾取颜色完成后,滚动条会自动反映新颜色。
- 必须按住 ALT 键才能使“拾色器”功能正常工作。
这解决了你拾取颜色后,再次移动光标时丢失信息的问题。
这个程序在很多次都让我的生活变得更容易。如果它对我有所帮助,我希望它也能对网络上的其他人有所帮助。也许,有些人还能从中学习。享受吧!
技术
此程序演示了如何仅使用 C 和 Windows API 编写基于对话框的 Windows® 应用程序。它进一步探讨了与 GDI 相关的概念,重点是设备上下文和位块传输。并且,它展示了如何操作剪贴板。
“拾色器”功能需要一个变通办法。原因是,我为它使用了 GetPixel
函数;因此,如果你有一个窗口的非客户区域的坐标,它会返回 -1
。这不是一个有效的颜色,所以我使用 BitBlt
将像素复制到一个静态控件,然后在该控件上使用 GetPixel
来纠正这个问题,从而返回一个有效的颜色。以下代码演示了这种技术。
// get a handle to the window under the cursor
hWndxy = WindowFromPoint(spoint);
// get a handle to the preview pane
hPreview = GetDlgItem(hWnd,IDC_STATIC_PREVIEW);
// get the dc for the window in question
hDC = GetDC(hWndxy);
// GetPixel() requires client coordinates
ScreenToClient(hWndxy, &cursor);
rgb = GetPixel(hDC, cursor.x, cursor.y);
/*/
/ / The following is a workaround for the GetPixel API. If the
/ / cursor is over a titlebar or other non-client areas of the
/ / window it'll return -1 for the RGB intensities. In this case
/ / we use BitBlt to copy the color to our control and extract
/ / the intensities from that.
/*/
// check to see if intensities are valid
if(rgb == -1)
{
HDC hDCPrev = GetDC(hPreview);
BitBlt(hDCPrev, 0, 0, 1, 1, hDC,
cursor.x, cursor.y, SRCCOPY);
rgb = GetPixel(hDCPrev, 0, 0);
// clean up
ReleaseDC(hPreview, hDCPrev);
}
// clean up
ReleaseDC(hWndxy, hDC);
致谢
该程序使用一个名为 MoveWnd
的函数在程序启动时居中窗口。该函数最初名为 CenterWindow
,出自 Brent E. Rector 和 Joseph M. Newcomer 的优秀书籍“Win32 Programming”。我重写了该函数,修复了一些问题,添加了额外功能,并在此过程中对其进行了重命名。
我在 MSDN 库和从“Win32 Programming”中获得的知识的帮助下,从头开始编写了程序的其余部分。