和GUI有关的各种对象

由于博客内容为空,无法获取关键信息生成摘要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

和GUI有关的各种对象
2001-10-03· · ··vchelp

  在Windows中有各种GUI对象(不要和C++对象混淆),当你在进行绘图就需要利用这些对象。而各种对象都拥有各种属性,下面分别讲述各种GUI对象和拥有的属性。

  字体对象CFont用于输出文字时选用不同风格和大小的字体。可选择的风格包括:是否为斜体,是否为粗体,字体名称,是否有下划线等。颜色和背景色不属于字体的属性。关于如何创建和使用字体在2.2 在窗口中输出文字中会详细讲解。

  刷子CBrush对象决定填充区域时所采用的颜色或模板。对于一个固定色的刷子来讲它的属性为颜色,是否采用网格和网格的类型如水平的,垂直的,交叉的等。你也可以利用8*8的位图来创建一个自定义模板的刷子,在使用这种刷子填充时系统会利用位图逐步填充区域。关于如何创建和使用刷子在2.3 使用刷子,笔进行绘图中会详细讲解。

  画笔CPen对象在画点和画线时有用。它的属性包括颜色,宽度,线的风格,如虚线,实线,点划线等。关于如何创建和使用画笔在2.3 使用刷子,笔进行绘图中会详细讲解。

  位图CBitmap对象可以包含一幅图像,可以保存在资源中。关于如何使用位图在2.4 在窗口中绘制设备相关位图,图标,设备无关位图中会详细讲解。

  还有一种特殊的GUI对象是多边形,利用多边形可以很好的限制作图区域或是改变窗口外型。关于如何创建和使用多边形在2.6 多边形和剪贴区域中会详细讲解。

  在Windows中使用GUI对象必须遵守一定的规则。首先需要创建一个合法的对象,不同的对象创建方法不同。然后需要将该GUI对象选入DC中,同时保存DC中原来的GUI对象。如果选入一个非法的对象将会引起异常。在使用完后应该恢复原来的对象,这一点特别重要,如果保存一个临时对象在DC中,而在临时对象被销毁后可能引起异常。有一点必须注意,每一个对象在重新创建前必须销毁,下面的代码演示了这一种安全的使用方法:

