更好的缩放实用程序






4.93/5 (29投票s)
2005年6月17日
4分钟阅读

84021

1262
一个更好的 Zoomin 实用程序。
引言
这个项目源于新闻组中的一个问题。有人问如何编写一个拾色器。
很多次,我都需要一个拾色器。我也需要截取屏幕上的图像片段,将其放入其他程序中,例如图标。问题是 ZoomIn 不支持我需要的大部分功能。
Zoomin 有什么问题?
- 我必须第一次就正确获取图像。如果我没有正确选择它,我就无法微调它。
- 我必须正确缩放。否则,我可能会得到太多的图像,或者不够。
- 一旦获得了图像,我就无法选择其中的一部分。
- 复制到剪贴板会将图像复制到 Zoomin 窗口中,而不是屏幕上的实际像素。
最初的提问者提出了一些处理这个问题的复杂方法,例如使用计时器和钩子函数。这些不是必需的。
这个项目产生的图像与下面显示的图像非常相似
为了创建这个,我将图像大小设置为 64 像素,由顶部的微调控件控制。然后我使用了拾取工具,,并将其拖动到屏幕上,直到我位于页面标题中的灯泡上方。我还没有完全到达我想要的位置,所以我使用“微调”箭头稍微移动了一下。
在移动过程中,右上角会显示一个 RGB 值。此外,还会显示实际的 R、G 和 B 颜色。这代表光标放置的实际点(尽管您可能看不到它,拾取工具的中间有一个很小的白色点,代表光标热点位置)。在展开的图像上看到这一点的方式是,中心的点线正方形是热点,已展开。从边缘延伸的线条只是为了使其找到它变得有趣。
中间的 ? 键将在所选区域周围显示一个框。
复制图标按钮,,将把所选内容的内容复制到剪贴板。
但是,还有其他附加功能。
一旦捕获了图像,将鼠标移到它上面,将在 RGB 显示屏中显示鼠标下像素的实际像素值。
在图像区域内单击并拖动将选择一个子区域。然后,这将用一个选择矩形标记。请注意,旧的矩形不会消失,直到创建了新的矩形。这是故意的,因此您可以在制作新的、更大或更小的选择时看到旧的选择。
这显示在下图。请注意,此图像较小。我通过调整对话框的大小来做到这一点。在此示例中,灯的底部周围有一个选择框。
这个代码有什么有趣的?
像我的大多数示例一样,这旨在展示一些关于使用 Windows 和/或 MFC 的想法。此代码中包含的想法是
- 创建覆盖整个桌面窗口的窗口 DC。
- 抓取窗口的一部分并将其保存为本地位图。
- 选择该位图的一部分。
- 橡皮筋选择框。
- 显示颜色样本。
- 将位图复制到剪贴板。
- 拥有一个“拾取”工具(很像您会从 Spy++ 中识别的那样)。
- 注意到在某些情况下,您可以互换光标和图标,这就是我在这里所做的。
- 创建一个
CWnd
派生的弹出窗口(? 按钮的实现)。 - 拥有一个可以创建并在其自身消失的窗口(? 按钮的显示窗口)。
- 使用隐式
SetBkMode(OPAQUE)
来创建交替颜色的线条,因此无论背景是亮色还是暗色,该线条都会显示出来。 - 在逻辑空间中计算点并将它们转换为设备空间(用于绘制第一张图像中突出显示正方形的点数组)。请注意,水平和垂直线实际上是逻辑空间中的“分数像素”,并且有一个实现这一点的技巧。
- 所有者绘制按钮(那些箭头按钮和复制按钮)。
这里没有多少代码,但是这里的代码说明了几种有用的技术。
本文章中表达的观点仅代表作者的观点,并且绝不代表或认可微软的观点。