Skip to content
切换导航条
切换导航条
当前项目
正在载入...
登录
孙克
/
AccAOI
转到一个项目
切换导航栏
切换导航栏固定状态
项目
群组
代码片段
帮助
项目
活动
版本库
流水线
图表
问题
0
合并请求
0
维基
网络
创建新的问题
作业
提交
问题看板
文件
提交
网络
比较
分支
标签
Commit 860cabb5
由
SK
编写于
2019-06-17 17:48:44 +0800
浏览文件
选项
浏览文件
标签
下载
电子邮件补丁
差异文件
保存项目
1 个父辈
5245bd9e
隐藏空白字符变更
内嵌
并排
正在显示
13 个修改的文件
包含
868 行增加
和
828 行删除
AOI/AoiMethod.cs
AOI/AoiProject.cs
AOI/rgb/AoiMethodRgb.cs
AOI/util/JsonUtil.cs
AccAOI/AccAOI.csproj
AccAOI/Form1.Designer.cs
AccAOI/Form1.cs
AccAOI/FrmAoiSetting.Designer.cs
AccAOI/FrmAoiSetting.cs
AccAOI/control/ABaseControl.Designer.cs
AccAOI/control/ABaseControl.cs
AccAOI/imageBoxEx/ImageBoxEx.cs
ImageBox/ImageBox.cs
AOI/AoiMethod.cs
查看文件 @
860cabb
...
...
@@ -12,11 +12,26 @@ namespace AOI
{
public
abstract
class
AoiMethod
{
//public string FullTypeName { get; set; }
//public string PathDatas { get; set; }
public
string
MethodName
{
get
;
set
;
}
/// <summary>
/// 兴趣区域路径
/// </summary>
public
GraphicsPath
RoiPath
;
[
Newtonsoft
.
Json
.
JsonIgnore
()]
public
GraphicsPath
RoiPath
{
get
;
set
;
}
public
PathData
GetRoiPathData
()
{
if
(
RoiPath
!=
null
)
{
return
RoiPath
.
PathData
;
}
return
null
;
}
public
abstract
ResultBean
Check
(
Image
standardImage
,
Image
imageToCheck
);
...
...
AOI/AoiProject.cs
查看文件 @
860cabb
...
...
@@ -22,7 +22,7 @@ namespace AOI
/// <summary>
/// 标准的Image
/// </summary>
p
rivate
Image
standardImage
{
get
;
set
;
}
p
ublic
Image
standardImage
{
get
;
set
;
}
/// <summary>
/// 所有的AOI方法
...
...
@@ -68,7 +68,18 @@ namespace AOI
Dictionary
<
string
,
string
>
projectMap
=
new
Dictionary
<
string
,
string
>();
string
base64ImgStr
=
Base64Util
.
ToBase64
(
this
.
standardImage
);
projectMap
.
Add
(
"base64Img"
,
base64ImgStr
);
string
methodMapJson
=
JsonUtil
.
SerializeObject
(
this
.
methodMap
);
var
mapForJson
=
new
Dictionary
<
string
,
string
>();
foreach
(
var
item
in
this
.
methodMap
)
{
JObject
obj
=
JObject
.
FromObject
(
item
.
Value
);
obj
.
Add
(
"FullTypeName"
,
item
.
Value
.
GetType
().
FullName
);
var
roiPathData
=
item
.
Value
.
GetRoiPathData
();
string
roiPathDataStr
=
JsonUtil
.
SerializeObject
(
roiPathData
);
obj
.
Add
(
"PathDataStr"
,
roiPathDataStr
);
string
jsonStr
=
JsonUtil
.
SerializeObject
(
obj
);
mapForJson
.
Add
(
item
.
Key
,
jsonStr
);
}
string
methodMapJson
=
JsonUtil
.
SerializeObject
(
mapForJson
);
projectMap
.
Add
(
"methodMap"
,
methodMapJson
);
JsonUtil
.
SerializeObjectToFile
(
projectMap
,
filePath
,
false
);
}
...
...
@@ -79,7 +90,21 @@ namespace AOI
string
base64Img
=
projectMap
[
"base64Img"
];
this
.
standardImage
=
Base64Util
.
ToImage
(
base64Img
);
string
methodMapJson
=
projectMap
[
"methodMap"
];
this
.
methodMap
=
JsonUtil
.
DeserializeJsonToObject
<
Dictionary
<
string
,
AoiMethod
>>(
methodMapJson
);
var
jsonMap
=
JsonUtil
.
DeserializeJsonToObject
<
Dictionary
<
string
,
string
>>(
methodMapJson
);
foreach
(
var
item
in
jsonMap
)
{
JObject
obj
=
JObject
.
Parse
(
item
.
Value
);
string
fullTypeName
=
obj
.
Value
<
string
>(
"FullTypeName"
);
Type
t
=
Type
.
GetType
(
fullTypeName
);
JsonSerializer
serializer
=
new
JsonSerializer
();
StringReader
sr
=
new
StringReader
(
item
.
Value
);
object
o
=
serializer
.
Deserialize
(
new
JsonTextReader
(
sr
),
t
);
AoiMethod
aoiMethod
=
(
AoiMethod
)
o
;
string
PathDataStr
=
obj
.
Value
<
string
>(
"PathDataStr"
);
PathData
pathData
=
JsonUtil
.
DeserializeJsonToObject
<
PathData
>(
PathDataStr
);
aoiMethod
.
RoiPath
=
new
GraphicsPath
(
pathData
.
Points
,
pathData
.
Types
);
methodMap
.
Add
(
item
.
Key
,
aoiMethod
);
}
}
...
...
AOI/rgb/AoiMethodRgb.cs
查看文件 @
860cabb
...
...
@@ -13,20 +13,20 @@ namespace AOI
/// </summary>
public
class
AoiMethodRgb
:
AoiMethod
{
public
int
minR
=
1
;
public
int
maxR
=
255
;
public
int
minG
=
1
;
public
int
maxG
=
255
;
public
int
minB
=
1
;
public
int
maxB
=
255
;
public
int
minR
{
get
;
set
;
}
public
int
maxR
{
get
;
set
;
}
public
int
minG
{
get
;
set
;
}
public
int
maxG
{
get
;
set
;
}
public
int
minB
{
get
;
set
;
}
public
int
maxB
{
get
;
set
;
}
/// <summary>
/// 抽取出的像素最小占比
/// </summary>
public
float
minRate
=
0
;
public
float
minRate
{
get
;
set
;
}
/// <summary>
/// 抽取出的像素最大占比
/// </summary>
public
float
maxRate
=
100
;
public
float
maxRate
{
get
;
set
;
}
public
override
ResultBean
Check
(
Image
standardImage
,
Image
imageToCheck
)
{
...
...
AOI/util/JsonUtil.cs
查看文件 @
860cabb
...
...
@@ -66,6 +66,7 @@ namespace AOI
T
t
=
o
as
T
;
return
t
;
}
/// <summary>
/// 解析文件到生成对象实体
/// </summary>
...
...
AccAOI/AccAOI.csproj
查看文件 @
860cabb
...
...
@@ -49,25 +49,25 @@
</ItemGroup>
<ItemGroup>
<Compile Include="control\AioMarkControl.cs">
<SubType>
UserControl
</SubType>
<SubType>
Form
</SubType>
</Compile>
<Compile Include="control\AioMarkControl.Designer.cs">
<DependentUpon>AioMarkControl.cs</DependentUpon>
</Compile>
<Compile Include="control\AoiBlobControl.cs">
<SubType>
UserControl
</SubType>
<SubType>
Form
</SubType>
</Compile>
<Compile Include="control\AoiBlobControl.Designer.cs">
<DependentUpon>AoiBlobControl.cs</DependentUpon>
</Compile>
<Compile Include="control\ABaseControl.cs">
<SubType>
UserControl
</SubType>
<SubType>
Form
</SubType>
</Compile>
<Compile Include="control\ABaseControl.Designer.cs">
<DependentUpon>ABaseControl.cs</DependentUpon>
</Compile>
<Compile Include="control\AoiRgbControl.cs">
<SubType>
UserControl
</SubType>
<SubType>
Form
</SubType>
</Compile>
<Compile Include="control\AoiRgbControl.Designer.cs">
<DependentUpon>AoiRgbControl.cs</DependentUpon>
...
...
@@ -88,9 +88,7 @@
<Compile Include="imageBoxEx\DragHandle.cs" />
<Compile Include="imageBoxEx\DragHandleAnchor.cs" />
<Compile Include="imageBoxEx\DragHandleCollection.cs" />
<Compile Include="imageBoxEx\ImageBoxEx.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="imageBoxEx\ImageBoxEx.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="control\AioMarkControl.resx">
...
...
AccAOI/Form1.Designer.cs
查看文件 @
860cabb
namespace
AccAOI
using
Cyotek.Windows.Forms
;
namespace
AccAOI
{
partial
class
Form1
{
...
...
@@ -40,8 +42,8 @@
this
.
minB
=
new
System
.
Windows
.
Forms
.
NumericUpDown
();
this
.
maxB
=
new
System
.
Windows
.
Forms
.
NumericUpDown
();
this
.
labelCount
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
imageBoxEx1
=
new
AccAOI
.
ImageBoxE
x
();
this
.
imageBox
=
new
AccAOI
.
ImageBoxE
x
();
this
.
imageBoxEx1
=
new
ImageBo
x
();
this
.
imageBox
=
new
ImageBo
x
();
this
.
panel1
.
SuspendLayout
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
maxR
)).
BeginInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
minR
)).
BeginInit
();
...
...
@@ -203,7 +205,7 @@
//
// imageBoxEx1
//
this
.
imageBoxEx1
.
DragHandleSize
=
9
;
//
this.imageBoxEx1.DragHandleSize = 9;
this
.
imageBoxEx1
.
Location
=
new
System
.
Drawing
.
Point
(
475
,
50
);
this
.
imageBoxEx1
.
Name
=
"imageBoxEx1"
;
this
.
imageBoxEx1
.
Size
=
new
System
.
Drawing
.
Size
(
230
,
159
);
...
...
@@ -212,7 +214,7 @@
// imageBox
//
this
.
imageBox
.
Dock
=
System
.
Windows
.
Forms
.
DockStyle
.
Fill
;
this
.
imageBox
.
DragHandleSize
=
9
;
//
this.imageBox.DragHandleSize = 9;
this
.
imageBox
.
Location
=
new
System
.
Drawing
.
Point
(
0
,
0
);
this
.
imageBox
.
Name
=
"imageBox"
;
this
.
imageBox
.
SelectionColor
=
System
.
Drawing
.
Color
.
Empty
;
...
...
@@ -258,7 +260,7 @@
#
endregion
private
System
.
Windows
.
Forms
.
Button
buttonOpen
;
private
ImageBox
Ex
imageBox
;
private
ImageBox
imageBox
;
private
System
.
Windows
.
Forms
.
Panel
panel1
;
private
System
.
Windows
.
Forms
.
Label
R
;
private
System
.
Windows
.
Forms
.
NumericUpDown
maxR
;
...
...
@@ -269,7 +271,7 @@
private
System
.
Windows
.
Forms
.
NumericUpDown
maxG
;
private
System
.
Windows
.
Forms
.
NumericUpDown
minB
;
private
System
.
Windows
.
Forms
.
NumericUpDown
maxB
;
private
ImageBox
Ex
imageBoxEx1
;
private
ImageBox
imageBoxEx1
;
private
System
.
Windows
.
Forms
.
Label
labelCount
;
}
}
...
...
AccAOI/Form1.cs
查看文件 @
860cabb
...
...
@@ -63,11 +63,8 @@ namespace AccAOI
//{
Matrix
translateMatrix
=
new
Matrix
();
translateMatrix
.
Translate
(
100
,
0
);
RectangleF
region
=
imageBox
.
SelectionRegion
;
GraphicsPath
path
=
new
GraphicsPath
();
path
.
AddEllipse
(
region
);
Image
threshImage
=
CutImage
(
imageBox
.
Image
,
path
);
Image
threshImage
=
CutImage
(
imageBox
.
Image
,
imageBox
.
SelectionRegion
);
cutImage
=
threshImage
;
imageBoxEx1
.
Image
=
threshImage
;
}
...
...
AccAOI/FrmAoiSetting.Designer.cs
查看文件 @
860cabb
namespace
AccAOI
using
Cyotek.Windows.Forms
;
namespace
AccAOI
{
partial
class
FrmAoiSetting
{
...
...
@@ -38,7 +40,7 @@
this
.
btnGetCameraImg
=
new
Asa
.
Theme
.
FlatButton
();
this
.
comType
=
new
Asa
.
Theme
.
FlatCombo
();
this
.
panAoi
=
new
System
.
Windows
.
Forms
.
Panel
();
this
.
imageBox1
=
new
AccAOI
.
ImageBoxE
x
();
this
.
imageBox1
=
new
ImageBo
x
();
this
.
SuspendLayout
();
//
// aoiList
...
...
@@ -158,7 +160,7 @@
this
.
imageBox1
.
Anchor
=
((
System
.
Windows
.
Forms
.
AnchorStyles
)((((
System
.
Windows
.
Forms
.
AnchorStyles
.
Top
|
System
.
Windows
.
Forms
.
AnchorStyles
.
Bottom
)
|
System
.
Windows
.
Forms
.
AnchorStyles
.
Left
)
|
System
.
Windows
.
Forms
.
AnchorStyles
.
Right
)));
this
.
imageBox1
.
DragHandleSize
=
9
;
//
this.imageBox1.DragHandleSize = 9;
this
.
imageBox1
.
Location
=
new
System
.
Drawing
.
Point
(
625
,
40
);
this
.
imageBox1
.
Name
=
"imageBox1"
;
this
.
imageBox1
.
SelectionMode
=
Cyotek
.
Windows
.
Forms
.
ImageBoxSelectionMode
.
Rectangle
;
...
...
@@ -204,7 +206,7 @@
#
endregion
private
Asa
.
Theme
.
FlatList
aoiList
;
private
ImageBox
Ex
imageBox1
;
private
ImageBox
imageBox1
;
private
Asa
.
Theme
.
FlatButton
btnOpenPro
;
private
Asa
.
Theme
.
FlatButton
btnSavePro
;
private
Asa
.
Theme
.
FlatButton
btnNewAoi
;
...
...
AccAOI/FrmAoiSetting.cs
查看文件 @
860cabb
...
...
@@ -73,11 +73,6 @@ namespace AccAOI
private
void
btnOpenPro_Click
(
object
sender
,
EventArgs
e
)
{
if
(
this
.
Img
==
null
)
{
MessageBox
.
Show
(
"清先打开图片"
);
return
;
}
System
.
Windows
.
Forms
.
OpenFileDialog
openDialog
=
new
System
.
Windows
.
Forms
.
OpenFileDialog
();
openDialog
.
Title
=
"打开项目"
;
openDialog
.
Filter
=
"(*.data)|*.data|(*.*)|*.*"
;
...
...
@@ -188,7 +183,7 @@ namespace AccAOI
if
(
method
.
RoiPath
!=
null
)
{
currPath
=
method
.
RoiPath
;
imageBox1
.
SelectionRegion
=
method
.
RoiPath
.
GetBounds
()
;
imageBox1
.
SelectionRegion
=
method
.
RoiPath
;
Image
threshImage
=
CutImage
(
imageBox1
.
Image
,
currPath
);
cutImage
=
threshImage
;
...
...
@@ -227,6 +222,8 @@ namespace AccAOI
if
(
Project
!=
null
)
{
aoiList
.
ItemClear
();
imageBox1
.
Image
=
Project
.
standardImage
;
imageBox1
.
SelectionRegion
=
new
GraphicsPath
();
if
(
Project
.
methodMap
.
Count
>
0
)
{
foreach
(
string
key
in
Project
.
methodMap
.
Keys
)
...
...
@@ -273,16 +270,17 @@ namespace AccAOI
Matrix
translateMatrix
=
new
Matrix
();
translateMatrix
.
Translate
(
100
,
0
);
RectangleF
region
=
imageBox1
.
SelectionRegion
;
currPath
=
new
GraphicsPath
();
if
(
aoiControl
.
AreaType
.
Equals
(
1
))
{
currPath
.
AddRectangle
(
region
);
}
else
{
currPath
.
AddEllipse
(
region
);
}
//RectangleF region = imageBox1.SelectionRegion;
//currPath = new GraphicsPath();
//if (aoiControl.AreaType.Equals(1))
//{
// currPath.AddRectangle(region);
//}
//else
//{
// currPath.AddEllipse(region);
//}
currPath
=
imageBox1
.
SelectionRegion
;
Image
threshImage
=
CutImage
(
imageBox1
.
Image
,
currPath
);
cutImage
=
threshImage
;
...
...
AccAOI/control/ABaseControl.Designer.cs
查看文件 @
860cabb
namespace
AccAOI.control
using
Cyotek.Windows.Forms
;
namespace
AccAOI.control
{
partial
class
ABaseControl
{
...
...
@@ -36,7 +38,7 @@
this
.
btnClearArea
=
new
Asa
.
Theme
.
FlatButton
();
this
.
btnSetArea
=
new
Asa
.
Theme
.
FlatButton
();
this
.
btnYuan
=
new
Asa
.
Theme
.
FlatButton
();
this
.
aoiImage
=
new
AccAOI
.
ImageBoxE
x
();
this
.
aoiImage
=
new
ImageBo
x
();
this
.
SuspendLayout
();
//
// panControl
...
...
@@ -136,7 +138,7 @@
//
this
.
aoiImage
.
Anchor
=
((
System
.
Windows
.
Forms
.
AnchorStyles
)(((
System
.
Windows
.
Forms
.
AnchorStyles
.
Top
|
System
.
Windows
.
Forms
.
AnchorStyles
.
Left
)
|
System
.
Windows
.
Forms
.
AnchorStyles
.
Right
)));
this
.
aoiImage
.
DragHandleSize
=
9
;
//
this.aoiImage.DragHandleSize = 9;
this
.
aoiImage
.
Location
=
new
System
.
Drawing
.
Point
(
9
,
53
);
this
.
aoiImage
.
Name
=
"aoiImage"
;
this
.
aoiImage
.
Size
=
new
System
.
Drawing
.
Size
(
288
,
182
);
...
...
@@ -171,7 +173,7 @@
private
Asa
.
Theme
.
FlatPanel
panControl
;
protected
Asa
.
Theme
.
FlatPanel
panParam
;
protected
Asa
.
Theme
.
FlatPanel
panResult
;
public
ImageBox
Ex
aoiImage
;
public
ImageBox
aoiImage
;
private
Asa
.
Theme
.
FlatButton
btnYuan
;
}
}
AccAOI/control/ABaseControl.cs
查看文件 @
860cabb
...
...
@@ -32,11 +32,11 @@ namespace AccAOI.control
/// 区域信息
/// </summary>
public
GraphicsPath
currPath
=
null
;
internal
ImageBox
Ex
BImageBox
;
internal
ImageBox
BImageBox
;
internal
AoiMethod
AoiInfo
;
public
void
SetImageBox
(
ImageBox
Ex
box
)
public
void
SetImageBox
(
ImageBox
box
)
{
this
.
BImageBox
=
box
;
}
...
...
@@ -67,7 +67,7 @@ namespace AccAOI.control
private
void
btnClearArea_Click
(
object
sender
,
EventArgs
e
)
{
this
.
BImageBox
.
CleearArea
();
//
this.BImageBox.CleearArea();
this
.
aoiImage
.
Image
=
null
;
}
...
...
AccAOI/imageBoxEx/ImageBoxEx.cs
查看文件 @
860cabb
using
Cyotek.Windows.Forms
;
using
System
;
using
System.ComponentModel
;
using
System.Drawing
;
using
System.Windows.Forms
;
//
using Cyotek.Windows.Forms;
//
using System;
//
using System.ComponentModel;
//
using System.Drawing;
//
using System.Windows.Forms;
namespace
AccAOI
{
// Cyotek ImageBox
// Copyright (c) 2010-2014 Cyotek.
// http://cyotek.com
// http://cyotek.com/blog/tag/imagebox
// Licensed under the MIT License. See imagebox-license.txt for the full text.
// If you use this control in your applications, attribution, donations or contributions are welcome.
public
class
ImageBoxEx
:
ImageBox
{
public
void
CleearArea
()
{
}
#
region
Instance
Fields
private
readonly
DragHandleCollection
_dragHandles
;
private
int
_dragHandleSize
;
private
Size
_minimumSelectionSize
;
#
endregion
#
region
Public
Constructors
public
ImageBoxEx
()
{
_dragHandles
=
new
DragHandleCollection
();
this
.
DragHandleSize
=
9
;
this
.
MinimumSelectionSize
=
Size
.
Empty
;
this
.
PositionDragHandles
();
}
#
endregion
#
region
Events
/// <summary>
/// Occurs when the DragHandleSize property value changes
/// </summary>
[
Category
(
"Property Changed"
)]
public
event
EventHandler
DragHandleSizeChanged
;
/// <summary>
/// Occurs when the MinimumSelectionSize property value changes
/// </summary>
[
Category
(
"Property Changed"
)]
public
event
EventHandler
MinimumSelectionSizeChanged
;
[
Category
(
"Action"
)]
public
event
EventHandler
SelectionMoved
;
[
Category
(
"Action"
)]
public
event
CancelEventHandler
SelectionMoving
;
[
Category
(
"Action"
)]
public
event
EventHandler
SelectionResized
;
[
Category
(
"Action"
)]
public
event
CancelEventHandler
SelectionResizing
;
#
endregion
#
region
Overridden
Methods
/// <summary>
/// Raises the <see cref="System.Windows.Forms.Control.MouseDown" /> event.
/// </summary>
/// <param name="e">
/// A <see cref="T:System.Windows.Forms.MouseEventArgs" /> that contains the event data.
/// </param>
protected
override
void
OnMouseDown
(
MouseEventArgs
e
)
{
Point
imagePoint
;
imagePoint
=
this
.
PointToImage
(
e
.
Location
);
if
(
e
.
Button
==
MouseButtons
.
Left
&&
(
this
.
SelectionRegion
.
Contains
(
imagePoint
)
||
this
.
HitTest
(
e
.
Location
)
!=
DragHandleAnchor
.
None
))
{
this
.
DragOrigin
=
e
.
Location
;
this
.
DragOriginOffset
=
new
Point
(
imagePoint
.
X
-
(
int
)
this
.
SelectionRegion
.
X
,
imagePoint
.
Y
-
(
int
)
this
.
SelectionRegion
.
Y
);
}
else
{
this
.
DragOriginOffset
=
Point
.
Empty
;
this
.
DragOrigin
=
Point
.
Empty
;
}
base
.
OnMouseDown
(
e
);
}
/// <summary>
/// Raises the <see cref="System.Windows.Forms.Control.MouseMove" /> event.
/// </summary>
/// <param name="e">
/// A <see cref="T:System.Windows.Forms.MouseEventArgs" /> that contains the event data.
/// </param>
protected
override
void
OnMouseMove
(
MouseEventArgs
e
)
{
// start either a move or a resize operation
if
(!
this
.
IsSelecting
&&
!
this
.
IsMoving
&&
!
this
.
IsResizing
&&
e
.
Button
==
MouseButtons
.
Left
&&
!
this
.
DragOrigin
.
IsEmpty
&&
this
.
IsOutsideDragZone
(
e
.
Location
))
{
DragHandleAnchor
anchor
;
//
namespace AccAOI
//
{
//
// Cyotek ImageBox
//
// Copyright (c) 2010-2014 Cyotek.
//
// http://cyotek.com
//
// http://cyotek.com/blog/tag/imagebox
//
// Licensed under the MIT License. See imagebox-license.txt for the full text.
//
// If you use this control in your applications, attribution, donations or contributions are welcome.
//
public class ImageBoxEx : ImageBox
//
{
//
public void CleearArea()
//
{
//
}
//
#region Instance Fields
//
private readonly DragHandleCollection _dragHandles;
//
private int _dragHandleSize;
//
private Size _minimumSelectionSize;
//
#endregion
//
#region Public Constructors
//
public ImageBoxEx()
//
{
//
_dragHandles = new DragHandleCollection();
//
this.DragHandleSize = 9;
//
this.MinimumSelectionSize = Size.Empty;
//
this.PositionDragHandles();
//
}
//
#endregion
//
#region Events
//
/// <summary>
//
/// Occurs when the DragHandleSize property value changes
//
/// </summary>
//
[Category("Property Changed")]
//
public event EventHandler DragHandleSizeChanged;
//
/// <summary>
//
/// Occurs when the MinimumSelectionSize property value changes
//
/// </summary>
//
[Category("Property Changed")]
//
public event EventHandler MinimumSelectionSizeChanged;
//
[Category("Action")]
//
public event EventHandler SelectionMoved;
//
[Category("Action")]
//
public event CancelEventHandler SelectionMoving;
//
[Category("Action")]
//
public event EventHandler SelectionResized;
//
[Category("Action")]
//
public event CancelEventHandler SelectionResizing;
//
#endregion
//
#region Overridden Methods
//
/// <summary>
//
/// Raises the <see cref="System.Windows.Forms.Control.MouseDown" /> event.
//
/// </summary>
//
/// <param name="e">
//
/// A <see cref="T:System.Windows.Forms.MouseEventArgs" /> that contains the event data.
//
/// </param>
//
protected override void OnMouseDown(MouseEventArgs e)
//
{
//
Point imagePoint;
//
imagePoint = this.PointToImage(e.Location);
//
if (e.Button == MouseButtons.Left && (this.SelectionRegion.Contains(imagePoint) || this.HitTest(e.Location) != DragHandleAnchor.None))
//
{
//
this.DragOrigin = e.Location;
//
this.DragOriginOffset = new Point(imagePoint.X - (int)this.SelectionRegion.X, imagePoint.Y - (int)this.SelectionRegion.Y);
//
}
//
else
//
{
//
this.DragOriginOffset = Point.Empty;
//
this.DragOrigin = Point.Empty;
//
}
//
base.OnMouseDown(e);
//
}
//
/// <summary>
//
/// Raises the <see cref="System.Windows.Forms.Control.MouseMove" /> event.
//
/// </summary>
//
/// <param name="e">
//
/// A <see cref="T:System.Windows.Forms.MouseEventArgs" /> that contains the event data.
//
/// </param>
//
protected override void OnMouseMove(MouseEventArgs e)
//
{
//
// start either a move or a resize operation
//
if (!this.IsSelecting && !this.IsMoving && !this.IsResizing && e.Button == MouseButtons.Left && !this.DragOrigin.IsEmpty && this.IsOutsideDragZone(e.Location))
//
{
//
DragHandleAnchor anchor;
anchor
=
this
.
HitTest
(
this
.
DragOrigin
);
//
anchor = this.HitTest(this.DragOrigin);
if
(
anchor
==
DragHandleAnchor
.
None
)
{
// move
this
.
StartMove
();
}
else
if
(
this
.
DragHandles
[
anchor
].
Enabled
&&
this
.
DragHandles
[
anchor
].
Visible
)
{
// resize
this
.
StartResize
(
anchor
);
}
}
// set the cursor
this
.
SetCursor
(
e
.
Location
);
// perform operations
this
.
ProcessSelectionMove
(
e
.
Location
);
this
.
ProcessSelectionResize
(
e
.
Location
);
base
.
OnMouseMove
(
e
);
}
/// <summary>
/// Raises the <see cref="System.Windows.Forms.Control.MouseUp" /> event.
/// </summary>
/// <param name="e">
/// A <see cref="T:System.Windows.Forms.MouseEventArgs" /> that contains the event data.
/// </param>
protected
override
void
OnMouseUp
(
MouseEventArgs
e
)
{
if
(
this
.
IsMoving
)
{
this
.
CompleteMove
();
}
else
if
(
this
.
IsResizing
)
{
this
.
CompleteResize
();
}
base
.
OnMouseUp
(
e
);
}
/// <summary>
/// Raises the <see cref="System.Windows.Forms.Control.Paint" /> event.
/// </summary>
/// <param name="e">
/// A <see cref="T:System.Windows.Forms.PaintEventArgs" /> that contains the event data.
/// </param>
protected
override
void
OnPaint
(
PaintEventArgs
e
)
{
base
.
OnPaint
(
e
);
if
(
this
.
AllowPainting
&&
!
this
.
SelectionRegion
.
IsEmpty
)
{
foreach
(
DragHandle
handle
in
this
.
DragHandles
)
{
if
(
handle
.
Visible
)
{
this
.
DrawDragHandle
(
e
.
Graphics
,
handle
);
}
}
}
}
/// <summary>
/// Raises the <see cref="System.Windows.Forms.Control.Resize" /> event.
/// </summary>
/// <param name="e">
/// An <see cref="T:System.EventArgs" /> that contains the event data.
/// </param>
protected
override
void
OnResize
(
EventArgs
e
)
{
base
.
OnResize
(
e
);
this
.
PositionDragHandles
();
}
/// <summary>
/// Raises the <see cref="System.Windows.Forms.ScrollableControl.Scroll" /> event.
/// </summary>
/// <param name="se">
/// A <see cref="T:System.Windows.Forms.ScrollEventArgs" /> that contains the event data.
/// </param>
protected
override
void
OnScroll
(
ScrollEventArgs
se
)
{
base
.
OnScroll
(
se
);
this
.
PositionDragHandles
();
}
/// <summary>
/// Raises the <see cref="ImageBox.Selecting" /> event.
/// </summary>
/// <param name="e">
/// The <see cref="System.EventArgs" /> instance containing the event data.
/// </param>
protected
override
void
OnSelecting
(
ImageBoxCancelEventArgs
e
)
{
e
.
Cancel
=
this
.
IsMoving
||
this
.
IsResizing
||
this
.
SelectionRegion
.
Contains
(
this
.
PointToImage
(
e
.
Location
))
||
this
.
HitTest
(
e
.
Location
)
!=
DragHandleAnchor
.
None
;
base
.
OnSelecting
(
e
);
}
/// <summary>
/// Raises the <see cref="ImageBox.SelectionRegionChanged" /> event.
/// </summary>
/// <param name="e">
/// The <see cref="System.EventArgs" /> instance containing the event data.
/// </param>
protected
override
void
OnSelectionRegionChanged
(
EventArgs
e
)
{
base
.
OnSelectionRegionChanged
(
e
);
this
.
PositionDragHandles
();
}
/// <summary>
/// Raises the <see cref="ImageBox.ZoomChanged" /> event.
/// </summary>
/// <param name="e">
/// The <see cref="System.EventArgs" /> instance containing the event data.
/// </param>
protected
override
void
OnZoomChanged
(
EventArgs
e
)
{
base
.
OnZoomChanged
(
e
);
this
.
PositionDragHandles
();
}
/// <summary>
/// Processes a dialog key.
/// </summary>
/// <returns>
/// true if the key was processed by the control; otherwise, false.
/// </returns>
/// <param name="keyData">One of the <see cref="T:System.Windows.Forms.Keys"/> values that represents the key to process. </param>
protected
override
bool
ProcessDialogKey
(
Keys
keyData
)
{
bool
result
;
if
(
keyData
==
Keys
.
Escape
&&
(
this
.
IsResizing
||
this
.
IsMoving
))
{
if
(
this
.
IsResizing
)
{
this
.
CancelResize
();
}
else
{
this
.
CancelMove
();
}
result
=
true
;
}
else
{
result
=
base
.
ProcessDialogKey
(
keyData
);
}
return
result
;
}
#
endregion
#
region
Public
Properties
[
Category
(
"Appearance"
)]
[
DefaultValue
(
8
)]
public
virtual
int
DragHandleSize
{
get
{
return
_dragHandleSize
;
}
set
{
if
(
this
.
DragHandleSize
!=
value
)
{
_dragHandleSize
=
value
;
this
.
OnDragHandleSizeChanged
(
EventArgs
.
Empty
);
}
}
}
[
Browsable
(
false
)]
public
DragHandleCollection
DragHandles
{
get
{
return
_dragHandles
;
}
}
[
Browsable
(
false
)]
[
DesignerSerializationVisibility
(
DesignerSerializationVisibility
.
Hidden
)]
public
bool
IsMoving
{
get
;
protected
set
;
}
[
Browsable
(
false
)]
[
DesignerSerializationVisibility
(
DesignerSerializationVisibility
.
Hidden
)]
public
bool
IsResizing
{
get
;
protected
set
;
}
[
Category
(
"Behavior"
)]
[
DefaultValue
(
typeof
(
Size
),
"0, 0"
)]
public
virtual
Size
MinimumSelectionSize
{
get
{
return
_minimumSelectionSize
;
}
set
{
if
(
this
.
MinimumSelectionSize
!=
value
)
{
_minimumSelectionSize
=
value
;
this
.
OnMinimumSelectionSizeChanged
(
EventArgs
.
Empty
);
}
}
}
[
Browsable
(
false
)]
public
RectangleF
PreviousSelectionRegion
{
get
;
protected
set
;
}
#
endregion
#
region
Protected
Properties
protected
Point
DragOrigin
{
get
;
set
;
}
protected
Point
DragOriginOffset
{
get
;
set
;
}
protected
DragHandleAnchor
ResizeAnchor
{
get
;
set
;
}
#
endregion
#
region
Public
Members
public
void
CancelResize
()
{
this
.
SelectionRegion
=
this
.
PreviousSelectionRegion
;
this
.
CompleteResize
();
}
public
void
StartMove
()
{
CancelEventArgs
e
;
if
(
this
.
IsMoving
||
this
.
IsResizing
)
{
throw
new
InvalidOperationException
(
"A move or resize action is currently being performed."
);
}
e
=
new
CancelEventArgs
();
this
.
OnSelectionMoving
(
e
);
if
(!
e
.
Cancel
)
{
this
.
PreviousSelectionRegion
=
this
.
SelectionRegion
;
this
.
IsMoving
=
true
;
}
}
#
endregion
#
region
Protected
Members
protected
virtual
void
DrawDragHandle
(
Graphics
graphics
,
DragHandle
handle
)
{
int
left
;
int
top
;
int
width
;
int
height
;
Pen
outerPen
;
Brush
innerBrush
;
left
=
handle
.
Bounds
.
Left
;
top
=
handle
.
Bounds
.
Top
;
width
=
handle
.
Bounds
.
Width
;
height
=
handle
.
Bounds
.
Height
;
if
(
handle
.
Enabled
)
{
outerPen
=
SystemPens
.
WindowFrame
;
innerBrush
=
SystemBrushes
.
Window
;
}
else
{
outerPen
=
SystemPens
.
ControlDark
;
innerBrush
=
SystemBrushes
.
Control
;
}
graphics
.
FillRectangle
(
innerBrush
,
left
+
1
,
top
+
1
,
width
-
2
,
height
-
2
);
graphics
.
DrawLine
(
outerPen
,
left
+
1
,
top
,
left
+
width
-
2
,
top
);
graphics
.
DrawLine
(
outerPen
,
left
,
top
+
1
,
left
,
top
+
height
-
2
);
graphics
.
DrawLine
(
outerPen
,
left
+
1
,
top
+
height
-
1
,
left
+
width
-
2
,
top
+
height
-
1
);
graphics
.
DrawLine
(
outerPen
,
left
+
width
-
1
,
top
+
1
,
left
+
width
-
1
,
top
+
height
-
2
);
}
/// <summary>
/// Raises the <see cref="DragHandleSizeChanged" /> event.
/// </summary>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
protected
virtual
void
OnDragHandleSizeChanged
(
EventArgs
e
)
{
EventHandler
handler
;
this
.
PositionDragHandles
();
this
.
Invalidate
();
handler
=
this
.
DragHandleSizeChanged
;
if
(
handler
!=
null
)
{
handler
(
this
,
e
);
}
}
/// <summary>
/// Raises the <see cref="MinimumSelectionSizeChanged" /> event.
/// </summary>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
protected
virtual
void
OnMinimumSelectionSizeChanged
(
EventArgs
e
)
{
EventHandler
handler
;
handler
=
this
.
MinimumSelectionSizeChanged
;
if
(
handler
!=
null
)
{
handler
(
this
,
e
);
}
}
/// <summary>
/// Raises the <see cref="SelectionMoved" /> event.
/// </summary>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
protected
virtual
void
OnSelectionMoved
(
EventArgs
e
)
{
EventHandler
handler
;
handler
=
this
.
SelectionMoved
;
if
(
handler
!=
null
)
{
handler
(
this
,
e
);
}
}
/// <summary>
/// Raises the <see cref="SelectionMoving" /> event.
/// </summary>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
protected
virtual
void
OnSelectionMoving
(
CancelEventArgs
e
)
{
CancelEventHandler
handler
;
handler
=
this
.
SelectionMoving
;
if
(
handler
!=
null
)
{
handler
(
this
,
e
);
}
}
/// <summary>
/// Raises the <see cref="SelectionResized" /> event.
/// </summary>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
protected
virtual
void
OnSelectionResized
(
EventArgs
e
)
{
EventHandler
handler
;
handler
=
this
.
SelectionResized
;
if
(
handler
!=
null
)
{
handler
(
this
,
e
);
}
}
/// <summary>
/// Raises the <see cref="SelectionResizing" /> event.
/// </summary>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
protected
virtual
void
OnSelectionResizing
(
CancelEventArgs
e
)
{
CancelEventHandler
handler
;
handler
=
this
.
SelectionResizing
;
if
(
handler
!=
null
)
{
handler
(
this
,
e
);
}
}
#
endregion
#
region
Private
Members
private
void
CancelMove
()
{
this
.
SelectionRegion
=
this
.
PreviousSelectionRegion
;
this
.
CompleteMove
();
}
private
void
CompleteMove
()
{
this
.
ResetDrag
();
this
.
OnSelectionMoved
(
EventArgs
.
Empty
);
}
private
void
CompleteResize
()
{
this
.
ResetDrag
();
this
.
OnSelectionResized
(
EventArgs
.
Empty
);
}
private
DragHandleAnchor
HitTest
(
Point
cursorPosition
)
{
return
this
.
DragHandles
.
HitTest
(
cursorPosition
);
}
private
bool
IsOutsideDragZone
(
Point
location
)
{
Rectangle
dragZone
;
int
dragWidth
;
int
dragHeight
;
dragWidth
=
SystemInformation
.
DragSize
.
Width
;
dragHeight
=
SystemInformation
.
DragSize
.
Height
;
dragZone
=
new
Rectangle
(
this
.
DragOrigin
.
X
-
(
dragWidth
/
2
),
this
.
DragOrigin
.
Y
-
(
dragHeight
/
2
),
dragWidth
,
dragHeight
);
return
!
dragZone
.
Contains
(
location
);
}
private
void
PositionDragHandles
()
{
if
(
this
.
DragHandles
!=
null
&&
this
.
DragHandleSize
>
0
)
{
if
(
this
.
SelectionRegion
.
IsEmpty
)
{
foreach
(
DragHandle
handle
in
this
.
DragHandles
)
{
handle
.
Bounds
=
Rectangle
.
Empty
;
}
}
else
{
int
left
;
int
top
;
int
right
;
int
bottom
;
int
halfWidth
;
int
halfHeight
;
int
halfDragHandleSize
;
Rectangle
viewport
;
int
offsetX
;
int
offsetY
;
viewport
=
this
.
GetImageViewPort
();
offsetX
=
viewport
.
Left
+
this
.
Padding
.
Left
+
this
.
AutoScrollPosition
.
X
;
offsetY
=
viewport
.
Top
+
this
.
Padding
.
Top
+
this
.
AutoScrollPosition
.
Y
;
halfDragHandleSize
=
this
.
DragHandleSize
/
2
;
left
=
Convert
.
ToInt32
((
this
.
SelectionRegion
.
Left
*
this
.
ZoomFactor
)
+
offsetX
);
top
=
Convert
.
ToInt32
((
this
.
SelectionRegion
.
Top
*
this
.
ZoomFactor
)
+
offsetY
);
right
=
left
+
Convert
.
ToInt32
(
this
.
SelectionRegion
.
Width
*
this
.
ZoomFactor
);
bottom
=
top
+
Convert
.
ToInt32
(
this
.
SelectionRegion
.
Height
*
this
.
ZoomFactor
);
halfWidth
=
Convert
.
ToInt32
(
this
.
SelectionRegion
.
Width
*
this
.
ZoomFactor
)
/
2
;
halfHeight
=
Convert
.
ToInt32
(
this
.
SelectionRegion
.
Height
*
this
.
ZoomFactor
)
/
2
;
this
.
DragHandles
[
DragHandleAnchor
.
TopLeft
].
Bounds
=
new
Rectangle
(
left
-
this
.
DragHandleSize
,
top
-
this
.
DragHandleSize
,
this
.
DragHandleSize
,
this
.
DragHandleSize
);
this
.
DragHandles
[
DragHandleAnchor
.
TopCenter
].
Bounds
=
new
Rectangle
(
left
+
halfWidth
-
halfDragHandleSize
,
top
-
this
.
DragHandleSize
,
this
.
DragHandleSize
,
this
.
DragHandleSize
);
this
.
DragHandles
[
DragHandleAnchor
.
TopRight
].
Bounds
=
new
Rectangle
(
right
,
top
-
this
.
DragHandleSize
,
this
.
DragHandleSize
,
this
.
DragHandleSize
);
this
.
DragHandles
[
DragHandleAnchor
.
MiddleLeft
].
Bounds
=
new
Rectangle
(
left
-
this
.
DragHandleSize
,
top
+
halfHeight
-
halfDragHandleSize
,
this
.
DragHandleSize
,
this
.
DragHandleSize
);
this
.
DragHandles
[
DragHandleAnchor
.
MiddleRight
].
Bounds
=
new
Rectangle
(
right
,
top
+
halfHeight
-
halfDragHandleSize
,
this
.
DragHandleSize
,
this
.
DragHandleSize
);
this
.
DragHandles
[
DragHandleAnchor
.
BottomLeft
].
Bounds
=
new
Rectangle
(
left
-
this
.
DragHandleSize
,
bottom
,
this
.
DragHandleSize
,
this
.
DragHandleSize
);
this
.
DragHandles
[
DragHandleAnchor
.
BottomCenter
].
Bounds
=
new
Rectangle
(
left
+
halfWidth
-
halfDragHandleSize
,
bottom
,
this
.
DragHandleSize
,
this
.
DragHandleSize
);
this
.
DragHandles
[
DragHandleAnchor
.
BottomRight
].
Bounds
=
new
Rectangle
(
right
,
bottom
,
this
.
DragHandleSize
,
this
.
DragHandleSize
);
this
.
DragHandles
[
DragHandleAnchor
.
MiddleCenter
].
Bounds
=
new
Rectangle
(
left
+
halfWidth
-
halfDragHandleSize
,
top
+
halfHeight
-
halfDragHandleSize
,
this
.
DragHandleSize
,
this
.
DragHandleSize
);
}
}
}
private
void
ProcessSelectionMove
(
Point
cursorPosition
)
{
if
(
this
.
IsMoving
)
{
int
x
;
int
y
;
Point
imagePoint
;
imagePoint
=
this
.
PointToImage
(
cursorPosition
,
true
);
x
=
Math
.
Max
(
0
,
imagePoint
.
X
-
this
.
DragOriginOffset
.
X
);
if
(
x
+
this
.
SelectionRegion
.
Width
>=
this
.
ViewSize
.
Width
)
{
x
=
this
.
ViewSize
.
Width
-
(
int
)
this
.
SelectionRegion
.
Width
;
}
y
=
Math
.
Max
(
0
,
imagePoint
.
Y
-
this
.
DragOriginOffset
.
Y
);
if
(
y
+
this
.
SelectionRegion
.
Height
>=
this
.
ViewSize
.
Height
)
{
y
=
this
.
ViewSize
.
Height
-
(
int
)
this
.
SelectionRegion
.
Height
;
}
this
.
SelectionRegion
=
new
RectangleF
(
x
,
y
,
this
.
SelectionRegion
.
Width
,
this
.
SelectionRegion
.
Height
);
}
}
private
void
ProcessSelectionResize
(
Point
cursorPosition
)
{
if
(
this
.
IsResizing
)
{
Point
imagePosition
;
float
left
;
float
top
;
float
right
;
float
bottom
;
bool
resizingTopEdge
;
bool
resizingBottomEdge
;
bool
resizingLeftEdge
;
bool
resizingRightEdge
;
imagePosition
=
this
.
PointToImage
(
cursorPosition
,
true
);
// get the current selection
left
=
this
.
SelectionRegion
.
Left
;
top
=
this
.
SelectionRegion
.
Top
;
right
=
this
.
SelectionRegion
.
Right
;
bottom
=
this
.
SelectionRegion
.
Bottom
;
// decide which edges we're resizing
resizingTopEdge
=
this
.
ResizeAnchor
>=
DragHandleAnchor
.
TopLeft
&&
this
.
ResizeAnchor
<=
DragHandleAnchor
.
TopRight
;
resizingBottomEdge
=
this
.
ResizeAnchor
>=
DragHandleAnchor
.
BottomLeft
&&
this
.
ResizeAnchor
<=
DragHandleAnchor
.
BottomRight
;
resizingLeftEdge
=
this
.
ResizeAnchor
==
DragHandleAnchor
.
TopLeft
||
this
.
ResizeAnchor
==
DragHandleAnchor
.
MiddleLeft
||
this
.
ResizeAnchor
==
DragHandleAnchor
.
BottomLeft
;
resizingRightEdge
=
this
.
ResizeAnchor
==
DragHandleAnchor
.
TopRight
||
this
.
ResizeAnchor
==
DragHandleAnchor
.
MiddleRight
||
this
.
ResizeAnchor
==
DragHandleAnchor
.
BottomRight
;
// and resize!
if
(
resizingTopEdge
)
{
top
=
imagePosition
.
Y
;
if
(
bottom
-
top
<
this
.
MinimumSelectionSize
.
Height
)
{
top
=
bottom
-
this
.
MinimumSelectionSize
.
Height
;
}
}
else
if
(
resizingBottomEdge
)
{
bottom
=
imagePosition
.
Y
;
if
(
bottom
-
top
<
this
.
MinimumSelectionSize
.
Height
)
{
bottom
=
top
+
this
.
MinimumSelectionSize
.
Height
;
}
}
if
(
resizingLeftEdge
)
{
left
=
imagePosition
.
X
;
if
(
right
-
left
<
this
.
MinimumSelectionSize
.
Width
)
{
left
=
right
-
this
.
MinimumSelectionSize
.
Width
;
}
}
else
if
(
resizingRightEdge
)
{
right
=
imagePosition
.
X
;
if
(
right
-
left
<
this
.
MinimumSelectionSize
.
Width
)
{
right
=
left
+
this
.
MinimumSelectionSize
.
Width
;
}
}
this
.
SelectionRegion
=
new
RectangleF
(
left
,
top
,
right
-
left
,
bottom
-
top
);
}
}
private
void
ResetDrag
()
{
this
.
IsResizing
=
false
;
this
.
IsMoving
=
false
;
this
.
DragOrigin
=
Point
.
Empty
;
this
.
DragOriginOffset
=
Point
.
Empty
;
}
private
void
SetCursor
(
Point
point
)
{
Cursor
cursor
;
if
(
this
.
IsSelecting
)
{
cursor
=
Cursors
.
Default
;
}
else
{
DragHandleAnchor
handleAnchor
;
handleAnchor
=
this
.
IsResizing
?
this
.
ResizeAnchor
:
this
.
HitTest
(
point
);
if
(
handleAnchor
!=
DragHandleAnchor
.
None
&&
this
.
DragHandles
[
handleAnchor
].
Enabled
)
{
switch
(
handleAnchor
)
{
case
DragHandleAnchor
.
TopLeft
:
case
DragHandleAnchor
.
BottomRight
:
cursor
=
Cursors
.
SizeNWSE
;
break
;
case
DragHandleAnchor
.
TopCenter
:
case
DragHandleAnchor
.
BottomCenter
:
cursor
=
Cursors
.
SizeNS
;
break
;
case
DragHandleAnchor
.
TopRight
:
case
DragHandleAnchor
.
BottomLeft
:
cursor
=
Cursors
.
SizeNESW
;
break
;
case
DragHandleAnchor
.
MiddleLeft
:
case
DragHandleAnchor
.
MiddleRight
:
cursor
=
Cursors
.
SizeWE
;
break
;
case
DragHandleAnchor
.
MiddleCenter
:
cursor
=
Cursors
.
Cross
;
break
;
default
:
throw
new
ArgumentOutOfRangeException
();
}
}
else
if
(
this
.
IsMoving
||
this
.
SelectionRegion
.
Contains
(
this
.
PointToImage
(
point
)))
{
cursor
=
Cursors
.
SizeAll
;
}
else
{
cursor
=
Cursors
.
Default
;
}
}
this
.
Cursor
=
cursor
;
}
private
void
StartResize
(
DragHandleAnchor
anchor
)
{
CancelEventArgs
e
;
if
(
this
.
IsMoving
||
this
.
IsResizing
)
{
throw
new
InvalidOperationException
(
"A move or resize action is currently being performed."
);
}
e
=
new
CancelEventArgs
();
this
.
OnSelectionResizing
(
e
);
if
(!
e
.
Cancel
)
{
this
.
ResizeAnchor
=
anchor
;
this
.
PreviousSelectionRegion
=
this
.
SelectionRegion
;
this
.
IsResizing
=
true
;
}
}
#
endregion
}
}
//
if (anchor == DragHandleAnchor.None)
//
{
//
// move
//
this.StartMove();
//
}
//
else if (this.DragHandles[anchor].Enabled && this.DragHandles[anchor].Visible)
//
{
//
// resize
//
this.StartResize(anchor);
//
}
//
}
//
// set the cursor
//
this.SetCursor(e.Location);
//
// perform operations
//
this.ProcessSelectionMove(e.Location);
//
this.ProcessSelectionResize(e.Location);
//
base.OnMouseMove(e);
//
}
//
/// <summary>
//
/// Raises the <see cref="System.Windows.Forms.Control.MouseUp" /> event.
//
/// </summary>
//
/// <param name="e">
//
/// A <see cref="T:System.Windows.Forms.MouseEventArgs" /> that contains the event data.
//
/// </param>
//
protected override void OnMouseUp(MouseEventArgs e)
//
{
//
if (this.IsMoving)
//
{
//
this.CompleteMove();
//
}
//
else if (this.IsResizing)
//
{
//
this.CompleteResize();
//
}
//
base.OnMouseUp(e);
//
}
//
/// <summary>
//
/// Raises the <see cref="System.Windows.Forms.Control.Paint" /> event.
//
/// </summary>
//
/// <param name="e">
//
/// A <see cref="T:System.Windows.Forms.PaintEventArgs" /> that contains the event data.
//
/// </param>
//
protected override void OnPaint(PaintEventArgs e)
//
{
//
base.OnPaint(e);
//
if (this.AllowPainting && !this.SelectionRegion.IsEmpty)
//
{
//
foreach (DragHandle handle in this.DragHandles)
//
{
//
if (handle.Visible)
//
{
//
this.DrawDragHandle(e.Graphics, handle);
//
}
//
}
//
}
//
}
//
/// <summary>
//
/// Raises the <see cref="System.Windows.Forms.Control.Resize" /> event.
//
/// </summary>
//
/// <param name="e">
//
/// An <see cref="T:System.EventArgs" /> that contains the event data.
//
/// </param>
//
protected override void OnResize(EventArgs e)
//
{
//
base.OnResize(e);
//
this.PositionDragHandles();
//
}
//
/// <summary>
//
/// Raises the <see cref="System.Windows.Forms.ScrollableControl.Scroll" /> event.
//
/// </summary>
//
/// <param name="se">
//
/// A <see cref="T:System.Windows.Forms.ScrollEventArgs" /> that contains the event data.
//
/// </param>
//
protected override void OnScroll(ScrollEventArgs se)
//
{
//
base.OnScroll(se);
//
this.PositionDragHandles();
//
}
//
/// <summary>
//
/// Raises the <see cref="ImageBox.Selecting" /> event.
//
/// </summary>
//
/// <param name="e">
//
/// The <see cref="System.EventArgs" /> instance containing the event data.
//
/// </param>
//
protected override void OnSelecting(ImageBoxCancelEventArgs e)
//
{
//
e.Cancel = this.IsMoving || this.IsResizing || this.SelectionRegion.Contains(this.PointToImage(e.Location)) || this.HitTest(e.Location) != DragHandleAnchor.None;
//
base.OnSelecting(e);
//
}
//
/// <summary>
//
/// Raises the <see cref="ImageBox.SelectionRegionChanged" /> event.
//
/// </summary>
//
/// <param name="e">
//
/// The <see cref="System.EventArgs" /> instance containing the event data.
//
/// </param>
//
protected override void OnSelectionRegionChanged(EventArgs e)
//
{
//
base.OnSelectionRegionChanged(e);
//
this.PositionDragHandles();
//
}
//
/// <summary>
//
/// Raises the <see cref="ImageBox.ZoomChanged" /> event.
//
/// </summary>
//
/// <param name="e">
//
/// The <see cref="System.EventArgs" /> instance containing the event data.
//
/// </param>
//
protected override void OnZoomChanged(EventArgs e)
//
{
//
base.OnZoomChanged(e);
//
this.PositionDragHandles();
//
}
//
/// <summary>
//
/// Processes a dialog key.
//
/// </summary>
//
/// <returns>
//
/// true if the key was processed by the control; otherwise, false.
//
/// </returns>
//
/// <param name="keyData">One of the <see cref="T:System.Windows.Forms.Keys"/> values that represents the key to process. </param>
//
protected override bool ProcessDialogKey(Keys keyData)
//
{
//
bool result;
//
if (keyData == Keys.Escape && (this.IsResizing || this.IsMoving))
//
{
//
if (this.IsResizing)
//
{
//
this.CancelResize();
//
}
//
else
//
{
//
this.CancelMove();
//
}
//
result = true;
//
}
//
else
//
{
//
result = base.ProcessDialogKey(keyData);
//
}
//
return result;
//
}
//
#endregion
//
#region Public Properties
//
[Category("Appearance")]
//
[DefaultValue(8)]
//
public virtual int DragHandleSize
//
{
//
get { return _dragHandleSize; }
//
set
//
{
//
if (this.DragHandleSize != value)
//
{
//
_dragHandleSize = value;
//
this.OnDragHandleSizeChanged(EventArgs.Empty);
//
}
//
}
//
}
//
[Browsable(false)]
//
public DragHandleCollection DragHandles
//
{
//
get { return _dragHandles; }
//
}
//
[Browsable(false)]
//
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
//
public bool IsMoving { get; protected set; }
//
[Browsable(false)]
//
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
//
public bool IsResizing { get; protected set; }
//
[Category("Behavior")]
//
[DefaultValue(typeof(Size), "0, 0")]
//
public virtual Size MinimumSelectionSize
//
{
//
get { return _minimumSelectionSize; }
//
set
//
{
//
if (this.MinimumSelectionSize != value)
//
{
//
_minimumSelectionSize = value;
//
this.OnMinimumSelectionSizeChanged(EventArgs.Empty);
//
}
//
}
//
}
//
[Browsable(false)]
//
public RectangleF PreviousSelectionRegion { get; protected set; }
//
#endregion
//
#region Protected Properties
//
protected Point DragOrigin { get; set; }
//
protected Point DragOriginOffset { get; set; }
//
protected DragHandleAnchor ResizeAnchor { get; set; }
//
#endregion
//
#region Public Members
//
public void CancelResize()
//
{
//
this.SelectionRegion = this.PreviousSelectionRegion;
//
this.CompleteResize();
//
}
//
public void StartMove()
//
{
//
CancelEventArgs e;
//
if (this.IsMoving || this.IsResizing)
//
{
//
throw new InvalidOperationException("A move or resize action is currently being performed.");
//
}
//
e = new CancelEventArgs();
//
this.OnSelectionMoving(e);
//
if (!e.Cancel)
//
{
//
this.PreviousSelectionRegion = this.SelectionRegion;
//
this.IsMoving = true;
//
}
//
}
//
#endregion
//
#region Protected Members
//
protected virtual void DrawDragHandle(Graphics graphics, DragHandle handle)
//
{
//
int left;
//
int top;
//
int width;
//
int height;
//
Pen outerPen;
//
Brush innerBrush;
//
left = handle.Bounds.Left;
//
top = handle.Bounds.Top;
//
width = handle.Bounds.Width;
//
height = handle.Bounds.Height;
//
if (handle.Enabled)
//
{
//
outerPen = SystemPens.WindowFrame;
//
innerBrush = SystemBrushes.Window;
//
}
//
else
//
{
//
outerPen = SystemPens.ControlDark;
//
innerBrush = SystemBrushes.Control;
//
}
//
graphics.FillRectangle(innerBrush, left + 1, top + 1, width - 2, height - 2);
//
graphics.DrawLine(outerPen, left + 1, top, left + width - 2, top);
//
graphics.DrawLine(outerPen, left, top + 1, left, top + height - 2);
//
graphics.DrawLine(outerPen, left + 1, top + height - 1, left + width - 2, top + height - 1);
//
graphics.DrawLine(outerPen, left + width - 1, top + 1, left + width - 1, top + height - 2);
//
}
//
/// <summary>
//
/// Raises the <see cref="DragHandleSizeChanged" /> event.
//
/// </summary>
//
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
//
protected virtual void OnDragHandleSizeChanged(EventArgs e)
//
{
//
EventHandler handler;
//
this.PositionDragHandles();
//
this.Invalidate();
//
handler = this.DragHandleSizeChanged;
//
if (handler != null)
//
{
//
handler(this, e);
//
}
//
}
//
/// <summary>
//
/// Raises the <see cref="MinimumSelectionSizeChanged" /> event.
//
/// </summary>
//
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
//
protected virtual void OnMinimumSelectionSizeChanged(EventArgs e)
//
{
//
EventHandler handler;
//
handler = this.MinimumSelectionSizeChanged;
//
if (handler != null)
//
{
//
handler(this, e);
//
}
//
}
//
/// <summary>
//
/// Raises the <see cref="SelectionMoved" /> event.
//
/// </summary>
//
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
//
protected virtual void OnSelectionMoved(EventArgs e)
//
{
//
EventHandler handler;
//
handler = this.SelectionMoved;
//
if (handler != null)
//
{
//
handler(this, e);
//
}
//
}
//
/// <summary>
//
/// Raises the <see cref="SelectionMoving" /> event.
//
/// </summary>
//
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
//
protected virtual void OnSelectionMoving(CancelEventArgs e)
//
{
//
CancelEventHandler handler;
//
handler = this.SelectionMoving;
//
if (handler != null)
//
{
//
handler(this, e);
//
}
//
}
//
/// <summary>
//
/// Raises the <see cref="SelectionResized" /> event.
//
/// </summary>
//
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
//
protected virtual void OnSelectionResized(EventArgs e)
//
{
//
EventHandler handler;
//
handler = this.SelectionResized;
//
if (handler != null)
//
{
//
handler(this, e);
//
}
//
}
//
/// <summary>
//
/// Raises the <see cref="SelectionResizing" /> event.
//
/// </summary>
//
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
//
protected virtual void OnSelectionResizing(CancelEventArgs e)
//
{
//
CancelEventHandler handler;
//
handler = this.SelectionResizing;
//
if (handler != null)
//
{
//
handler(this, e);
//
}
//
}
//
#endregion
//
#region Private Members
//
private void CancelMove()
//
{
//
this.SelectionRegion = this.PreviousSelectionRegion;
//
this.CompleteMove();
//
}
//
private void CompleteMove()
//
{
//
this.ResetDrag();
//
this.OnSelectionMoved(EventArgs.Empty);
//
}
//
private void CompleteResize()
//
{
//
this.ResetDrag();
//
this.OnSelectionResized(EventArgs.Empty);
//
}
//
private DragHandleAnchor HitTest(Point cursorPosition)
//
{
//
return this.DragHandles.HitTest(cursorPosition);
//
}
//
private bool IsOutsideDragZone(Point location)
//
{
//
Rectangle dragZone;
//
int dragWidth;
//
int dragHeight;
//
dragWidth = SystemInformation.DragSize.Width;
//
dragHeight = SystemInformation.DragSize.Height;
//
dragZone = new Rectangle(this.DragOrigin.X - (dragWidth / 2), this.DragOrigin.Y - (dragHeight / 2), dragWidth, dragHeight);
//
return !dragZone.Contains(location);
//
}
//
private void PositionDragHandles()
//
{
//
if (this.DragHandles != null && this.DragHandleSize > 0)
//
{
//
if (this.SelectionRegion.IsEmpty)
//
{
//
foreach (DragHandle handle in this.DragHandles)
//
{
//
handle.Bounds = Rectangle.Empty;
//
}
//
}
//
else
//
{
//
int left;
//
int top;
//
int right;
//
int bottom;
//
int halfWidth;
//
int halfHeight;
//
int halfDragHandleSize;
//
Rectangle viewport;
//
int offsetX;
//
int offsetY;
//
viewport = this.GetImageViewPort();
//
offsetX = viewport.Left + this.Padding.Left + this.AutoScrollPosition.X;
//
offsetY = viewport.Top + this.Padding.Top + this.AutoScrollPosition.Y;
//
halfDragHandleSize = this.DragHandleSize / 2;
//
left = Convert.ToInt32((this.SelectionRegion.Left * this.ZoomFactor) + offsetX);
//
top = Convert.ToInt32((this.SelectionRegion.Top * this.ZoomFactor) + offsetY);
//
right = left + Convert.ToInt32(this.SelectionRegion.Width * this.ZoomFactor);
//
bottom = top + Convert.ToInt32(this.SelectionRegion.Height * this.ZoomFactor);
//
halfWidth = Convert.ToInt32(this.SelectionRegion.Width * this.ZoomFactor) / 2;
//
halfHeight = Convert.ToInt32(this.SelectionRegion.Height * this.ZoomFactor) / 2;
//
this.DragHandles[DragHandleAnchor.TopLeft].Bounds = new Rectangle(left - this.DragHandleSize, top - this.DragHandleSize, this.DragHandleSize, this.DragHandleSize);
//
this.DragHandles[DragHandleAnchor.TopCenter].Bounds = new Rectangle(left + halfWidth - halfDragHandleSize, top - this.DragHandleSize, this.DragHandleSize, this.DragHandleSize);
//
this.DragHandles[DragHandleAnchor.TopRight].Bounds = new Rectangle(right, top - this.DragHandleSize, this.DragHandleSize, this.DragHandleSize);
//
this.DragHandles[DragHandleAnchor.MiddleLeft].Bounds = new Rectangle(left - this.DragHandleSize, top + halfHeight - halfDragHandleSize, this.DragHandleSize, this.DragHandleSize);
//
this.DragHandles[DragHandleAnchor.MiddleRight].Bounds = new Rectangle(right, top + halfHeight - halfDragHandleSize, this.DragHandleSize, this.DragHandleSize);
//
this.DragHandles[DragHandleAnchor.BottomLeft].Bounds = new Rectangle(left - this.DragHandleSize, bottom, this.DragHandleSize, this.DragHandleSize);
//
this.DragHandles[DragHandleAnchor.BottomCenter].Bounds = new Rectangle(left + halfWidth - halfDragHandleSize, bottom, this.DragHandleSize, this.DragHandleSize);
//
this.DragHandles[DragHandleAnchor.BottomRight].Bounds = new Rectangle(right, bottom, this.DragHandleSize, this.DragHandleSize);
//
this.DragHandles[DragHandleAnchor.MiddleCenter].Bounds = new Rectangle(left + halfWidth - halfDragHandleSize, top + halfHeight - halfDragHandleSize, this.DragHandleSize, this.DragHandleSize);
//
}
//
}
//
}
//
private void ProcessSelectionMove(Point cursorPosition)
//
{
//
if (this.IsMoving)
//
{
//
int x;
//
int y;
//
Point imagePoint;
//
imagePoint = this.PointToImage(cursorPosition, true);
//
x = Math.Max(0, imagePoint.X - this.DragOriginOffset.X);
//
if (x + this.SelectionRegion.Width >= this.ViewSize.Width)
//
{
//
x = this.ViewSize.Width - (int)this.SelectionRegion.Width;
//
}
//
y = Math.Max(0, imagePoint.Y - this.DragOriginOffset.Y);
//
if (y + this.SelectionRegion.Height >= this.ViewSize.Height)
//
{
//
y = this.ViewSize.Height - (int)this.SelectionRegion.Height;
//
}
//
this.SelectionRegion = new RectangleF(x, y, this.SelectionRegion.Width, this.SelectionRegion.Height);
//
}
//
}
//
private void ProcessSelectionResize(Point cursorPosition)
//
{
//
if (this.IsResizing)
//
{
//
Point imagePosition;
//
float left;
//
float top;
//
float right;
//
float bottom;
//
bool resizingTopEdge;
//
bool resizingBottomEdge;
//
bool resizingLeftEdge;
//
bool resizingRightEdge;
//
imagePosition = this.PointToImage(cursorPosition, true);
//
// get the current selection
//
left = this.SelectionRegion.Left;
//
top = this.SelectionRegion.Top;
//
right = this.SelectionRegion.Right;
//
bottom = this.SelectionRegion.Bottom;
//
// decide which edges we're resizing
//
resizingTopEdge = this.ResizeAnchor >= DragHandleAnchor.TopLeft && this.ResizeAnchor <= DragHandleAnchor.TopRight;
//
resizingBottomEdge = this.ResizeAnchor >= DragHandleAnchor.BottomLeft && this.ResizeAnchor <= DragHandleAnchor.BottomRight;
//
resizingLeftEdge = this.ResizeAnchor == DragHandleAnchor.TopLeft || this.ResizeAnchor == DragHandleAnchor.MiddleLeft || this.ResizeAnchor == DragHandleAnchor.BottomLeft;
//
resizingRightEdge = this.ResizeAnchor == DragHandleAnchor.TopRight || this.ResizeAnchor == DragHandleAnchor.MiddleRight || this.ResizeAnchor == DragHandleAnchor.BottomRight;
//
// and resize!
//
if (resizingTopEdge)
//
{
//
top = imagePosition.Y;
//
if (bottom - top < this.MinimumSelectionSize.Height)
//
{
//
top = bottom - this.MinimumSelectionSize.Height;
//
}
//
}
//
else if (resizingBottomEdge)
//
{
//
bottom = imagePosition.Y;
//
if (bottom - top < this.MinimumSelectionSize.Height)
//
{
//
bottom = top + this.MinimumSelectionSize.Height;
//
}
//
}
//
if (resizingLeftEdge)
//
{
//
left = imagePosition.X;
//
if (right - left < this.MinimumSelectionSize.Width)
//
{
//
left = right - this.MinimumSelectionSize.Width;
//
}
//
}
//
else if (resizingRightEdge)
//
{
//
right = imagePosition.X;
//
if (right - left < this.MinimumSelectionSize.Width)
//
{
//
right = left + this.MinimumSelectionSize.Width;
//
}
//
}
//
this.SelectionRegion = new RectangleF(left, top, right - left, bottom - top);
//
}
//
}
//
private void ResetDrag()
//
{
//
this.IsResizing = false;
//
this.IsMoving = false;
//
this.DragOrigin = Point.Empty;
//
this.DragOriginOffset = Point.Empty;
//
}
//
private void SetCursor(Point point)
//
{
//
Cursor cursor;
//
if (this.IsSelecting)
//
{
//
cursor = Cursors.Default;
//
}
//
else
//
{
//
DragHandleAnchor handleAnchor;
//
handleAnchor = this.IsResizing ? this.ResizeAnchor : this.HitTest(point);
//
if (handleAnchor != DragHandleAnchor.None && this.DragHandles[handleAnchor].Enabled)
//
{
//
switch (handleAnchor)
//
{
//
case DragHandleAnchor.TopLeft:
//
case DragHandleAnchor.BottomRight:
//
cursor = Cursors.SizeNWSE;
//
break;
//
case DragHandleAnchor.TopCenter:
//
case DragHandleAnchor.BottomCenter:
//
cursor = Cursors.SizeNS;
//
break;
//
case DragHandleAnchor.TopRight:
//
case DragHandleAnchor.BottomLeft:
//
cursor = Cursors.SizeNESW;
//
break;
//
case DragHandleAnchor.MiddleLeft:
//
case DragHandleAnchor.MiddleRight:
//
cursor = Cursors.SizeWE;
//
break;
//
case DragHandleAnchor.MiddleCenter:
//
cursor = Cursors.Cross;
//
break;
//
default:
//
throw new ArgumentOutOfRangeException();
//
}
//
}
//
else if (this.IsMoving || this.SelectionRegion.Contains(this.PointToImage(point)))
//
{
//
cursor = Cursors.SizeAll;
//
}
//
else
//
{
//
cursor = Cursors.Default;
//
}
//
}
//
this.Cursor = cursor;
//
}
//
private void StartResize(DragHandleAnchor anchor)
//
{
//
CancelEventArgs e;
//
if (this.IsMoving || this.IsResizing)
//
{
//
throw new InvalidOperationException("A move or resize action is currently being performed.");
//
}
//
e = new CancelEventArgs();
//
this.OnSelectionResizing(e);
//
if (!e.Cancel)
//
{
//
this.ResizeAnchor = anchor;
//
this.PreviousSelectionRegion = this.SelectionRegion;
//
this.IsResizing = true;
//
}
//
}
//
#endregion
//
}
//
}
ImageBox/ImageBox.cs
查看文件 @
860cabb
...
...
@@ -895,7 +895,7 @@ namespace Cyotek.Windows.Forms
// draw the selection
if
(
this
.
SelectionRegion
.
PointCount
>
0
)
if
(
this
.
SelectionRegion
!=
null
&&
this
.
SelectionRegion
.
PointCount
>
0
)
{
this
.
DrawSelection
(
e
);
}
...
...
编写
预览
支持
Markdown
格式
附加文件
你添加了
0
人
到此讨论。请谨慎行事。
Finish editing this message first!
Cancel
请
注册
或
登录
后发表评论