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

Windows 绘图入门

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.55/5 (10投票s)

2000年3月21日

viewsIcon

165567

使用 DC 在 Windows 中绘图的简单介绍

Sample Image - DCDrawing.jpg

了解我的人都知道我对 Windows 平台非常热衷。偶尔会有人问我原因,或者我是否更喜欢使用 X-Windows 或其他窗口平台。本文是写给那些以及其他问过类似问题的人的。

我从 80 年代末开始使用 Windows 1.0 进行 Windows 编程。当时,关于 Windows 没什么好说的,但在我阅读 SDK(软件开发工具包)文档时,有两件事引起了我的注意:

  • 设备上下文
  • 映射模式

描述这两个概念的最佳方法是使用一个名为 PrintX 的小代码示例,它绘制一个边长为 4 英寸的 X。

我正在使用 Visual C++ 6.0 构建此应用程序。 使用 MFC App Wizard 创建一个名为 PrintX 的新程序并接受所有默认设置,以下是我唯一更改的代码

////////////////////////////////////////////////////////////
// CPrintXView drawing

void CPrintXView::OnDraw(CDC* pDC)
{
    CPen pen( PS_SOLID, 0, RGB( 0, 0, 0 ));
    CPen* pPenOld = pDC->SelectObject( &pen );
    int nMap = pDC->SetMapMode( MM_HIENGLISH );

    pDC->MoveTo( 1000, -1000 );
    pDC->LineTo( 5000, -5000 );
    pDC->MoveTo( 5000, -1000 );
    pDC->LineTo( 1000, -5000 );

    pDC->SetMapMode( nMap );
    pDC->SelectObject( pPenOld );
}

设备上下文

OnDraw 方法的参数 (pDC) 是一个指向设备上下文的指针。 设备上下文代表您将在其上绘图的设备表面。 其神奇之处在于,该表面不仅限于屏幕或内存上下文(如 X-Windows 图形上下文),还可以是打印机、绘图仪、位图或任何其他可以编写 Windows 驱动程序的设备。

OnDraw 方法的前两行用于创建一支黑色画笔

    CPen pen( PS_SOLID, 0, RGB( 0, 0, 0 ));

然后将其选入设备上下文

    CPen* pPenOld = pDC->SelectObject( &pen );

返回一个指向先前选入设备上下文的画笔的指针。 稍后调用线条绘制命令时,它们将是由画笔定义的实心黑线。

映射模式

OnDraw 方法的第三行代表第二部分的神奇之处

    int nMap = pDC->SetMapMode( MM_HIENGLISH );

它设置了映射模式并返回先前选定的映射模式。 在这种情况下,映射模式设置为 MM_HIENGLISH,这意味着我们传递给线条绘制命令的坐标将以英寸的千分之一为单位——一个逻辑坐标系,而不是物理坐标系!

这就是为什么 OnDraw 不关心实际的物理设备是什么的原因。 640x480 屏幕可能使用每英寸 80 像素,而 HP LaserJet 4 使用每英寸 600 像素。 映射模式的神奇之处在于此代码适用于两者!

其余的代码

剩下的就是绘制线条并将设备上下文返回到其原始状态。 线条绘制例程中的负值表示负 Y 值,这是由于将映射模式更改为 MM_HIENGLISH 的结果。 在此映射模式下,Y 值随着您向上移动而增加,而不是默认映射模式 MM_TEXT,其中 Y 值随着您向下移动而增加。 由于窗口原点默认为窗口的左上角,因此需要负 Y 值才能使 X 可见。 另一种方法是移动窗口原点。

Windows 提供了一种创建您自己的映射模式的方法,因此也可以创建一个类似于 MM_HIENGLISH 的映射模式,只不过 Y 值向下增加。

结论

自 Windows 1.0 时代以来,Windows 已经增加了许多神奇之处,但前两个仍然与我的心息息相关。

在 90 年代中期,我不得不将我的一些 Windows 代码转换为 X-Windows/Motif,你猜怎么着——没有设备上下文,也没有映射模式。 在接下来的几个月里,我并不开心。

在这些年来添加到 Windows 的所有新功能中(多线程、对称多处理、COM 等),很难忽略我编写了多少代码才能让 PrintX 工作。

如果这是一个 X-Windows 项目,绘制一个边长为 4 英寸的 X 并不难(当然比我在这里所做的要多),但是一旦你到了那一步,你必须编写另一个同样复杂的程序来打印—— X-Windows 对打印机一无所知——是时候拿出 PostScript 手册了(除非你的打印机是数千台与 Windows 兼容但与 PostScript 不兼容的打印机之一)。

最后,编写 Windows 代码的工具无与伦比。 任何人都可以去 CompUSA 购买学生版本的 Visual C++,价格低于 100 美元。 我的一些 UNIX 朋友(勉强地)运行 Windows 只是为了运行 Microsoft 的 Visual Studio,并且他们欣然承认,最好的编程工具存在于 Windows 平台上。

许可证

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

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

© . All rights reserved.