本文程式下載/Files/xqzhao/DrawDragRect.rar(執行個體是用C#寫的一個基於Form對程式,它顯示一個檔案開啟對話方塊,開啟一個影像檔。當使用者選擇一個影像檔之後,他可以選擇映像的一個小地區,這個小地區就會被發送到另外一個form上單獨顯示。)
程式說明
在大部分的影像處理應用程式(如Adobe's Photoshop, Google's Picasa or Coral's Paint Shop Pro)中,它們都需要能夠選擇圖片的一個部分。或許使用者希望放大映像的這個地區,或者是將要對這塊被選取進一步處理。
無論是那個應用,大部分的影像處理軟體都需要支援這個功能。當我們在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的差值……