翻译
英文原文Dr.Sai著A C# Sample Code/Article Extending the Capabilities of GDI+ in C# (.NET)(原代碼地址)
icscs翻译for msproject.cn
摘要
在大部分的图像处理应用程序(如Adobe's Photoshop, Google's Picasa or Coral's Paint Shop Pro)中,它们都需要能够选择图片的一个部分。或许用户希望放大图像的这个区域,或者是将要对这块被选取进一步处理(见下图1)。
无论是那个应用,大部分的图像处理软件都需要支持这个功能。当我们在MFC框架下面编写程序的时候,它们通过CDC类的DrawDragRect (…). DrawDragRect (…) API来实现。
尽管,几乎所有的MFC的API都对应于Win32的API,然而,微软尽然没有提供一个对应于MFC中DrawDragRect (…) API的Win32 API。于是,在.net框架下面,就产生了这个问题,因为,我们找不到一个这样的API。
因此,当我们用C#编写一个图像处理软件的时候,这个问题变得非常突出,没有一个DrawDragRect (…) 类似的API来完成图像选择功能。而且,找不到一个能通过pInvoke调用的WIN32的api。这篇文章用C#语言实现了DrawDragRect (…) API,你可以很容易地在你的程序中调用它。
实现细节
整个代码嵌在CDrawDragRect.cs 文件中,实现于CDrawDragRect类里。如果你的程序需要使用这样的功能,只需要把你的程序从以前的Form集成,改到CDrawDragRect的集成关系就可以了。
public
partial
class
MainForm : CDrawDragRect
//
Form
...
{
...
//other implementation details skipped for brevity
}
另外,你还需要做一件事情:在CDrawDragRect类里void DrawDragRect(MouseEventArgs e)函数是处理这个功能的,它在鼠标事件OnMouseMove(MouseEventArgs e)发生时,响应其动作。
DrawDragRect(MouseEventArgs e)函数,首先创建4个Windows区域:
rgnOld
rgnNew
rgnDiff
rgnDiffOld
rgnDiff记录了rgnOld 和rgnNew的差值……
具体更细的原理,大家见原文吧:)
关于示例程序
实例是用C#写的一个基于Form对程序,它显示一个文件打开对话框,打开一个图像文件。当用户选择一个图像文件之后,他可以选择图像的一个小区域,这个小区域就会被发送到另外一个form上单独显示。
License