65.9K
CodeProject 正在变化。 阅读更多。
Home

Colorz - RGB 助手

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.46/5 (13投票s)

2000年2月15日

MIT
viewsIcon

135333

downloadIcon

1632

协助开发者进行颜色强度处理

Sample Image - Colorz

描述

在开发了应用程序和网页一段时间后,我意识到在典型的编程范式中存在一个重大不足,那就是除非你碰巧使用 WYSIWYG 或 RAD 环境,否则在代码中可视化精细的颜色值几乎是不可能的。而且,在仍然会使用这类环境的情况下,仍然有很多情况。

即使是 HTML 的命名颜色概念也从未真正有所帮助,因为它只适用于基本值(即,<body bgcolor="white">),或者有一个晦涩难懂的名称,没有人知道它是什么。最后,大多数开发人员已经知道了基本颜色,例如 RGB 255, 255, 255 表示白色,RGB 0, 255, 255 表示青色,等等。

这仍然引发了一个问题,如果你想看到一种颜色,也许以一种独立于环境的方式协调颜色,这种方式快速易用,并且允许轻松复制粘贴以实现伪集成机制。而且,无论我选择哪种编辑器,我总会有一种方法可以做到这一点。因此,Colorz 应运而生。

Colorz 是一个微小的程序,它允许你通过三个滚动条在 RGB 颜色空间中指定颜色,通过操作颜色的 R 强度、G 强度和 B 强度,同时向你展示它的外观和相应的数值,本质上让你在选择颜色时能够实时看到它。

尽管 Colorz 是网络上同类应用中的最早之一,但现实地说,这个想法并不是我独有的。因此,我的目标是专注于 Colorz 应该是什么。考虑到这一点,我的想法是保持它小巧轻便,只提供所需的功能,不多余。它的内存占用比记事本还小,所以不会占用系统资源。

规格

  • 模式

    在前景(文本颜色)和背景模式之间切换。这使你能够协调颜色值,并直观地看到哪种颜色与哪种颜色搭配得当。

  • 格式
    1. 十进制 -- 此选项允许你以十进制表示法指定 RGB 颜色,每种强度的值在 0 到 255 之间(适用于 Windows API 等环境)。
    2. 浮点数 -- 此选项允许你以浮点数表示法指定 RGB 颜色,每种强度的值在 0.0 到 1.0 之间(适用于 OpenGL 等环境)。
    3. 十六进制 -- 此选项允许你以十六进制表示法指定 RGB 颜色,每种强度的值在 0 到 FF 之间(适用于 HTML 等环境)。
  • 选项
    1. 灰度 -- 此选项保持滚动条均匀,仅允许灰度色阶。
    2. 置顶 -- 此选项将 Colorz 窗口置于其他窗口之上,方便你在工作时进行放置。
    3. 拾色器 -- 此选项可能是大多数人使用此应用程序的原因。它将允许你使用光标从屏幕上的任何点拾取 RGB 颜色。如果你找到了完美的颜色并想知道其值,这可以节省大量时间。开启此选项后,按住 CTRL 键即可激活它。
    4. 自动复制 -- 此功能允许你直接将值粘贴到你的代码中!启用此功能后,你指定的任何值(或从屏幕上拾取的颜色)都会自动复制到剪贴板。
  • 特点
    • 内存占用小,不会占用系统资源。
    • 根据“自动复制”选择高亮文本输出。
    • 允许你使用三种不同的方式来指定颜色;因此,无论在何种环境中,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”中获得的知识的帮助下,从头开始编写了程序的其余部分。

© . All rights reserved.