OnDraw(CDC* pDC) {
     CPen pen1,pen2;
     pen1.CreatePen(PS_SOLID,2,RGB(128,128,128));//创建对象
     pen2.CreatePen(PS_SOLID,2,RGB(128,128,0));//创建对象
     CPen* pPenOld=(CPen*)pDC->SelectObject(&pen1);//选择对象进DC
     drawWithPen1...
     (CPen*)pDC->SelectObject(&pen2);//选择对象进DC
     drawWithPen2...
     pen1.DeleteObject();//再次创建前先销毁
     pen1.CreatePen(PS_SOLID,2,RGB(0,0,0));//再次创建对象
     (CPen*)pDC->SelectObject(&pen1);//选择对象进DC
     drawWithPen1...
     pDC->SelectObject(pOldPen);//恢复
}

  此外系统中还拥有一些库存GUI对象,你可以利用CDC::SelectStockObject(SelectStockObject( int nIndex )选入这些对象,它们包括一些固定颜色的刷子,画笔和一些基本字体。

  • BLACK_BRUSH   Black brush.
  • DKGRAY_BRUSH   Dark gray brush.
  • GRAY_BRUSH   Gray brush.
  • HOLLOW_BRUSH   Hollow brush.
  • LTGRAY_BRUSH   Light gray brush.
  • NULL_BRUSH   Null brush.
  • WHITE_BRUSH   White brush.
  • BLACK_PEN   Black pen.
  • NULL_PEN   Null pen.
  • WHITE_PEN   White pen.
  • ANSI_FIXED_FONT   ANSI fixed system font.
  • ANSI_VAR_FONT   ANSI variable system font.
  • DEVICE_DEFAULT_FONT   Device-dependent font.
  • OEM_FIXED_FONT   OEM-dependent fixed font.
  • SYSTEM_FONT   The system font. By default, Windows uses the system font to draw menus, dialog-box controls, and other text. In Windows versions 3.0 and later, the system font is proportional width; earlier versions of Windows use a fixed-width system font.
  • SYSTEM_FIXED_FONT   The fixed-width system font used in Windows prior to version 3.0. This object is available for compatibility with earlier versions of Windows.
  • DEFAULT_PALETTE   Default color palette. This palette consists of the 20 static colors in the system palette.
  这些对象留在DC中是安全的,所以你可以利用选入库存对象来作为恢复DC中GUI对象。

  大家可能都注意到了绘图时都需要一个DC对象,DC(Device Context设备环境)对象是一个抽象的作图环境,可能是对应屏幕,也可能是对应打印机或其它。这个环境是设备无关的,所以你在对不同的设备输出时只需要使用不同的设备环境就行了,而作图方式可以完全不变。这也就是Windows耀眼的一点设备无关性。如同你将对一幅画使用照相机或复印机将会产生不同的输出,而不需要对画进行任何调整。DC的使用会穿插在本章中进行介绍。
org.junit.platform.commons.PreconditionViolationException: Classpath resource [/nextDay.csv] does not exist at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1709) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:636) at java.base/java.util.stream.ReferencePipeline$7$1FlatMap.accept(ReferencePipeline.java:294) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:215) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1709) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:570) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:636) at java.base/java.util.stream.ReferencePipeline$7$1FlatMap.accept(ReferencePipeline.java:294) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1709) a
03-24
### 解决方案 当遇到 `PreconditionViolationException` 错误提示 `Classpath resource nextDay.csv does not exist` 时,通常是因为 JUnit 测试框架无法找到指定的资源文件。以下是可能的原因分析以及对应的解决方案: #### 可能原因 1. **路径错误**:资源文件未放置在正确的目录下。 2. **构建工具配置问题**:如果使用 Maven 或 Gradle 构建项目,则可能是这些工具未能正确加载资源文件到目标路径。 3. **编码方式不匹配**:某些情况下,读取 CSV 文件的方式可能导致异常。 --- #### 解决方法 ##### 方法一:确认资源文件位置 确保 `nextDay.csv` 被放在项目的 `src/main/resources` 或者 `src/test/resources` 目录下[^5]。这是标准的 Java 项目结构,Maven 和 Gradle 默认会将这两个目录下的文件复制到最终的 classpath 中。 ```java // 使用 ClassLoader 加载资源文件 InputStream inputStream = getClass().getClassLoader().getResourceAsStream("nextDay.csv"); if (inputStream == null) { throw new RuntimeException("Resource file 'nextDay.csv' is missing!"); } ``` 上述代码通过 `ClassLoader` 动态获取资源文件流并验证其是否存在。 --- ##### 方法二:检查构建工具配置 如果是基于 Maven 的项目,请确保 `pom.xml` 配置正常加载资源文件。默认情况下无需额外设置,但如果自定义了 `<build>` 部分则需注意以下内容: ```xml <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.csv</include> </includes> </resource> </resources> </build> ``` 对于 Gradle 用户,在 `build.gradle` 中可以这样声明资源文件夹: ```gradle sourceSets { main { resources.srcDirs = ['src/main/resources'] } } ``` --- ##### 方法三:动态创建缺失文件(仅用于调试) 如果确实需要临时解决该问题而不想修改实际部署环境中的文件管理逻辑,可以在测试运行前自动创建所需的资源文件: ```java @BeforeAll public static void setup() throws IOException { Path path = Paths.get(ClassLoader.getSystemResource("").toURI()).resolve("nextDay.csv"); Files.write(path, "Sample content".getBytes(StandardCharsets.UTF_8)); } ``` 此片段利用了 JUnit 5 提供的 `@BeforeAll` 注解来初始化必要的数据文件。 --- ##### 方法四:调整单元测试策略 考虑是否真的有必要绑定具体的数据文件来进行测试?有时可以通过模拟器替代真实外部依赖项达到相同效果而不必担心物理存储介质的存在与否问题。例如借助 Mockito 库伪造行为: ```java @Test void testWithMockitoWithoutFileDependency() { // Arrange List<String[]> mockCsvContent = Arrays.asList(new String[][]{{"Header", "Value"}}); PowerMockito.mockStatic(CsvUtils.class); when(CsvUtils.readFromCSV(any(InputStream.class))).thenReturn(mockCsvContent); // Act & Assert... } ``` 以上例子展示了如何用静态方法拦截技术规避直接访问磁盘上的 `.csv` 文档的需求。 --- ### 总结 综上所述,要彻底消除由于丢失 `'nextDay.csv'` 所引发的预条件违规例外状况,可以从以下几个方面入手——核实文档所在确切地点;审查自动化装配脚本设定无误;必要时候采取编程手段即时生成所缺物件;最后重新评估整个测验流程设计思路看能否减少对外部实体资料库的信赖程度从而提升灵活性与可移植性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值