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

RGN 生成器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (14投票s)

2000年1月22日

viewsIcon

199187

downloadIcon

6167

创建非矩形对话框

Sample Image - RGNCreator.gif

此程序的目的是允许您创建非矩形对话框。程序本身就是一个例子,说明如果过度使用可能会发生什么。

创建透明区域

  1. 为对话框创建一个蒙版图像。一种颜色将是对话框的透明部分。透明 GIF 是一种很好的方法,但支持许多图像格式。
  2. 运行 RGNerator
  3. 输入蒙版的文件名。(一旦输入了有效的图像文件名,它就会自动加载)。如果您不记得名称或存放位置,请浏览查找。
  4. 输入代表对话框透明部分的颜色。如果您不知道确切的 RGB 颜色,请按“拾取”按钮。

拾取透明颜色

  1. 将光标移到透明颜色上。右侧有两个颜色框。上面的框是当前的透明颜色,下面的框是光标所在像素的颜色。当上面的颜色框包含透明颜色时,右键单击鼠标。
  2. 如果难以选择像素,可以放大图像。
  3. 如果图像太大而无法在可视区域显示,请使用滚动条,或者只需按住鼠标左键并拖动图像到所需位置。
  4. 选择好颜色后,按“确定”。
  5. 按“创建”按钮。此过程所需的时间取决于透明区域的复杂程度。
  6. 完成后,系统会要求您输入要存储 rgn 数据的文件的名称。

如何使用透明区域

我包含了一个演示项目供您查看。请先查看它,它会向您展示这有多么简单。

在您自己的应用程序中使用它

  1. 将 rgn 文件作为“RGN”资源插入。
  2. 插入要用作背景的位图。
  3. 插入一个对话框。
  4. 将对话框的边框属性设置为“无”。
  5. 将一个图片对象插入到对话框中。
  6. 将其类型设置为“Bitmap”。
  7. 将背景位图设置为图像。
  8. (这有点令人头疼,因为它必须是制表符顺序中的第一个。否则,在显示对话框时它会覆盖您的其他对话框控件。不幸的是,在编辑对话框时它会反过来工作!所以,在完成对话框的编辑后,只需将其设置为第一个即可。)
  9. 从模板创建对话框。
  10. 将对话框基于 CRGNDlg 类。
  11. 从演示项目中获取 rgndlg.cpp.h 文件。
  12. 在对话框源代码中
    在构造函数中,只需添加 RGN 资源 ID。
    例如:CRGNDlg(CRgnDemoDlg::IDD,pParent,"BACKGROUND")

注释

  1. SetWindowRgn 必须在调用基类 InitDialog 函数之前完成。
  2. 您不能使用 SetWindowRgn 中使用的 rgn - 它属于窗口 - 甚至不要删除它。
  3. 如果轮廓拖动缓慢,请使用全反转。它没有那么好看,但对于复杂的区域更快。它在 rgndlg.cppInverttracker 函数中。
  4. 图像的边缘应为深灰色。非常黑或非常白的边缘在背景颜色相反时会显示出来,而灰色边缘无论背景颜色如何看起来都可以。

“小字体”和“大字体”

问题

例如,您的桌面显示配置中选择了“小字体”。您愉快地创建了对话框,放入了 bmp,并插入了所有必需的控件,小心地将它们与背景 bmp 对齐。然后您得意洋洋地发送了您的应用程序,却收到人们的抱怨说东西没有对齐。

原因

这些人选择了“大字体”。Windows 会根据字体缩放对话框及其控件。字体的大小又取决于“小/大”字体设置 - 因此 MS Sans Serif 8 的“大小”不同。由于图像和 rgn 是基于像素的,因此存在问题。

解决方案

有两种可能的解决方案。

1. 缩放

这就是我在演示应用程序中实现的功能。缩放的缺点是它不精确。例如,从在“小字体”下设计的应用程序缩放到“大字体”下可能会有些块状。

(请查看演示应用程序中 rgndlg.cppInitDialog 函数)。

2. 使用两个独立的图像和两个 RGN 文件

设计您的对话框,然后基于原始对话框创建两个对话框,并设置一个用于大图像,一个用于小图像。“可靠”确定字体模式的方法是:if (dc.GetDeviceCaps(LOGPIXELSX) == 120) 则为大,否则为小(dc.GetDeviceCaps(LOGPIXELSX)==96)

Copyright

此程序由 Data Dynamics 提供。欢迎复制并分发给任何人。

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.