diff --git a/Bin/Debug/CommonControls/.NET4 示例/Itrycn_Project.exe b/Bin/Debug/CommonControls/.NET4 示例/Itrycn_Project.exe
index 4e888c5..7d66f5b 100644
Binary files a/Bin/Debug/CommonControls/.NET4 示例/Itrycn_Project.exe and b/Bin/Debug/CommonControls/.NET4 示例/Itrycn_Project.exe differ
diff --git a/Bin/Debug/CommonControls/.NET4 示例/Itrycn_Project2.exe b/Bin/Debug/CommonControls/.NET4 示例/Itrycn_Project2.exe
index c6b76ca..e08bcb6 100644
Binary files a/Bin/Debug/CommonControls/.NET4 示例/Itrycn_Project2.exe and b/Bin/Debug/CommonControls/.NET4 示例/Itrycn_Project2.exe differ
diff --git a/Bin/Debug/CommonControls/.NET4 示例/MyDb.dll b/Bin/Debug/CommonControls/.NET4 示例/MyDb.dll
index c9ede55..b59bdf0 100644
Binary files a/Bin/Debug/CommonControls/.NET4 示例/MyDb.dll and b/Bin/Debug/CommonControls/.NET4 示例/MyDb.dll differ
diff --git a/Bin/Debug/CommonControls/.NET4 示例/MyDb.xml b/Bin/Debug/CommonControls/.NET4 示例/MyDb.xml
index e2bedc0..d0448da 100644
--- a/Bin/Debug/CommonControls/.NET4 示例/MyDb.xml
+++ b/Bin/Debug/CommonControls/.NET4 示例/MyDb.xml
@@ -2107,6 +2107,188 @@
+
+
+ 对鼠标或键盘的自动化操作
+
+
+
+
+ 鼠标左键
+
+
+
+
+ 鼠标中键
+
+
+
+
+ 鼠标右键
+
+
+
+
+ 模拟键盘按键
+
+
+
+ 按下还是抬起
+
+
+
+ 鼠标滚轮
+
+
+
+
+
+
+
+ 鼠标移动
+
+
+
+
+
+
+
+ 自定义鼠标按下或抬起
+
+
+
+
+
+
+
+
+ 左键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标x(句柄内的坐标,非屏幕坐标)
+ 坐标y(句柄内的坐标,非屏幕坐标)
+
+
+
+ 左键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标(句柄内的坐标,非屏幕坐标)
+
+
+
+ 右键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标x(句柄内的坐标,非屏幕坐标)
+ 坐标y(句柄内的坐标,非屏幕坐标)
+
+
+
+ 右键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标(句柄内的坐标,非屏幕坐标)
+
+
+
+ 中键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标x(句柄内的坐标,非屏幕坐标)
+ 坐标y(句柄内的坐标,非屏幕坐标)
+
+
+
+ 中键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标(句柄内的坐标,非屏幕坐标)
+
+
+
+ 左键单击鼠标(不支持后台单击)
+
+ 坐标x(屏幕坐标)
+ 坐标y(屏幕坐标)
+
+
+
+ 左键单击鼠标(不支持后台单击)
+
+ 坐标(屏幕坐标)
+
+
+
+ 右键单击鼠标(不支持后台单击)
+
+ 坐标x(屏幕坐标)
+ 坐标y(屏幕坐标)
+
+
+
+ 右键单击鼠标(不支持后台单击)
+
+ 坐标(屏幕坐标)
+
+
+
+ 中键单击鼠标(不支持后台单击)
+
+ 坐标x(屏幕坐标)
+ 坐标y(屏幕坐标)
+
+
+
+ 中键单击鼠标(不支持后台单击)
+
+ 坐标(屏幕坐标)
+
+
+
+ 粘贴文本
+
+
+
+
+
+ 获取指定句柄的大小及位置
+
+
+
+
+
+
+
+ 设置指定句柄的大小
+
+
+
+
+
+
+ 判断鼠标位置是不是在指定的矩形中
+
+
+
+
+
+
+
+ 判断2张图是否相似度超90
+
+
+
+
+
+
+
+ /获取2种颜色的相似度,范围为0~100
+
+
+
+
+
新模态窗体
@@ -2580,6 +2762,48 @@
7000 表示IE7兼容视图模式;8000 表示IE8 标准模式 ;8888 表示IE8 强制标准模式,在渲染失败的情况下不尝试用兼容视图模式
+
+
+ 设置文件关联
+
+ 扩展名(如.apk)
+ 映射的扩展名(如apkfile)
+ app名称(建议用英文数字)
+ 文件关联描述
+ 文件路径
+
+
+
+ 设置文件关联
+
+ 映射的扩展名(如apkfile)
+ app名称(建议用英文数字)
+ 文件关联描述
+ 文件路径
+
+
+
+ 在指定文件格式右键菜单中增加菜单
+
+ 扩展名(如.apk)
+ app名称(建议用英文数字)
+ 文件关联描述
+ 文件路径
+
+
+
+ 删除文件关联
+
+ 映射的扩展名(如apkfile)
+ app名称(建议用英文数字)
+
+
+
+ 获取文件关联是否存在
+
+ 映射的扩展名(如apkfile)
+ app名称(建议用英文数字)
+
采用的IE模式
@@ -4948,5 +5172,380 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /
+
+
+
+
+ /
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 模拟鼠标点击
+
+
+
+
+
+
+
+
+
+
+ 模拟按键
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The GetParent function retrieves a handle to the specified window's parent or owner.
+
+ Handle to the window whose parent window handle is to be retrieved.
+ If the window is a child window, the return value is a handle to the parent window. If the window is a top-level window, the return value is a handle to the owner window. If the window is a top-level unowned window or if the function fails, the return value is NULL.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The FindWindowEx function retrieves a handle to a window whose class name and window name match the specified strings. The function searches child windows, beginning with the one following the specified child window.
+
+ Handle to the parent window whose child windows are to be searched.
+ Handle to a child window.
+ Specifies class name.
+ Pointer to a null-terminated string that specifies the window name (the window's title).
+ If the function succeeds, the return value is a handle to the window that has the specified class and window names.If the function fails, the return value is NULL.
+
+
+
+ The InvalidateRect function adds a rectangle to the specified window's update region.
+
+ Handle to window.
+ Rectangle coordinates.
+ Erase state.
+ If the function succeeds, the return value is true.If the function fails, the return value is false.
+
+
+
+ The ValidateRect function validates the client area within a rectangle by removing the rectangle from the update region of the specified window.
+
+ Handle to window.
+ Validation rectangle coordinates.
+ If the function succeeds, the return value is true.If the function fails, the return value is false.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Changes the size, position, and Z order of a child, pop-up, or top-level window.
+ These windows are ordered according to their appearance on the screen.
+ The topmost window receives the highest rank and is the first window in the Z order.
+
+ A handle to the window.
+ A handle to the window to precede the positioned window in the Z order. This parameter must be a window handle or one of the following values.
+ Specifies the new position of the left side of the window, in client coordinates.
+ Specifies the new position of the top of the window, in client coordinates.
+ Specifies the new width of the window, in pixels.
+ Specifies the new height of the window, in pixels.
+ Specifies the window sizing and positioning flags. This parameter can be a combination of the following values.
+ If the function succeeds, the return value is nonzero, if the function fails, the return value is zero.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Bin/Debug/CommonControls/.NET4 示例/MyDb_SQLite.dll b/Bin/Debug/CommonControls/.NET4 示例/MyDb_SQLite.dll
index 4f49a36..22442eb 100644
Binary files a/Bin/Debug/CommonControls/.NET4 示例/MyDb_SQLite.dll and b/Bin/Debug/CommonControls/.NET4 示例/MyDb_SQLite.dll differ
diff --git a/Bin/Debug/CommonControls/.NET4 示例/RyPrint.dll b/Bin/Debug/CommonControls/.NET4 示例/RyPrint.dll
index 1bf80ac..7c940e0 100644
Binary files a/Bin/Debug/CommonControls/.NET4 示例/RyPrint.dll and b/Bin/Debug/CommonControls/.NET4 示例/RyPrint.dll differ
diff --git a/Bin/Debug/CommonControls/.NET4 示例/RyWeb.dll b/Bin/Debug/CommonControls/.NET4 示例/RyWeb.dll
index 2102f99..b74266b 100644
Binary files a/Bin/Debug/CommonControls/.NET4 示例/RyWeb.dll and b/Bin/Debug/CommonControls/.NET4 示例/RyWeb.dll differ
diff --git a/Bin/Debug/CommonControls/.NET4 示例/UserDb/Win.dat b/Bin/Debug/CommonControls/.NET4 示例/UserDb/Win.dat
index f7b3dbb..ec189b4 100644
--- a/Bin/Debug/CommonControls/.NET4 示例/UserDb/Win.dat
+++ b/Bin/Debug/CommonControls/.NET4 示例/UserDb/Win.dat
@@ -1,2 +1,2 @@
[Money_Op]
-hwnd=5315574
+hwnd=3875764
diff --git a/Bin/Debug/CommonControls/.NET4 示例/cUpdate.dat b/Bin/Debug/CommonControls/.NET4 示例/cUpdate.dat
index 0020af4..2a90ba4 100644
--- a/Bin/Debug/CommonControls/.NET4 示例/cUpdate.dat
+++ b/Bin/Debug/CommonControls/.NET4 示例/cUpdate.dat
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/Bin/Debug/CommonControls/.NET4 示例/ryControls.dll b/Bin/Debug/CommonControls/.NET4 示例/ryControls.dll
index 0b49fc4..b6d1767 100644
Binary files a/Bin/Debug/CommonControls/.NET4 示例/ryControls.dll and b/Bin/Debug/CommonControls/.NET4 示例/ryControls.dll differ
diff --git a/Bin/Debug/CommonControls/.NET4 示例/ryControls.xml b/Bin/Debug/CommonControls/.NET4 示例/ryControls.xml
index fc15051..bdc5975 100644
--- a/Bin/Debug/CommonControls/.NET4 示例/ryControls.xml
+++ b/Bin/Debug/CommonControls/.NET4 示例/ryControls.xml
@@ -22410,13 +22410,16 @@
- 此渲染器是否将使用父ObjectListView中的自定义图像来绘制复选框图像。
+ Will this renderer use the custom images from the parent ObjectListView
+ to draw the checkbox images.
- 如果为true,则渲染器将使用StateImageList中的图像来表示复选框。0-未选中,1-选中,2-不确定。
+ If this is true, the renderer will use the images from the
+ StateImageList to represent checkboxes. 0 - unchecked, 1 - checked, 2 - indeterminate.
- 如果为False(默认值),则渲染器将使用.NET的标准CheckBoxRenender。
+ If this is false (the default), then the renderer will use .NET's standard
+ CheckBoxRenderer.
@@ -23401,7 +23404,7 @@
- 创建一个图像渲染器,该图像渲染器最多可以绘制指定的图像的maxImages次数。
+ Make an image renderer that will draw the indicated image, at most maxImages times.
@@ -23410,12 +23413,12 @@
- 应绘制的图像索引
+ The index of the image that should be drawn
- 应绘制的图像名称
+ The name of the image that should be drawn
@@ -23426,17 +23429,17 @@
- 此渲染器应绘制的最大图像数
+ What is the maximum number of images that this renderer should draw?
- 小于或等于此值的值将不绘制图像
+ Values less than or equal to this will have 0 images drawn
- 大于或等于该值的值将绘制MaxNumberImages图像
+ Values greater than or equal to this will have MaxNumberImages images drawn
@@ -23493,60 +23496,60 @@
-
- 文本是否应该使用GDI例程呈现?这使文本看起来更像本机列表视图控件。
-
+
+ Should text be rendered using GDI routines? This makes the text look more
+ like a native List view control.
+
- 获取或设置标题字体
+ Gets or set the font that will be used to draw the title of the task
If this is null, the ListView's font will be used
- 返回已为标题设置的字体或默认值
+ Return a font that has been set for the title or a reasonable default
- 获取或设置任务标题(Title)的颜色
+ Gets or set the color of the title of the task
- 当任务未被选中或列表视图具有半透明选择机制时,将使用此颜色。
-
+ This color is used when the task is not selected or when the listview
+ has a translucent selection mechanism.
- 返回任务标题的颜色或默认值
+ Return the color of the title of the task or a reasonable default
- 获取或设置任务描述(Description)的字体
+ Gets or set the font that will be used to draw the description of the task
- 如果为null,则使用listview的字体
+ If this is null, the ListView's font will be used
-
- 返回已为Description设置的字体或默认值
-
+
+ Return a font that has been set for the title or a reasonable default
+
-
- 获取或设置任务描述(Description)的颜色
-
-
- 当任务未被选中或列表视图具有半透明选择机制时,将使用此颜色。
-
+
+ Gets or set the color of the description of the task
+
+ This color is used when the task is not selected or when the listview
+ has a translucent selection mechanism.
- 返回任务描述(Description)的颜色或默认值
+ Return the color of the description of the task or a reasonable default
- 获取或设置图片和文字之间的距离
+ Gets or sets the number of pixels that will be left between the image and the text
@@ -23555,13 +23558,13 @@
-
- 获取或设置标题(Title)和描述(Description)之间的距离(单位:像素)
-
+
+ Gets or sets the number of pixels that will be left between the title and the description
+
-
- 获取或设置跟Description挂钩的模型对象名称
+
+ Gets or sets the name of the aspect of the model object that contains the task description
@@ -23618,42 +23621,67 @@
- 此渲染器在其单元格中绘制一个功能按钮
+ This renderer draws a functioning button in its cell
- 获取或设置按钮的大小模式
+ Gets or sets how each button will be sized
- 获取或设置SizingMode为FixedBound时按钮的大小
+ Gets or sets the size of the button when the SizingMode is FixedBounds
- 如果未设置,将使用单元格的边界
+ If this is not set, the bounds of the cell will be used
-
- 获取或设置当SizingMode为TextBound时单元格周围的额外空间
-
+
+ Gets or sets the extra space that surrounds the cell when the SizingMode is TextBounds
+
- 获取或设置按钮可以占用的最大宽度
- -1 表示不限制宽度
+ Gets or sets the maximum width that a button can occupy.
+ -1 means there is no maximum width.
- 仅当SizingMode为TextBound时才会生效
+ This is only considered when the SizingMode is TextBounds
- 获取或设置按钮可以占用的最小宽度。
- -1 表示不限制宽度
+ Gets or sets the minimum width that a button can occupy.
+ -1 means there is no minimum width.
- 仅当SizingMode为TextBound时才会生效
+ This is only considered when the SizingMode is TextBounds
+
+
+
+ 获取或设置此列按钮的字体颜色(如果有按钮的话)
+
+
+
+
+ 获取或设置此列按钮的背景颜色(如果有按钮的话)
+
+
+
+
+ 获取或设置此列按钮的边框颜色(如果有按钮的话)
+
+
+
+
+ 获取或设置此列按钮的内边框颜色(如果有按钮的话)
+
+
+
+
+ 获取或设置此列按钮是否画边框(如果有按钮的话)
+
- 计算内容的大小
+ Calculate the size of the contents
@@ -23661,7 +23689,7 @@
- 画按钮
+ Draw the button
@@ -23678,13 +23706,13 @@
- 按钮的状态
+ What is the state of the button?
- 鼠标是否在按钮上
+ Is the mouse over the button?
@@ -23884,6 +23912,58 @@
+
+
+ 正常为选中按钮
+
+
+
+
+ 获得焦点的按钮
+
+
+
+
+ 鼠标经过样式
+
+
+
+
+ 获得焦点并鼠标经过
+
+
+
+
+ 自定义GDI工具,绘制按钮
+
+
+
+
+ 绘制圆形按钮(用法同矩形按钮)
+
+
+
+
+
+
+
+
+
+ 绘制圆角按钮
+
+ 要绘制的文字
+ Graphics 对象
+ 要填充的矩形
+
+
+
+
+ 根据普通矩形得到圆角矩形的路径
+
+ 原始矩形
+ 半径
+ 图形路径
+
A GlassPanelForm sits transparently over an ObjectListView to show overlays.
diff --git a/Bin/Debug/CommonControls/.NET4 示例/ryUpdate.dll b/Bin/Debug/CommonControls/.NET4 示例/ryUpdate.dll
index 76bfba4..f4747e9 100644
Binary files a/Bin/Debug/CommonControls/.NET4 示例/ryUpdate.dll and b/Bin/Debug/CommonControls/.NET4 示例/ryUpdate.dll differ
diff --git a/Bin/Debug/CommonControls/.NET4 示例/ryUpdate.xml b/Bin/Debug/CommonControls/.NET4 示例/ryUpdate.xml
index c9c371c..72b168c 100644
--- a/Bin/Debug/CommonControls/.NET4 示例/ryUpdate.xml
+++ b/Bin/Debug/CommonControls/.NET4 示例/ryUpdate.xml
@@ -469,5 +469,21 @@
+
+
+ 一个强类型的资源类,用于查找本地化的字符串等。
+
+
+
+
+ 返回此类使用的缓存的 ResourceManager 实例。
+
+
+
+
+ 重写当前线程的 CurrentUICulture 属性,对
+ 使用此强类型资源类的所有资源查找执行重写。
+
+
diff --git a/Bin/Debug/CommonControls/.NET4 示例/线程错误.txt b/Bin/Debug/CommonControls/.NET4 示例/线程错误.txt
new file mode 100644
index 0000000..e942b5b
--- /dev/null
+++ b/Bin/Debug/CommonControls/.NET4 示例/线程错误.txt
@@ -0,0 +1,22 @@
+2021/2/10 22:56:28
+
+错误描述:所请求的剪贴板操作失败。
+
+异常堆栈: 在 System.Windows.Forms.Clipboard.ThrowIfFailed(Int32 hr)
+ 在 System.Windows.Forms.Clipboard.SetDataObject(Object data, Boolean copy, Int32 retryTimes, Int32 retryDelay)
+ 在 System.Windows.Forms.Clipboard.SetText(String text, TextDataFormat format)
+ 在 System.Windows.Forms.Clipboard.SetText(String text)
+ 在 ryCommon.Auto.PasteText(String text) 位置 E:\My Datas\毕方项目\C#\睿元公用控件组\Source\MyDb\SysFuns\Auto.cs:行号 185
+ 在 Itrycn_Project2.FrmStart.button2_Click(Object sender, EventArgs e) 位置 E:\My Datas\毕方项目\C#\睿元公用控件组\Source\Itrycn_Project2\FrmStart.cs:行号 157
+ 在 System.Windows.Forms.Control.OnClick(EventArgs e)
+ 在 System.Windows.Forms.Button.OnClick(EventArgs e)
+ 在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
+ 在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
+ 在 System.Windows.Forms.Control.WndProc(Message& m)
+ 在 System.Windows.Forms.ButtonBase.WndProc(Message& m)
+ 在 System.Windows.Forms.Button.WndProc(Message& m)
+ 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
+ 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
+ 在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
+
+异常方法:Void ThrowIfFailed(Int32)
\ No newline at end of file
diff --git a/Bin/Debug/CommonControls/.NET4/MyDb.dll b/Bin/Debug/CommonControls/.NET4/MyDb.dll
index c9ede55..b59bdf0 100644
Binary files a/Bin/Debug/CommonControls/.NET4/MyDb.dll and b/Bin/Debug/CommonControls/.NET4/MyDb.dll differ
diff --git a/Bin/Debug/CommonControls/.NET4/MyDb.xml b/Bin/Debug/CommonControls/.NET4/MyDb.xml
index e2bedc0..d0448da 100644
--- a/Bin/Debug/CommonControls/.NET4/MyDb.xml
+++ b/Bin/Debug/CommonControls/.NET4/MyDb.xml
@@ -2107,6 +2107,188 @@
+
+
+ 对鼠标或键盘的自动化操作
+
+
+
+
+ 鼠标左键
+
+
+
+
+ 鼠标中键
+
+
+
+
+ 鼠标右键
+
+
+
+
+ 模拟键盘按键
+
+
+
+ 按下还是抬起
+
+
+
+ 鼠标滚轮
+
+
+
+
+
+
+
+ 鼠标移动
+
+
+
+
+
+
+
+ 自定义鼠标按下或抬起
+
+
+
+
+
+
+
+
+ 左键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标x(句柄内的坐标,非屏幕坐标)
+ 坐标y(句柄内的坐标,非屏幕坐标)
+
+
+
+ 左键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标(句柄内的坐标,非屏幕坐标)
+
+
+
+ 右键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标x(句柄内的坐标,非屏幕坐标)
+ 坐标y(句柄内的坐标,非屏幕坐标)
+
+
+
+ 右键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标(句柄内的坐标,非屏幕坐标)
+
+
+
+ 中键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标x(句柄内的坐标,非屏幕坐标)
+ 坐标y(句柄内的坐标,非屏幕坐标)
+
+
+
+ 中键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标(句柄内的坐标,非屏幕坐标)
+
+
+
+ 左键单击鼠标(不支持后台单击)
+
+ 坐标x(屏幕坐标)
+ 坐标y(屏幕坐标)
+
+
+
+ 左键单击鼠标(不支持后台单击)
+
+ 坐标(屏幕坐标)
+
+
+
+ 右键单击鼠标(不支持后台单击)
+
+ 坐标x(屏幕坐标)
+ 坐标y(屏幕坐标)
+
+
+
+ 右键单击鼠标(不支持后台单击)
+
+ 坐标(屏幕坐标)
+
+
+
+ 中键单击鼠标(不支持后台单击)
+
+ 坐标x(屏幕坐标)
+ 坐标y(屏幕坐标)
+
+
+
+ 中键单击鼠标(不支持后台单击)
+
+ 坐标(屏幕坐标)
+
+
+
+ 粘贴文本
+
+
+
+
+
+ 获取指定句柄的大小及位置
+
+
+
+
+
+
+
+ 设置指定句柄的大小
+
+
+
+
+
+
+ 判断鼠标位置是不是在指定的矩形中
+
+
+
+
+
+
+
+ 判断2张图是否相似度超90
+
+
+
+
+
+
+
+ /获取2种颜色的相似度,范围为0~100
+
+
+
+
+
新模态窗体
@@ -2580,6 +2762,48 @@
7000 表示IE7兼容视图模式;8000 表示IE8 标准模式 ;8888 表示IE8 强制标准模式,在渲染失败的情况下不尝试用兼容视图模式
+
+
+ 设置文件关联
+
+ 扩展名(如.apk)
+ 映射的扩展名(如apkfile)
+ app名称(建议用英文数字)
+ 文件关联描述
+ 文件路径
+
+
+
+ 设置文件关联
+
+ 映射的扩展名(如apkfile)
+ app名称(建议用英文数字)
+ 文件关联描述
+ 文件路径
+
+
+
+ 在指定文件格式右键菜单中增加菜单
+
+ 扩展名(如.apk)
+ app名称(建议用英文数字)
+ 文件关联描述
+ 文件路径
+
+
+
+ 删除文件关联
+
+ 映射的扩展名(如apkfile)
+ app名称(建议用英文数字)
+
+
+
+ 获取文件关联是否存在
+
+ 映射的扩展名(如apkfile)
+ app名称(建议用英文数字)
+
采用的IE模式
@@ -4948,5 +5172,380 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /
+
+
+
+
+ /
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 模拟鼠标点击
+
+
+
+
+
+
+
+
+
+
+ 模拟按键
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The GetParent function retrieves a handle to the specified window's parent or owner.
+
+ Handle to the window whose parent window handle is to be retrieved.
+ If the window is a child window, the return value is a handle to the parent window. If the window is a top-level window, the return value is a handle to the owner window. If the window is a top-level unowned window or if the function fails, the return value is NULL.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The FindWindowEx function retrieves a handle to a window whose class name and window name match the specified strings. The function searches child windows, beginning with the one following the specified child window.
+
+ Handle to the parent window whose child windows are to be searched.
+ Handle to a child window.
+ Specifies class name.
+ Pointer to a null-terminated string that specifies the window name (the window's title).
+ If the function succeeds, the return value is a handle to the window that has the specified class and window names.If the function fails, the return value is NULL.
+
+
+
+ The InvalidateRect function adds a rectangle to the specified window's update region.
+
+ Handle to window.
+ Rectangle coordinates.
+ Erase state.
+ If the function succeeds, the return value is true.If the function fails, the return value is false.
+
+
+
+ The ValidateRect function validates the client area within a rectangle by removing the rectangle from the update region of the specified window.
+
+ Handle to window.
+ Validation rectangle coordinates.
+ If the function succeeds, the return value is true.If the function fails, the return value is false.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Changes the size, position, and Z order of a child, pop-up, or top-level window.
+ These windows are ordered according to their appearance on the screen.
+ The topmost window receives the highest rank and is the first window in the Z order.
+
+ A handle to the window.
+ A handle to the window to precede the positioned window in the Z order. This parameter must be a window handle or one of the following values.
+ Specifies the new position of the left side of the window, in client coordinates.
+ Specifies the new position of the top of the window, in client coordinates.
+ Specifies the new width of the window, in pixels.
+ Specifies the new height of the window, in pixels.
+ Specifies the window sizing and positioning flags. This parameter can be a combination of the following values.
+ If the function succeeds, the return value is nonzero, if the function fails, the return value is zero.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Bin/Debug/CommonControls/.NET4/MyDb_MSSQL.dll b/Bin/Debug/CommonControls/.NET4/MyDb_MSSQL.dll
index bac6b9d..aea2286 100644
Binary files a/Bin/Debug/CommonControls/.NET4/MyDb_MSSQL.dll and b/Bin/Debug/CommonControls/.NET4/MyDb_MSSQL.dll differ
diff --git a/Bin/Debug/CommonControls/.NET4/MyDb_MySQL.dll b/Bin/Debug/CommonControls/.NET4/MyDb_MySQL.dll
index 8bb3108..57b2b9a 100644
Binary files a/Bin/Debug/CommonControls/.NET4/MyDb_MySQL.dll and b/Bin/Debug/CommonControls/.NET4/MyDb_MySQL.dll differ
diff --git a/Bin/Debug/CommonControls/.NET4/MyDb_SQLite.dll b/Bin/Debug/CommonControls/.NET4/MyDb_SQLite.dll
index 4f49a36..22442eb 100644
Binary files a/Bin/Debug/CommonControls/.NET4/MyDb_SQLite.dll and b/Bin/Debug/CommonControls/.NET4/MyDb_SQLite.dll differ
diff --git a/Bin/Debug/CommonControls/.NET4/RyPrint.dll b/Bin/Debug/CommonControls/.NET4/RyPrint.dll
index 1bf80ac..7c940e0 100644
Binary files a/Bin/Debug/CommonControls/.NET4/RyPrint.dll and b/Bin/Debug/CommonControls/.NET4/RyPrint.dll differ
diff --git a/Bin/Debug/CommonControls/.NET4/RyWeb.dll b/Bin/Debug/CommonControls/.NET4/RyWeb.dll
index 2102f99..f4bd044 100644
Binary files a/Bin/Debug/CommonControls/.NET4/RyWeb.dll and b/Bin/Debug/CommonControls/.NET4/RyWeb.dll differ
diff --git a/Bin/Debug/CommonControls/.NET4/ryControls.dll b/Bin/Debug/CommonControls/.NET4/ryControls.dll
index 0b49fc4..b6d1767 100644
Binary files a/Bin/Debug/CommonControls/.NET4/ryControls.dll and b/Bin/Debug/CommonControls/.NET4/ryControls.dll differ
diff --git a/Bin/Debug/CommonControls/.NET4/ryControls.xml b/Bin/Debug/CommonControls/.NET4/ryControls.xml
index fc15051..bdc5975 100644
--- a/Bin/Debug/CommonControls/.NET4/ryControls.xml
+++ b/Bin/Debug/CommonControls/.NET4/ryControls.xml
@@ -22410,13 +22410,16 @@
- 此渲染器是否将使用父ObjectListView中的自定义图像来绘制复选框图像。
+ Will this renderer use the custom images from the parent ObjectListView
+ to draw the checkbox images.
- 如果为true,则渲染器将使用StateImageList中的图像来表示复选框。0-未选中,1-选中,2-不确定。
+ If this is true, the renderer will use the images from the
+ StateImageList to represent checkboxes. 0 - unchecked, 1 - checked, 2 - indeterminate.
- 如果为False(默认值),则渲染器将使用.NET的标准CheckBoxRenender。
+ If this is false (the default), then the renderer will use .NET's standard
+ CheckBoxRenderer.
@@ -23401,7 +23404,7 @@
- 创建一个图像渲染器,该图像渲染器最多可以绘制指定的图像的maxImages次数。
+ Make an image renderer that will draw the indicated image, at most maxImages times.
@@ -23410,12 +23413,12 @@
- 应绘制的图像索引
+ The index of the image that should be drawn
- 应绘制的图像名称
+ The name of the image that should be drawn
@@ -23426,17 +23429,17 @@
- 此渲染器应绘制的最大图像数
+ What is the maximum number of images that this renderer should draw?
- 小于或等于此值的值将不绘制图像
+ Values less than or equal to this will have 0 images drawn
- 大于或等于该值的值将绘制MaxNumberImages图像
+ Values greater than or equal to this will have MaxNumberImages images drawn
@@ -23493,60 +23496,60 @@
-
- 文本是否应该使用GDI例程呈现?这使文本看起来更像本机列表视图控件。
-
+
+ Should text be rendered using GDI routines? This makes the text look more
+ like a native List view control.
+
- 获取或设置标题字体
+ Gets or set the font that will be used to draw the title of the task
If this is null, the ListView's font will be used
- 返回已为标题设置的字体或默认值
+ Return a font that has been set for the title or a reasonable default
- 获取或设置任务标题(Title)的颜色
+ Gets or set the color of the title of the task
- 当任务未被选中或列表视图具有半透明选择机制时,将使用此颜色。
-
+ This color is used when the task is not selected or when the listview
+ has a translucent selection mechanism.
- 返回任务标题的颜色或默认值
+ Return the color of the title of the task or a reasonable default
- 获取或设置任务描述(Description)的字体
+ Gets or set the font that will be used to draw the description of the task
- 如果为null,则使用listview的字体
+ If this is null, the ListView's font will be used
-
- 返回已为Description设置的字体或默认值
-
+
+ Return a font that has been set for the title or a reasonable default
+
-
- 获取或设置任务描述(Description)的颜色
-
-
- 当任务未被选中或列表视图具有半透明选择机制时,将使用此颜色。
-
+
+ Gets or set the color of the description of the task
+
+ This color is used when the task is not selected or when the listview
+ has a translucent selection mechanism.
- 返回任务描述(Description)的颜色或默认值
+ Return the color of the description of the task or a reasonable default
- 获取或设置图片和文字之间的距离
+ Gets or sets the number of pixels that will be left between the image and the text
@@ -23555,13 +23558,13 @@
-
- 获取或设置标题(Title)和描述(Description)之间的距离(单位:像素)
-
+
+ Gets or sets the number of pixels that will be left between the title and the description
+
-
- 获取或设置跟Description挂钩的模型对象名称
+
+ Gets or sets the name of the aspect of the model object that contains the task description
@@ -23618,42 +23621,67 @@
- 此渲染器在其单元格中绘制一个功能按钮
+ This renderer draws a functioning button in its cell
- 获取或设置按钮的大小模式
+ Gets or sets how each button will be sized
- 获取或设置SizingMode为FixedBound时按钮的大小
+ Gets or sets the size of the button when the SizingMode is FixedBounds
- 如果未设置,将使用单元格的边界
+ If this is not set, the bounds of the cell will be used
-
- 获取或设置当SizingMode为TextBound时单元格周围的额外空间
-
+
+ Gets or sets the extra space that surrounds the cell when the SizingMode is TextBounds
+
- 获取或设置按钮可以占用的最大宽度
- -1 表示不限制宽度
+ Gets or sets the maximum width that a button can occupy.
+ -1 means there is no maximum width.
- 仅当SizingMode为TextBound时才会生效
+ This is only considered when the SizingMode is TextBounds
- 获取或设置按钮可以占用的最小宽度。
- -1 表示不限制宽度
+ Gets or sets the minimum width that a button can occupy.
+ -1 means there is no minimum width.
- 仅当SizingMode为TextBound时才会生效
+ This is only considered when the SizingMode is TextBounds
+
+
+
+ 获取或设置此列按钮的字体颜色(如果有按钮的话)
+
+
+
+
+ 获取或设置此列按钮的背景颜色(如果有按钮的话)
+
+
+
+
+ 获取或设置此列按钮的边框颜色(如果有按钮的话)
+
+
+
+
+ 获取或设置此列按钮的内边框颜色(如果有按钮的话)
+
+
+
+
+ 获取或设置此列按钮是否画边框(如果有按钮的话)
+
- 计算内容的大小
+ Calculate the size of the contents
@@ -23661,7 +23689,7 @@
- 画按钮
+ Draw the button
@@ -23678,13 +23706,13 @@
- 按钮的状态
+ What is the state of the button?
- 鼠标是否在按钮上
+ Is the mouse over the button?
@@ -23884,6 +23912,58 @@
+
+
+ 正常为选中按钮
+
+
+
+
+ 获得焦点的按钮
+
+
+
+
+ 鼠标经过样式
+
+
+
+
+ 获得焦点并鼠标经过
+
+
+
+
+ 自定义GDI工具,绘制按钮
+
+
+
+
+ 绘制圆形按钮(用法同矩形按钮)
+
+
+
+
+
+
+
+
+
+ 绘制圆角按钮
+
+ 要绘制的文字
+ Graphics 对象
+ 要填充的矩形
+
+
+
+
+ 根据普通矩形得到圆角矩形的路径
+
+ 原始矩形
+ 半径
+ 图形路径
+
A GlassPanelForm sits transparently over an ObjectListView to show overlays.
diff --git a/Bin/Debug/CommonControls/.NET4/ryUpdate.dll b/Bin/Debug/CommonControls/.NET4/ryUpdate.dll
index 76bfba4..f4747e9 100644
Binary files a/Bin/Debug/CommonControls/.NET4/ryUpdate.dll and b/Bin/Debug/CommonControls/.NET4/ryUpdate.dll differ
diff --git a/Bin/Debug/CommonControls/.NET4/ryUpdate.xml b/Bin/Debug/CommonControls/.NET4/ryUpdate.xml
index c9c371c..72b168c 100644
--- a/Bin/Debug/CommonControls/.NET4/ryUpdate.xml
+++ b/Bin/Debug/CommonControls/.NET4/ryUpdate.xml
@@ -469,5 +469,21 @@
+
+
+ 一个强类型的资源类,用于查找本地化的字符串等。
+
+
+
+
+ 返回此类使用的缓存的 ResourceManager 实例。
+
+
+
+
+ 重写当前线程的 CurrentUICulture 属性,对
+ 使用此强类型资源类的所有资源查找执行重写。
+
+
diff --git a/Bin/Release/CommonControls/.NET4 示例/Itrycn_Project.exe b/Bin/Release/CommonControls/.NET4 示例/Itrycn_Project.exe
index 218f1ac..afa1540 100644
Binary files a/Bin/Release/CommonControls/.NET4 示例/Itrycn_Project.exe and b/Bin/Release/CommonControls/.NET4 示例/Itrycn_Project.exe differ
diff --git a/Bin/Release/CommonControls/.NET4 示例/MyDb.dll b/Bin/Release/CommonControls/.NET4 示例/MyDb.dll
index aa6874e..9e3a194 100644
Binary files a/Bin/Release/CommonControls/.NET4 示例/MyDb.dll and b/Bin/Release/CommonControls/.NET4 示例/MyDb.dll differ
diff --git a/Bin/Release/CommonControls/.NET4 示例/MyDb.xml b/Bin/Release/CommonControls/.NET4 示例/MyDb.xml
index a2f065f..d0448da 100644
--- a/Bin/Release/CommonControls/.NET4 示例/MyDb.xml
+++ b/Bin/Release/CommonControls/.NET4 示例/MyDb.xml
@@ -1411,7 +1411,6 @@
获取hosts并转换hosts内容
- hosts内容
@@ -1588,6 +1587,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
删除单个文件。
@@ -1764,6 +1838,7 @@
+
@@ -1812,12 +1887,14 @@
追加日志
+
追加文件
+
@@ -2030,6 +2107,188 @@
+
+
+ 对鼠标或键盘的自动化操作
+
+
+
+
+ 鼠标左键
+
+
+
+
+ 鼠标中键
+
+
+
+
+ 鼠标右键
+
+
+
+
+ 模拟键盘按键
+
+
+
+ 按下还是抬起
+
+
+
+ 鼠标滚轮
+
+
+
+
+
+
+
+ 鼠标移动
+
+
+
+
+
+
+
+ 自定义鼠标按下或抬起
+
+
+
+
+
+
+
+
+ 左键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标x(句柄内的坐标,非屏幕坐标)
+ 坐标y(句柄内的坐标,非屏幕坐标)
+
+
+
+ 左键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标(句柄内的坐标,非屏幕坐标)
+
+
+
+ 右键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标x(句柄内的坐标,非屏幕坐标)
+ 坐标y(句柄内的坐标,非屏幕坐标)
+
+
+
+ 右键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标(句柄内的坐标,非屏幕坐标)
+
+
+
+ 中键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标x(句柄内的坐标,非屏幕坐标)
+ 坐标y(句柄内的坐标,非屏幕坐标)
+
+
+
+ 中键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标(句柄内的坐标,非屏幕坐标)
+
+
+
+ 左键单击鼠标(不支持后台单击)
+
+ 坐标x(屏幕坐标)
+ 坐标y(屏幕坐标)
+
+
+
+ 左键单击鼠标(不支持后台单击)
+
+ 坐标(屏幕坐标)
+
+
+
+ 右键单击鼠标(不支持后台单击)
+
+ 坐标x(屏幕坐标)
+ 坐标y(屏幕坐标)
+
+
+
+ 右键单击鼠标(不支持后台单击)
+
+ 坐标(屏幕坐标)
+
+
+
+ 中键单击鼠标(不支持后台单击)
+
+ 坐标x(屏幕坐标)
+ 坐标y(屏幕坐标)
+
+
+
+ 中键单击鼠标(不支持后台单击)
+
+ 坐标(屏幕坐标)
+
+
+
+ 粘贴文本
+
+
+
+
+
+ 获取指定句柄的大小及位置
+
+
+
+
+
+
+
+ 设置指定句柄的大小
+
+
+
+
+
+
+ 判断鼠标位置是不是在指定的矩形中
+
+
+
+
+
+
+
+ 判断2张图是否相似度超90
+
+
+
+
+
+
+
+ /获取2种颜色的相似度,范围为0~100
+
+
+
+
+
新模态窗体
@@ -2503,6 +2762,48 @@
7000 表示IE7兼容视图模式;8000 表示IE8 标准模式 ;8888 表示IE8 强制标准模式,在渲染失败的情况下不尝试用兼容视图模式
+
+
+ 设置文件关联
+
+ 扩展名(如.apk)
+ 映射的扩展名(如apkfile)
+ app名称(建议用英文数字)
+ 文件关联描述
+ 文件路径
+
+
+
+ 设置文件关联
+
+ 映射的扩展名(如apkfile)
+ app名称(建议用英文数字)
+ 文件关联描述
+ 文件路径
+
+
+
+ 在指定文件格式右键菜单中增加菜单
+
+ 扩展名(如.apk)
+ app名称(建议用英文数字)
+ 文件关联描述
+ 文件路径
+
+
+
+ 删除文件关联
+
+ 映射的扩展名(如apkfile)
+ app名称(建议用英文数字)
+
+
+
+ 获取文件关联是否存在
+
+ 映射的扩展名(如apkfile)
+ app名称(建议用英文数字)
+
采用的IE模式
@@ -2686,6 +2987,16 @@
高级拖放事件
+
+
+
+
+
+
+
+
+
+
@@ -3733,6 +4044,7 @@
获取HmacSHA256
+
@@ -4860,5 +5172,380 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /
+
+
+
+
+ /
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 模拟鼠标点击
+
+
+
+
+
+
+
+
+
+
+ 模拟按键
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The GetParent function retrieves a handle to the specified window's parent or owner.
+
+ Handle to the window whose parent window handle is to be retrieved.
+ If the window is a child window, the return value is a handle to the parent window. If the window is a top-level window, the return value is a handle to the owner window. If the window is a top-level unowned window or if the function fails, the return value is NULL.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The FindWindowEx function retrieves a handle to a window whose class name and window name match the specified strings. The function searches child windows, beginning with the one following the specified child window.
+
+ Handle to the parent window whose child windows are to be searched.
+ Handle to a child window.
+ Specifies class name.
+ Pointer to a null-terminated string that specifies the window name (the window's title).
+ If the function succeeds, the return value is a handle to the window that has the specified class and window names.If the function fails, the return value is NULL.
+
+
+
+ The InvalidateRect function adds a rectangle to the specified window's update region.
+
+ Handle to window.
+ Rectangle coordinates.
+ Erase state.
+ If the function succeeds, the return value is true.If the function fails, the return value is false.
+
+
+
+ The ValidateRect function validates the client area within a rectangle by removing the rectangle from the update region of the specified window.
+
+ Handle to window.
+ Validation rectangle coordinates.
+ If the function succeeds, the return value is true.If the function fails, the return value is false.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Changes the size, position, and Z order of a child, pop-up, or top-level window.
+ These windows are ordered according to their appearance on the screen.
+ The topmost window receives the highest rank and is the first window in the Z order.
+
+ A handle to the window.
+ A handle to the window to precede the positioned window in the Z order. This parameter must be a window handle or one of the following values.
+ Specifies the new position of the left side of the window, in client coordinates.
+ Specifies the new position of the top of the window, in client coordinates.
+ Specifies the new width of the window, in pixels.
+ Specifies the new height of the window, in pixels.
+ Specifies the window sizing and positioning flags. This parameter can be a combination of the following values.
+ If the function succeeds, the return value is nonzero, if the function fails, the return value is zero.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Bin/Release/CommonControls/.NET4 示例/MyDb_SQLite.dll b/Bin/Release/CommonControls/.NET4 示例/MyDb_SQLite.dll
index 4f951c5..4e0df6a 100644
Binary files a/Bin/Release/CommonControls/.NET4 示例/MyDb_SQLite.dll and b/Bin/Release/CommonControls/.NET4 示例/MyDb_SQLite.dll differ
diff --git a/Bin/Release/CommonControls/.NET4 示例/MyDb_SQLite.xml b/Bin/Release/CommonControls/.NET4 示例/MyDb_SQLite.xml
index 076748e..70ccea6 100644
--- a/Bin/Release/CommonControls/.NET4 示例/MyDb_SQLite.xml
+++ b/Bin/Release/CommonControls/.NET4 示例/MyDb_SQLite.xml
@@ -4,6 +4,21 @@
MyDb_SQLite
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -19,6 +34,21 @@
数据库路径
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
连接数据库
@@ -37,6 +67,12 @@
+
+
+
+
+
+
连接或创建数据库,如果数据库不存在,就创建,否则连接
@@ -172,5 +208,200 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Bin/Release/CommonControls/.NET4 示例/RyPrint.dll b/Bin/Release/CommonControls/.NET4 示例/RyPrint.dll
index 37b6a2c..34cc36c 100644
Binary files a/Bin/Release/CommonControls/.NET4 示例/RyPrint.dll and b/Bin/Release/CommonControls/.NET4 示例/RyPrint.dll differ
diff --git a/Bin/Release/CommonControls/.NET4 示例/RyWeb.dll b/Bin/Release/CommonControls/.NET4 示例/RyWeb.dll
index 1f306b5..b74266b 100644
Binary files a/Bin/Release/CommonControls/.NET4 示例/RyWeb.dll and b/Bin/Release/CommonControls/.NET4 示例/RyWeb.dll differ
diff --git a/Bin/Release/CommonControls/.NET4 示例/RyWeb.xml b/Bin/Release/CommonControls/.NET4 示例/RyWeb.xml
index c39c422..36dfc4a 100644
--- a/Bin/Release/CommonControls/.NET4 示例/RyWeb.xml
+++ b/Bin/Release/CommonControls/.NET4 示例/RyWeb.xml
@@ -9,6 +9,13 @@
Http连接操作帮助类
+
+
+
+
+
+
+
根据相传入的数据,得到相应页面数据
@@ -227,7 +234,11 @@
header对象
-
+
+
+ 获取或设置用于请求的 HTTP 版本。返回结果:用于请求的 HTTP 版本。默认为 System.Net.HttpVersion.Version11。
+
+
获取或设置一个 System.Boolean 值,该值确定是否使用 100-Continue 行为。如果 POST 请求需要 100-Continue 响应,则为 true;否则为 false。默认值为 true。
@@ -371,6 +382,11 @@
CookieCollection格式的Cookie集合同时也返回String类型的cookie
+
+
+
+
+
以post方式获取网页源码
@@ -422,6 +438,11 @@
+
+
+
+
+
获取网页源码
@@ -431,12 +452,13 @@
-
- 获取网页源码
-
-
-
-
+
+ 获取网页源码
+
+
+
+
+
@@ -445,6 +467,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
将相对网址转换成绝对网址
@@ -453,6 +493,16 @@
当前页面地址
转换后的绝对网址
+
+
+
+
+
+
+
+
+
+
url解密
@@ -473,7 +523,7 @@
Url加密
-
+
@@ -497,6 +547,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
url加密,Unicode
@@ -505,6 +573,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Html解码,将html里未转义成功的重新转义。
diff --git a/Bin/Release/CommonControls/.NET4 示例/ryControls.dll b/Bin/Release/CommonControls/.NET4 示例/ryControls.dll
index 07fda3b..1a16cd4 100644
Binary files a/Bin/Release/CommonControls/.NET4 示例/ryControls.dll and b/Bin/Release/CommonControls/.NET4 示例/ryControls.dll differ
diff --git a/Bin/Release/CommonControls/.NET4 示例/ryControls.xml b/Bin/Release/CommonControls/.NET4 示例/ryControls.xml
index fc15051..bdc5975 100644
--- a/Bin/Release/CommonControls/.NET4 示例/ryControls.xml
+++ b/Bin/Release/CommonControls/.NET4 示例/ryControls.xml
@@ -22410,13 +22410,16 @@
- 此渲染器是否将使用父ObjectListView中的自定义图像来绘制复选框图像。
+ Will this renderer use the custom images from the parent ObjectListView
+ to draw the checkbox images.
- 如果为true,则渲染器将使用StateImageList中的图像来表示复选框。0-未选中,1-选中,2-不确定。
+ If this is true, the renderer will use the images from the
+ StateImageList to represent checkboxes. 0 - unchecked, 1 - checked, 2 - indeterminate.
- 如果为False(默认值),则渲染器将使用.NET的标准CheckBoxRenender。
+ If this is false (the default), then the renderer will use .NET's standard
+ CheckBoxRenderer.
@@ -23401,7 +23404,7 @@
- 创建一个图像渲染器,该图像渲染器最多可以绘制指定的图像的maxImages次数。
+ Make an image renderer that will draw the indicated image, at most maxImages times.
@@ -23410,12 +23413,12 @@
- 应绘制的图像索引
+ The index of the image that should be drawn
- 应绘制的图像名称
+ The name of the image that should be drawn
@@ -23426,17 +23429,17 @@
- 此渲染器应绘制的最大图像数
+ What is the maximum number of images that this renderer should draw?
- 小于或等于此值的值将不绘制图像
+ Values less than or equal to this will have 0 images drawn
- 大于或等于该值的值将绘制MaxNumberImages图像
+ Values greater than or equal to this will have MaxNumberImages images drawn
@@ -23493,60 +23496,60 @@
-
- 文本是否应该使用GDI例程呈现?这使文本看起来更像本机列表视图控件。
-
+
+ Should text be rendered using GDI routines? This makes the text look more
+ like a native List view control.
+
- 获取或设置标题字体
+ Gets or set the font that will be used to draw the title of the task
If this is null, the ListView's font will be used
- 返回已为标题设置的字体或默认值
+ Return a font that has been set for the title or a reasonable default
- 获取或设置任务标题(Title)的颜色
+ Gets or set the color of the title of the task
- 当任务未被选中或列表视图具有半透明选择机制时,将使用此颜色。
-
+ This color is used when the task is not selected or when the listview
+ has a translucent selection mechanism.
- 返回任务标题的颜色或默认值
+ Return the color of the title of the task or a reasonable default
- 获取或设置任务描述(Description)的字体
+ Gets or set the font that will be used to draw the description of the task
- 如果为null,则使用listview的字体
+ If this is null, the ListView's font will be used
-
- 返回已为Description设置的字体或默认值
-
+
+ Return a font that has been set for the title or a reasonable default
+
-
- 获取或设置任务描述(Description)的颜色
-
-
- 当任务未被选中或列表视图具有半透明选择机制时,将使用此颜色。
-
+
+ Gets or set the color of the description of the task
+
+ This color is used when the task is not selected or when the listview
+ has a translucent selection mechanism.
- 返回任务描述(Description)的颜色或默认值
+ Return the color of the description of the task or a reasonable default
- 获取或设置图片和文字之间的距离
+ Gets or sets the number of pixels that will be left between the image and the text
@@ -23555,13 +23558,13 @@
-
- 获取或设置标题(Title)和描述(Description)之间的距离(单位:像素)
-
+
+ Gets or sets the number of pixels that will be left between the title and the description
+
-
- 获取或设置跟Description挂钩的模型对象名称
+
+ Gets or sets the name of the aspect of the model object that contains the task description
@@ -23618,42 +23621,67 @@
- 此渲染器在其单元格中绘制一个功能按钮
+ This renderer draws a functioning button in its cell
- 获取或设置按钮的大小模式
+ Gets or sets how each button will be sized
- 获取或设置SizingMode为FixedBound时按钮的大小
+ Gets or sets the size of the button when the SizingMode is FixedBounds
- 如果未设置,将使用单元格的边界
+ If this is not set, the bounds of the cell will be used
-
- 获取或设置当SizingMode为TextBound时单元格周围的额外空间
-
+
+ Gets or sets the extra space that surrounds the cell when the SizingMode is TextBounds
+
- 获取或设置按钮可以占用的最大宽度
- -1 表示不限制宽度
+ Gets or sets the maximum width that a button can occupy.
+ -1 means there is no maximum width.
- 仅当SizingMode为TextBound时才会生效
+ This is only considered when the SizingMode is TextBounds
- 获取或设置按钮可以占用的最小宽度。
- -1 表示不限制宽度
+ Gets or sets the minimum width that a button can occupy.
+ -1 means there is no minimum width.
- 仅当SizingMode为TextBound时才会生效
+ This is only considered when the SizingMode is TextBounds
+
+
+
+ 获取或设置此列按钮的字体颜色(如果有按钮的话)
+
+
+
+
+ 获取或设置此列按钮的背景颜色(如果有按钮的话)
+
+
+
+
+ 获取或设置此列按钮的边框颜色(如果有按钮的话)
+
+
+
+
+ 获取或设置此列按钮的内边框颜色(如果有按钮的话)
+
+
+
+
+ 获取或设置此列按钮是否画边框(如果有按钮的话)
+
- 计算内容的大小
+ Calculate the size of the contents
@@ -23661,7 +23689,7 @@
- 画按钮
+ Draw the button
@@ -23678,13 +23706,13 @@
- 按钮的状态
+ What is the state of the button?
- 鼠标是否在按钮上
+ Is the mouse over the button?
@@ -23884,6 +23912,58 @@
+
+
+ 正常为选中按钮
+
+
+
+
+ 获得焦点的按钮
+
+
+
+
+ 鼠标经过样式
+
+
+
+
+ 获得焦点并鼠标经过
+
+
+
+
+ 自定义GDI工具,绘制按钮
+
+
+
+
+ 绘制圆形按钮(用法同矩形按钮)
+
+
+
+
+
+
+
+
+
+ 绘制圆角按钮
+
+ 要绘制的文字
+ Graphics 对象
+ 要填充的矩形
+
+
+
+
+ 根据普通矩形得到圆角矩形的路径
+
+ 原始矩形
+ 半径
+ 图形路径
+
A GlassPanelForm sits transparently over an ObjectListView to show overlays.
diff --git a/Bin/Release/CommonControls/.NET4 示例/ryUpdate.dll b/Bin/Release/CommonControls/.NET4 示例/ryUpdate.dll
index b6d2062..5834986 100644
Binary files a/Bin/Release/CommonControls/.NET4 示例/ryUpdate.dll and b/Bin/Release/CommonControls/.NET4 示例/ryUpdate.dll differ
diff --git a/Bin/Release/CommonControls/.NET4 示例/ryUpdate.xml b/Bin/Release/CommonControls/.NET4 示例/ryUpdate.xml
index 1b1af7d..72b168c 100644
--- a/Bin/Release/CommonControls/.NET4 示例/ryUpdate.xml
+++ b/Bin/Release/CommonControls/.NET4 示例/ryUpdate.xml
@@ -4,11 +4,21 @@
ryUpdate
+
+
+
+
+
升级地址
+
+
+
+
+
隔多久后再次检查更新
@@ -34,6 +44,21 @@
当前安装的数据库版本
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
获取当前更新的类型
@@ -44,17 +69,57 @@
每隔n小时检测一次更新
+
+
+ 读取版本信息完成后激发
+
+
+
+
+ 没有版本更新时激发
+
+
+
+
+ 发现新版本时激发
+
+
+
+
+ 发生错误后激发
+
+
+
+
+ 更新进度变化后激发
+
+
开始检测新版本
+
+
+
+
+
初始化升级函数
为null,则表示事件运行在多线程模式下,否则,事件是在窗体所在线程下
+
+
+
+
+
+
+
+
+
+
获取版本信息
@@ -80,16 +145,80 @@
结束下载
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
当前登陆用户
+
+
+
+
+
+
+
+ 没有版本更新时激发
+
+
+
+
+
+
+
+
取消更新。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
设置升级
@@ -100,6 +229,19 @@
是否是在线更新
+
+
+
+
+
+
+
+
+
+
+
+
+
Required designer variable.
@@ -117,6 +259,73 @@
the contents of this method with the code editor.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提示文本
+
+
+
+
+ 更新日期
+
+
+
+
+ 更新版本
+
+
+
+
+ 更新描述
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Required designer variable.
@@ -134,6 +343,11 @@
the contents of this method with the code editor.
+
+
+
+
+
更新类型,soft或者data
@@ -174,5 +388,102 @@
升级程序要使用的设置xml
+
+
+
+
+
+
+
+ 错误字符串
+
+
+
+
+ 错误id
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 一个强类型的资源类,用于查找本地化的字符串等。
+
+
+
+
+ 返回此类使用的缓存的 ResourceManager 实例。
+
+
+
+
+ 重写当前线程的 CurrentUICulture 属性,对
+ 使用此强类型资源类的所有资源查找执行重写。
+
+
diff --git a/Bin/Release/CommonControls/.NET4/MyDb.dll b/Bin/Release/CommonControls/.NET4/MyDb.dll
index aa6874e..9e3a194 100644
Binary files a/Bin/Release/CommonControls/.NET4/MyDb.dll and b/Bin/Release/CommonControls/.NET4/MyDb.dll differ
diff --git a/Bin/Release/CommonControls/.NET4/MyDb.xml b/Bin/Release/CommonControls/.NET4/MyDb.xml
index a2f065f..d0448da 100644
--- a/Bin/Release/CommonControls/.NET4/MyDb.xml
+++ b/Bin/Release/CommonControls/.NET4/MyDb.xml
@@ -1411,7 +1411,6 @@
获取hosts并转换hosts内容
- hosts内容
@@ -1588,6 +1587,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
删除单个文件。
@@ -1764,6 +1838,7 @@
+
@@ -1812,12 +1887,14 @@
追加日志
+
追加文件
+
@@ -2030,6 +2107,188 @@
+
+
+ 对鼠标或键盘的自动化操作
+
+
+
+
+ 鼠标左键
+
+
+
+
+ 鼠标中键
+
+
+
+
+ 鼠标右键
+
+
+
+
+ 模拟键盘按键
+
+
+
+ 按下还是抬起
+
+
+
+ 鼠标滚轮
+
+
+
+
+
+
+
+ 鼠标移动
+
+
+
+
+
+
+
+ 自定义鼠标按下或抬起
+
+
+
+
+
+
+
+
+ 左键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标x(句柄内的坐标,非屏幕坐标)
+ 坐标y(句柄内的坐标,非屏幕坐标)
+
+
+
+ 左键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标(句柄内的坐标,非屏幕坐标)
+
+
+
+ 右键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标x(句柄内的坐标,非屏幕坐标)
+ 坐标y(句柄内的坐标,非屏幕坐标)
+
+
+
+ 右键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标(句柄内的坐标,非屏幕坐标)
+
+
+
+ 中键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标x(句柄内的坐标,非屏幕坐标)
+ 坐标y(句柄内的坐标,非屏幕坐标)
+
+
+
+ 中键单击鼠标(支持后台单击)
+
+ 指定要发送单击命令的句柄
+ 坐标(句柄内的坐标,非屏幕坐标)
+
+
+
+ 左键单击鼠标(不支持后台单击)
+
+ 坐标x(屏幕坐标)
+ 坐标y(屏幕坐标)
+
+
+
+ 左键单击鼠标(不支持后台单击)
+
+ 坐标(屏幕坐标)
+
+
+
+ 右键单击鼠标(不支持后台单击)
+
+ 坐标x(屏幕坐标)
+ 坐标y(屏幕坐标)
+
+
+
+ 右键单击鼠标(不支持后台单击)
+
+ 坐标(屏幕坐标)
+
+
+
+ 中键单击鼠标(不支持后台单击)
+
+ 坐标x(屏幕坐标)
+ 坐标y(屏幕坐标)
+
+
+
+ 中键单击鼠标(不支持后台单击)
+
+ 坐标(屏幕坐标)
+
+
+
+ 粘贴文本
+
+
+
+
+
+ 获取指定句柄的大小及位置
+
+
+
+
+
+
+
+ 设置指定句柄的大小
+
+
+
+
+
+
+ 判断鼠标位置是不是在指定的矩形中
+
+
+
+
+
+
+
+ 判断2张图是否相似度超90
+
+
+
+
+
+
+
+ /获取2种颜色的相似度,范围为0~100
+
+
+
+
+
新模态窗体
@@ -2503,6 +2762,48 @@
7000 表示IE7兼容视图模式;8000 表示IE8 标准模式 ;8888 表示IE8 强制标准模式,在渲染失败的情况下不尝试用兼容视图模式
+
+
+ 设置文件关联
+
+ 扩展名(如.apk)
+ 映射的扩展名(如apkfile)
+ app名称(建议用英文数字)
+ 文件关联描述
+ 文件路径
+
+
+
+ 设置文件关联
+
+ 映射的扩展名(如apkfile)
+ app名称(建议用英文数字)
+ 文件关联描述
+ 文件路径
+
+
+
+ 在指定文件格式右键菜单中增加菜单
+
+ 扩展名(如.apk)
+ app名称(建议用英文数字)
+ 文件关联描述
+ 文件路径
+
+
+
+ 删除文件关联
+
+ 映射的扩展名(如apkfile)
+ app名称(建议用英文数字)
+
+
+
+ 获取文件关联是否存在
+
+ 映射的扩展名(如apkfile)
+ app名称(建议用英文数字)
+
采用的IE模式
@@ -2686,6 +2987,16 @@
高级拖放事件
+
+
+
+
+
+
+
+
+
+
@@ -3733,6 +4044,7 @@
获取HmacSHA256
+
@@ -4860,5 +5172,380 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /
+
+
+
+
+ /
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 模拟鼠标点击
+
+
+
+
+
+
+
+
+
+
+ 模拟按键
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The GetParent function retrieves a handle to the specified window's parent or owner.
+
+ Handle to the window whose parent window handle is to be retrieved.
+ If the window is a child window, the return value is a handle to the parent window. If the window is a top-level window, the return value is a handle to the owner window. If the window is a top-level unowned window or if the function fails, the return value is NULL.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The FindWindowEx function retrieves a handle to a window whose class name and window name match the specified strings. The function searches child windows, beginning with the one following the specified child window.
+
+ Handle to the parent window whose child windows are to be searched.
+ Handle to a child window.
+ Specifies class name.
+ Pointer to a null-terminated string that specifies the window name (the window's title).
+ If the function succeeds, the return value is a handle to the window that has the specified class and window names.If the function fails, the return value is NULL.
+
+
+
+ The InvalidateRect function adds a rectangle to the specified window's update region.
+
+ Handle to window.
+ Rectangle coordinates.
+ Erase state.
+ If the function succeeds, the return value is true.If the function fails, the return value is false.
+
+
+
+ The ValidateRect function validates the client area within a rectangle by removing the rectangle from the update region of the specified window.
+
+ Handle to window.
+ Validation rectangle coordinates.
+ If the function succeeds, the return value is true.If the function fails, the return value is false.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Changes the size, position, and Z order of a child, pop-up, or top-level window.
+ These windows are ordered according to their appearance on the screen.
+ The topmost window receives the highest rank and is the first window in the Z order.
+
+ A handle to the window.
+ A handle to the window to precede the positioned window in the Z order. This parameter must be a window handle or one of the following values.
+ Specifies the new position of the left side of the window, in client coordinates.
+ Specifies the new position of the top of the window, in client coordinates.
+ Specifies the new width of the window, in pixels.
+ Specifies the new height of the window, in pixels.
+ Specifies the window sizing and positioning flags. This parameter can be a combination of the following values.
+ If the function succeeds, the return value is nonzero, if the function fails, the return value is zero.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Bin/Release/CommonControls/.NET4/MyDb_MSSQL.dll b/Bin/Release/CommonControls/.NET4/MyDb_MSSQL.dll
index a6d9f2e..8b9c804 100644
Binary files a/Bin/Release/CommonControls/.NET4/MyDb_MSSQL.dll and b/Bin/Release/CommonControls/.NET4/MyDb_MSSQL.dll differ
diff --git a/Bin/Release/CommonControls/.NET4/MyDb_MSSQL.xml b/Bin/Release/CommonControls/.NET4/MyDb_MSSQL.xml
index 4caebf1..2602e60 100644
--- a/Bin/Release/CommonControls/.NET4/MyDb_MSSQL.xml
+++ b/Bin/Release/CommonControls/.NET4/MyDb_MSSQL.xml
@@ -4,6 +4,39 @@
MyDb_MSSQL
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
连接数据库
@@ -20,6 +53,11 @@
用户id
用户密码
+
+
+
+
+
连接数据库
@@ -111,5 +149,200 @@
SQL语句
运行失败,则返回-1;存在结果,返回1;不存在结果,返回0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Bin/Release/CommonControls/.NET4/MyDb_MySQL.dll b/Bin/Release/CommonControls/.NET4/MyDb_MySQL.dll
index 8c7580f..12727d9 100644
Binary files a/Bin/Release/CommonControls/.NET4/MyDb_MySQL.dll and b/Bin/Release/CommonControls/.NET4/MyDb_MySQL.dll differ
diff --git a/Bin/Release/CommonControls/.NET4/MyDb_MySQL.xml b/Bin/Release/CommonControls/.NET4/MyDb_MySQL.xml
index 98e78b3..e4b678d 100644
--- a/Bin/Release/CommonControls/.NET4/MyDb_MySQL.xml
+++ b/Bin/Release/CommonControls/.NET4/MyDb_MySQL.xml
@@ -4,6 +4,39 @@
MyDb_MySQL
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
连接数据库
@@ -20,6 +53,11 @@
用户id
用户密码
+
+
+
+
+
连接数据库
@@ -111,5 +149,200 @@
SQL语句
运行失败,则返回-1;存在结果,返回1;不存在结果,返回0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Bin/Release/CommonControls/.NET4/MyDb_SQLite.dll b/Bin/Release/CommonControls/.NET4/MyDb_SQLite.dll
index 4f951c5..4e0df6a 100644
Binary files a/Bin/Release/CommonControls/.NET4/MyDb_SQLite.dll and b/Bin/Release/CommonControls/.NET4/MyDb_SQLite.dll differ
diff --git a/Bin/Release/CommonControls/.NET4/MyDb_SQLite.xml b/Bin/Release/CommonControls/.NET4/MyDb_SQLite.xml
index 076748e..70ccea6 100644
--- a/Bin/Release/CommonControls/.NET4/MyDb_SQLite.xml
+++ b/Bin/Release/CommonControls/.NET4/MyDb_SQLite.xml
@@ -4,6 +4,21 @@
MyDb_SQLite
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -19,6 +34,21 @@
数据库路径
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
连接数据库
@@ -37,6 +67,12 @@
+
+
+
+
+
+
连接或创建数据库,如果数据库不存在,就创建,否则连接
@@ -172,5 +208,200 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Bin/Release/CommonControls/.NET4/RyPrint.dll b/Bin/Release/CommonControls/.NET4/RyPrint.dll
index 37b6a2c..34cc36c 100644
Binary files a/Bin/Release/CommonControls/.NET4/RyPrint.dll and b/Bin/Release/CommonControls/.NET4/RyPrint.dll differ
diff --git a/Bin/Release/CommonControls/.NET4/RyWeb.dll b/Bin/Release/CommonControls/.NET4/RyWeb.dll
index 525b2a5..1130d1f 100644
Binary files a/Bin/Release/CommonControls/.NET4/RyWeb.dll and b/Bin/Release/CommonControls/.NET4/RyWeb.dll differ
diff --git a/Bin/Release/CommonControls/.NET4/RyWeb.xml b/Bin/Release/CommonControls/.NET4/RyWeb.xml
index c39c422..36dfc4a 100644
--- a/Bin/Release/CommonControls/.NET4/RyWeb.xml
+++ b/Bin/Release/CommonControls/.NET4/RyWeb.xml
@@ -9,6 +9,13 @@
Http连接操作帮助类
+
+
+
+
+
+
+
根据相传入的数据,得到相应页面数据
@@ -227,7 +234,11 @@
header对象
-
+
+
+ 获取或设置用于请求的 HTTP 版本。返回结果:用于请求的 HTTP 版本。默认为 System.Net.HttpVersion.Version11。
+
+
获取或设置一个 System.Boolean 值,该值确定是否使用 100-Continue 行为。如果 POST 请求需要 100-Continue 响应,则为 true;否则为 false。默认值为 true。
@@ -371,6 +382,11 @@
CookieCollection格式的Cookie集合同时也返回String类型的cookie
+
+
+
+
+
以post方式获取网页源码
@@ -422,6 +438,11 @@
+
+
+
+
+
获取网页源码
@@ -431,12 +452,13 @@
-
- 获取网页源码
-
-
-
-
+
+ 获取网页源码
+
+
+
+
+
@@ -445,6 +467,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
将相对网址转换成绝对网址
@@ -453,6 +493,16 @@
当前页面地址
转换后的绝对网址
+
+
+
+
+
+
+
+
+
+
url解密
@@ -473,7 +523,7 @@
Url加密
-
+
@@ -497,6 +547,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
url加密,Unicode
@@ -505,6 +573,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Html解码,将html里未转义成功的重新转义。
diff --git a/Bin/Release/CommonControls/.NET4/ryControls.dll b/Bin/Release/CommonControls/.NET4/ryControls.dll
index 07fda3b..1a16cd4 100644
Binary files a/Bin/Release/CommonControls/.NET4/ryControls.dll and b/Bin/Release/CommonControls/.NET4/ryControls.dll differ
diff --git a/Bin/Release/CommonControls/.NET4/ryControls.xml b/Bin/Release/CommonControls/.NET4/ryControls.xml
index fc15051..bdc5975 100644
--- a/Bin/Release/CommonControls/.NET4/ryControls.xml
+++ b/Bin/Release/CommonControls/.NET4/ryControls.xml
@@ -22410,13 +22410,16 @@
- 此渲染器是否将使用父ObjectListView中的自定义图像来绘制复选框图像。
+ Will this renderer use the custom images from the parent ObjectListView
+ to draw the checkbox images.
- 如果为true,则渲染器将使用StateImageList中的图像来表示复选框。0-未选中,1-选中,2-不确定。
+ If this is true, the renderer will use the images from the
+ StateImageList to represent checkboxes. 0 - unchecked, 1 - checked, 2 - indeterminate.
- 如果为False(默认值),则渲染器将使用.NET的标准CheckBoxRenender。
+ If this is false (the default), then the renderer will use .NET's standard
+ CheckBoxRenderer.
@@ -23401,7 +23404,7 @@
- 创建一个图像渲染器,该图像渲染器最多可以绘制指定的图像的maxImages次数。
+ Make an image renderer that will draw the indicated image, at most maxImages times.
@@ -23410,12 +23413,12 @@
- 应绘制的图像索引
+ The index of the image that should be drawn
- 应绘制的图像名称
+ The name of the image that should be drawn
@@ -23426,17 +23429,17 @@
- 此渲染器应绘制的最大图像数
+ What is the maximum number of images that this renderer should draw?
- 小于或等于此值的值将不绘制图像
+ Values less than or equal to this will have 0 images drawn
- 大于或等于该值的值将绘制MaxNumberImages图像
+ Values greater than or equal to this will have MaxNumberImages images drawn
@@ -23493,60 +23496,60 @@
-
- 文本是否应该使用GDI例程呈现?这使文本看起来更像本机列表视图控件。
-
+
+ Should text be rendered using GDI routines? This makes the text look more
+ like a native List view control.
+
- 获取或设置标题字体
+ Gets or set the font that will be used to draw the title of the task
If this is null, the ListView's font will be used
- 返回已为标题设置的字体或默认值
+ Return a font that has been set for the title or a reasonable default
- 获取或设置任务标题(Title)的颜色
+ Gets or set the color of the title of the task
- 当任务未被选中或列表视图具有半透明选择机制时,将使用此颜色。
-
+ This color is used when the task is not selected or when the listview
+ has a translucent selection mechanism.
- 返回任务标题的颜色或默认值
+ Return the color of the title of the task or a reasonable default
- 获取或设置任务描述(Description)的字体
+ Gets or set the font that will be used to draw the description of the task
- 如果为null,则使用listview的字体
+ If this is null, the ListView's font will be used
-
- 返回已为Description设置的字体或默认值
-
+
+ Return a font that has been set for the title or a reasonable default
+
-
- 获取或设置任务描述(Description)的颜色
-
-
- 当任务未被选中或列表视图具有半透明选择机制时,将使用此颜色。
-
+
+ Gets or set the color of the description of the task
+
+ This color is used when the task is not selected or when the listview
+ has a translucent selection mechanism.
- 返回任务描述(Description)的颜色或默认值
+ Return the color of the description of the task or a reasonable default
- 获取或设置图片和文字之间的距离
+ Gets or sets the number of pixels that will be left between the image and the text
@@ -23555,13 +23558,13 @@
-
- 获取或设置标题(Title)和描述(Description)之间的距离(单位:像素)
-
+
+ Gets or sets the number of pixels that will be left between the title and the description
+
-
- 获取或设置跟Description挂钩的模型对象名称
+
+ Gets or sets the name of the aspect of the model object that contains the task description
@@ -23618,42 +23621,67 @@
- 此渲染器在其单元格中绘制一个功能按钮
+ This renderer draws a functioning button in its cell
- 获取或设置按钮的大小模式
+ Gets or sets how each button will be sized
- 获取或设置SizingMode为FixedBound时按钮的大小
+ Gets or sets the size of the button when the SizingMode is FixedBounds
- 如果未设置,将使用单元格的边界
+ If this is not set, the bounds of the cell will be used
-
- 获取或设置当SizingMode为TextBound时单元格周围的额外空间
-
+
+ Gets or sets the extra space that surrounds the cell when the SizingMode is TextBounds
+
- 获取或设置按钮可以占用的最大宽度
- -1 表示不限制宽度
+ Gets or sets the maximum width that a button can occupy.
+ -1 means there is no maximum width.
- 仅当SizingMode为TextBound时才会生效
+ This is only considered when the SizingMode is TextBounds
- 获取或设置按钮可以占用的最小宽度。
- -1 表示不限制宽度
+ Gets or sets the minimum width that a button can occupy.
+ -1 means there is no minimum width.
- 仅当SizingMode为TextBound时才会生效
+ This is only considered when the SizingMode is TextBounds
+
+
+
+ 获取或设置此列按钮的字体颜色(如果有按钮的话)
+
+
+
+
+ 获取或设置此列按钮的背景颜色(如果有按钮的话)
+
+
+
+
+ 获取或设置此列按钮的边框颜色(如果有按钮的话)
+
+
+
+
+ 获取或设置此列按钮的内边框颜色(如果有按钮的话)
+
+
+
+
+ 获取或设置此列按钮是否画边框(如果有按钮的话)
+
- 计算内容的大小
+ Calculate the size of the contents
@@ -23661,7 +23689,7 @@
- 画按钮
+ Draw the button
@@ -23678,13 +23706,13 @@
- 按钮的状态
+ What is the state of the button?
- 鼠标是否在按钮上
+ Is the mouse over the button?
@@ -23884,6 +23912,58 @@
+
+
+ 正常为选中按钮
+
+
+
+
+ 获得焦点的按钮
+
+
+
+
+ 鼠标经过样式
+
+
+
+
+ 获得焦点并鼠标经过
+
+
+
+
+ 自定义GDI工具,绘制按钮
+
+
+
+
+ 绘制圆形按钮(用法同矩形按钮)
+
+
+
+
+
+
+
+
+
+ 绘制圆角按钮
+
+ 要绘制的文字
+ Graphics 对象
+ 要填充的矩形
+
+
+
+
+ 根据普通矩形得到圆角矩形的路径
+
+ 原始矩形
+ 半径
+ 图形路径
+
A GlassPanelForm sits transparently over an ObjectListView to show overlays.
diff --git a/Bin/Release/CommonControls/.NET4/ryUpdate.dll b/Bin/Release/CommonControls/.NET4/ryUpdate.dll
index b6d2062..5834986 100644
Binary files a/Bin/Release/CommonControls/.NET4/ryUpdate.dll and b/Bin/Release/CommonControls/.NET4/ryUpdate.dll differ
diff --git a/Bin/Release/CommonControls/.NET4/ryUpdate.xml b/Bin/Release/CommonControls/.NET4/ryUpdate.xml
index 1b1af7d..72b168c 100644
--- a/Bin/Release/CommonControls/.NET4/ryUpdate.xml
+++ b/Bin/Release/CommonControls/.NET4/ryUpdate.xml
@@ -4,11 +4,21 @@
ryUpdate
+
+
+
+
+
升级地址
+
+
+
+
+
隔多久后再次检查更新
@@ -34,6 +44,21 @@
当前安装的数据库版本
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
获取当前更新的类型
@@ -44,17 +69,57 @@
每隔n小时检测一次更新
+
+
+ 读取版本信息完成后激发
+
+
+
+
+ 没有版本更新时激发
+
+
+
+
+ 发现新版本时激发
+
+
+
+
+ 发生错误后激发
+
+
+
+
+ 更新进度变化后激发
+
+
开始检测新版本
+
+
+
+
+
初始化升级函数
为null,则表示事件运行在多线程模式下,否则,事件是在窗体所在线程下
+
+
+
+
+
+
+
+
+
+
获取版本信息
@@ -80,16 +145,80 @@
结束下载
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
当前登陆用户
+
+
+
+
+
+
+
+ 没有版本更新时激发
+
+
+
+
+
+
+
+
取消更新。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
设置升级
@@ -100,6 +229,19 @@
是否是在线更新
+
+
+
+
+
+
+
+
+
+
+
+
+
Required designer variable.
@@ -117,6 +259,73 @@
the contents of this method with the code editor.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提示文本
+
+
+
+
+ 更新日期
+
+
+
+
+ 更新版本
+
+
+
+
+ 更新描述
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Required designer variable.
@@ -134,6 +343,11 @@
the contents of this method with the code editor.
+
+
+
+
+
更新类型,soft或者data
@@ -174,5 +388,102 @@
升级程序要使用的设置xml
+
+
+
+
+
+
+
+ 错误字符串
+
+
+
+
+ 错误id
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 一个强类型的资源类,用于查找本地化的字符串等。
+
+
+
+
+ 返回此类使用的缓存的 ResourceManager 实例。
+
+
+
+
+ 重写当前线程的 CurrentUICulture 属性,对
+ 使用此强类型资源类的所有资源查找执行重写。
+
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e7d4b56..bc31a23 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,10 @@
-### 2021-01-23 dev更新
+### 2021-02-11更新
+------
+#### MyDb V2.1.2102.1101
+- *.[新增]新增Auto类,增加 鼠标模拟操作和按键模拟操作。
+- *.[新增]新增WinAPI命名空间,将windows自带的API集中在这个命名空间。
+
+### 2021-01-23 dev更新
------
#### ryUpdate V2.2.2101.2301
diff --git a/Source/.vs/公用控件组V4/v16/.suo b/Source/.vs/公用控件组V4/v16/.suo
index ba0d57b..298fd28 100644
Binary files a/Source/.vs/公用控件组V4/v16/.suo and b/Source/.vs/公用控件组V4/v16/.suo differ
diff --git a/Source/Itrycn_Project2/DbOp/FrmAdd.Designer.cs b/Source/Itrycn_Project2/DbOp/FrmAdd.Designer.cs
index a156e7b..99bb339 100644
--- a/Source/Itrycn_Project2/DbOp/FrmAdd.Designer.cs
+++ b/Source/Itrycn_Project2/DbOp/FrmAdd.Designer.cs
@@ -28,78 +28,86 @@
///
private void InitializeComponent()
{
- this.btnCancel = new ryControls.ButtonEx();
- this.btnOK = new ryControls.ButtonEx();
- this.label1 = new System.Windows.Forms.Label();
- this.txtName = new ryControls.TextBoxEx2();
- this.SuspendLayout();
- //
- // btnCancel
- //
- this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.btnCancel.ForeColor = System.Drawing.Color.White;
- this.btnCancel.Location = new System.Drawing.Point(363, 310);
- this.btnCancel.Name = "btnCancel";
- this.btnCancel.Size = new System.Drawing.Size(65, 27);
- this.btnCancel.TabIndex = 5;
- this.btnCancel.Text = "取消";
- this.btnCancel.UseVisualStyleBackColor = true;
- this.btnCancel.Click += new System.EventHandler(this.BtnCancel_Click);
- //
- // btnOK
- //
- this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.btnOK.ForeColor = System.Drawing.Color.White;
- this.btnOK.Location = new System.Drawing.Point(292, 310);
- this.btnOK.Name = "btnOK";
- this.btnOK.Size = new System.Drawing.Size(65, 27);
- this.btnOK.TabIndex = 4;
- this.btnOK.Text = "确定";
- this.btnOK.UseVisualStyleBackColor = true;
- this.btnOK.Click += new System.EventHandler(this.BtnOK_Click);
- //
- // label1
- //
- this.label1.AutoSize = true;
- this.label1.Location = new System.Drawing.Point(8, 20);
- this.label1.Name = "label1";
- this.label1.Size = new System.Drawing.Size(29, 12);
- this.label1.TabIndex = 7;
- this.label1.Text = "名称";
- //
- // txtName
- //
- this.txtName.BackColor = System.Drawing.Color.White;
- this.txtName.Location = new System.Drawing.Point(55, 12);
- this.txtName.Name = "txtName";
- this.txtName.PasswordChar = '\0';
- this.txtName.ReadOnly = false;
- this.txtName.SelectionLength = 0;
- this.txtName.SelectionStart = 0;
- this.txtName.Size = new System.Drawing.Size(372, 25);
- this.txtName.TabIndex = 6;
- //
- // frmAdd
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(438, 347);
- this.Controls.Add(this.label1);
- this.Controls.Add(this.txtName);
- this.Controls.Add(this.btnCancel);
- this.Controls.Add(this.btnOK);
- this.Name = "frmAdd";
- this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
- this.Text = "新增";
- this.ResumeLayout(false);
- this.PerformLayout();
-
+ this.BtnCancel = new ryControls.ButtonEx();
+ this.BtnOK = new ryControls.ButtonEx();
+ this.label1 = new System.Windows.Forms.Label();
+ this.txtName = new ryControls.TextBoxEx2();
+ this.SuspendLayout();
+ //
+ // BtnCancel
+ //
+ this.BtnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.BtnCancel.BaseColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(76)))), ((int)(((byte)(95)))));
+ this.BtnCancel.Location = new System.Drawing.Point(363, 310);
+ this.BtnCancel.Name = "BtnCancel";
+ this.BtnCancel.Size = new System.Drawing.Size(65, 27);
+ this.BtnCancel.TabIndex = 5;
+ this.BtnCancel.Text = "取消";
+ this.BtnCancel.UseVisualStyleBackColor = true;
+ this.BtnCancel.Click += new System.EventHandler(this.BtnCancel_Click);
+ //
+ // BtnOK
+ //
+ this.BtnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.BtnOK.BaseColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(76)))), ((int)(((byte)(95)))));
+ this.BtnOK.Location = new System.Drawing.Point(292, 310);
+ this.BtnOK.Name = "BtnOK";
+ this.BtnOK.Size = new System.Drawing.Size(65, 27);
+ this.BtnOK.TabIndex = 4;
+ this.BtnOK.Text = "确定";
+ this.BtnOK.UseVisualStyleBackColor = true;
+ this.BtnOK.Click += new System.EventHandler(this.BtnOK_Click);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(8, 20);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(29, 12);
+ this.label1.TabIndex = 7;
+ this.label1.Text = "名称";
+ //
+ // txtName
+ //
+ this.txtName.BackColor = System.Drawing.Color.White;
+ this.txtName.EmptyText = "";
+ this.txtName.Location = new System.Drawing.Point(55, 12);
+ this.txtName.MaxLength = 999999999;
+ this.txtName.Multiline = false;
+ this.txtName.Name = "txtName";
+ this.txtName.OnlyNumeric = false;
+ this.txtName.PasswordChar = '\0';
+ this.txtName.ReadOnly = false;
+ this.txtName.SelectedText = "";
+ this.txtName.SelectionLength = 0;
+ this.txtName.SelectionStart = 0;
+ this.txtName.Size = new System.Drawing.Size(372, 25);
+ this.txtName.TabIndex = 6;
+ this.txtName.TextAlign = System.Windows.Forms.HorizontalAlignment.Left;
+ this.txtName.ToolTip = "";
+ this.txtName.WordWrap = true;
+ //
+ // FrmAdd
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(438, 347);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.txtName);
+ this.Controls.Add(this.BtnCancel);
+ this.Controls.Add(this.BtnOK);
+ this.Name = "FrmAdd";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "新增";
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
}
#endregion
- private ryControls.ButtonEx btnCancel;
- private ryControls.ButtonEx btnOK;
+ private ryControls.ButtonEx BtnCancel;
+ private ryControls.ButtonEx BtnOK;
private System.Windows.Forms.Label label1;
private ryControls.TextBoxEx2 txtName;
}
diff --git a/Source/Itrycn_Project2/DbOp/FrmAdd.resx b/Source/Itrycn_Project2/DbOp/FrmAdd.resx
index 1af7de1..29dcb1b 100644
--- a/Source/Itrycn_Project2/DbOp/FrmAdd.resx
+++ b/Source/Itrycn_Project2/DbOp/FrmAdd.resx
@@ -1,120 +1,120 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
\ No newline at end of file
diff --git a/Source/Itrycn_Project2/FrmStart.Designer.cs b/Source/Itrycn_Project2/FrmStart.Designer.cs
index 448f499..e8c963b 100644
--- a/Source/Itrycn_Project2/FrmStart.Designer.cs
+++ b/Source/Itrycn_Project2/FrmStart.Designer.cs
@@ -55,8 +55,10 @@
this.捐助ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.chromeTabControl1 = new ryControls.ChromeTabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
+ this.button2 = new System.Windows.Forms.Button();
+ this.button1 = new System.Windows.Forms.Button();
this.iconViewEx1 = new ryControls.IconViewEx();
- this.hotkeyTextBox1 = new ryControls.HotkeyTextBox();
+ this.textBox1 = new System.Windows.Forms.TextBox();
this.MenuTray.SuspendLayout();
this.menuStrip1.SuspendLayout();
this.chromeTabControl1.SuspendLayout();
@@ -147,7 +149,9 @@
//
// tabPage1
//
- this.tabPage1.Controls.Add(this.hotkeyTextBox1);
+ this.tabPage1.Controls.Add(this.textBox1);
+ this.tabPage1.Controls.Add(this.button2);
+ this.tabPage1.Controls.Add(this.button1);
this.tabPage1.Controls.Add(this.iconViewEx1);
this.tabPage1.Location = new System.Drawing.Point(1, 29);
this.tabPage1.Name = "tabPage1";
@@ -157,8 +161,29 @@
this.tabPage1.Text = "首页";
this.tabPage1.UseVisualStyleBackColor = true;
//
+ // button2
+ //
+ this.button2.Location = new System.Drawing.Point(276, 31);
+ this.button2.Name = "button2";
+ this.button2.Size = new System.Drawing.Size(112, 38);
+ this.button2.TabIndex = 2;
+ this.button2.Text = "button2";
+ this.button2.UseVisualStyleBackColor = true;
+ this.button2.Click += new System.EventHandler(this.button2_Click);
+ //
+ // button1
+ //
+ this.button1.Location = new System.Drawing.Point(49, 31);
+ this.button1.Name = "button1";
+ this.button1.Size = new System.Drawing.Size(112, 38);
+ this.button1.TabIndex = 1;
+ this.button1.Text = "button1";
+ this.button1.UseVisualStyleBackColor = true;
+ this.button1.Click += new System.EventHandler(this.button1_Click);
+ //
// iconViewEx1
//
+ this.iconViewEx1.BadgeListImage = ((System.Collections.Generic.List)(resources.GetObject("iconViewEx1.BadgeListImage")));
this.iconViewEx1.HideSelection = false;
this.iconViewEx1.Icon = ((System.Drawing.Image)(resources.GetObject("iconViewEx1.Icon")));
this.iconViewEx1.IconSize = 64;
@@ -184,6 +209,7 @@
this.iconViewEx1.OwnerDraw = true;
this.iconViewEx1.SelectedBorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(229)))), ((int)(((byte)(195)))), ((int)(((byte)(101)))));
this.iconViewEx1.SelectedEndBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(236)))), ((int)(((byte)(181)))));
+ this.iconViewEx1.SelectedForeColor = System.Drawing.Color.Black;
this.iconViewEx1.SelectedStartBackColor = System.Drawing.Color.LightYellow;
this.iconViewEx1.Size = new System.Drawing.Size(451, 341);
this.iconViewEx1.TabIndex = 0;
@@ -192,16 +218,12 @@
this.iconViewEx1.UseCompatibleStateImageBehavior = false;
this.iconViewEx1.View = System.Windows.Forms.View.Tile;
//
- // hotkeyTextBox1
+ // textBox1
//
- this.hotkeyTextBox1.BackColor = System.Drawing.Color.White;
- this.hotkeyTextBox1.HotKey = "0+0";
- this.hotkeyTextBox1.Location = new System.Drawing.Point(85, 124);
- this.hotkeyTextBox1.Name = "hotkeyTextBox1";
- this.hotkeyTextBox1.Size = new System.Drawing.Size(278, 44);
- this.hotkeyTextBox1.T_Key = System.Windows.Forms.Keys.None;
- this.hotkeyTextBox1.T_Modifiers = 0;
- this.hotkeyTextBox1.TabIndex = 1;
+ this.textBox1.Location = new System.Drawing.Point(447, 45);
+ this.textBox1.Name = "textBox1";
+ this.textBox1.Size = new System.Drawing.Size(275, 21);
+ this.textBox1.TabIndex = 3;
//
// FrmStart
//
@@ -221,6 +243,7 @@
this.menuStrip1.PerformLayout();
this.chromeTabControl1.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
+ this.tabPage1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
@@ -239,6 +262,8 @@
private System.Windows.Forms.ToolStripMenuItem 捐助ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem 打开官网ToolStripMenuItem;
private ryControls.IconViewEx iconViewEx1;
- private ryControls.HotkeyTextBox hotkeyTextBox1;
+ private System.Windows.Forms.Button button1;
+ private System.Windows.Forms.Button button2;
+ private System.Windows.Forms.TextBox textBox1;
}
}
\ No newline at end of file
diff --git a/Source/Itrycn_Project2/FrmStart.cs b/Source/Itrycn_Project2/FrmStart.cs
index bfddb74..b2d7838 100644
--- a/Source/Itrycn_Project2/FrmStart.cs
+++ b/Source/Itrycn_Project2/FrmStart.cs
@@ -143,5 +143,18 @@ namespace Itrycn_Project2
return;
}
}
+
+ private void button1_Click(object sender, EventArgs e)
+ {
+ MessageBox.Show("这是一个测试", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+
+ private void button2_Click(object sender, EventArgs e)
+ {
+ //var point= button1.PointToScreen(button1.Location);
+ // ryCommon.Auto.LeftClick(point.X+5, point.Y+5);
+ textBox1.Focus();
+ Auto.PasteText("你好");
+ }
}
}
diff --git a/Source/Itrycn_Project2/FrmStart.resx b/Source/Itrycn_Project2/FrmStart.resx
index 7ed4a9e..2189edf 100644
--- a/Source/Itrycn_Project2/FrmStart.resx
+++ b/Source/Itrycn_Project2/FrmStart.resx
@@ -126,6 +126,18 @@
246, 17
+
+
+ AAEAAAD/////AQAAAAAAAAAMAgAAAKABU3lzdGVtLkRyYXdpbmcsIFZlcnNpb249NC4wLjAuMCwgQ3Vs
+ dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhXV0sIG1zY29ybGliLCBW
+ ZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0
+ ZTA4OQwDAAAAUVN5c3RlbS5EcmF3aW5nLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwg
+ UHVibGljS2V5VG9rZW49YjAzZjVmN2YxMWQ1MGEzYQUBAAAAN1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5l
+ cmljLkxpc3RgMVtbU3lzdGVtLkRyYXdpbmcuSW1hZ2UDAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQA
+ ABZTeXN0ZW0uRHJhd2luZy5JbWFnZVtdAwAAAAgIAgAAAAkEAAAAAAAAAAAAAAAHBAAAAAABAAAAAAAA
+ AAQUU3lzdGVtLkRyYXdpbmcuSW1hZ2UDAAAACw==
+
+
diff --git a/Source/MyDb/FileFuns/Hosts.cs b/Source/MyDb/FileFuns/Hosts.cs
index 60618a7..1c508db 100644
--- a/Source/MyDb/FileFuns/Hosts.cs
+++ b/Source/MyDb/FileFuns/Hosts.cs
@@ -78,7 +78,7 @@ namespace ryCommon
for (int i = 0; i < _list.Count; i++)
{
bool HaveRecord = false;
- for (int m = from_list.Count-1; m>0; m--) //去host文件里查找是否已含有该内容
+ for (int m = from_list.Count-1; m>=0; m--) //去host文件里查找是否已含有该内容
{
if (from_list[m].Comment.Length > 0) { continue; }
if(_list[i].Domain.ToLower()== from_list[m].Domain.ToLower())
diff --git a/Source/MyDb/FileFuns/RyFiles.cs b/Source/MyDb/FileFuns/RyFiles.cs
index f46d390..3fc12c5 100644
--- a/Source/MyDb/FileFuns/RyFiles.cs
+++ b/Source/MyDb/FileFuns/RyFiles.cs
@@ -1,1138 +1,1138 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Drawing;
-using System.Drawing.Imaging;
-using System.IO;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Windows.Forms;
-
-namespace ryCommon
-{
- ///
- /// 文件操作类
- ///
- public class RyFiles
- {
- #region 【内部类型定义】
- private struct SHFILEOPSTRUCT
- {
- public IntPtr hwnd; //父窗口句柄
- public WFunc wFunc; //要执行的动作
- public string pFrom; //源文件路径,可以是多个文件,以结尾符号"\0"结束
- public string pTo; //目标路径,可以是路径或文件名
- public FILEOP_FLAGS fFlags; //标志,附加选项
- public bool fAnyOperationsAborted; //是否可被中断
- public IntPtr hNameMappings; //文件映射名字,可在其它 Shell 函数中使用
- public string lpszProgressTitle; // 只在 FOF_SIMPLEPROGRESS 时,指定对话框的标题。
- }
-
- private enum WFunc
- {
- FO_MOVE = 0x0001, //移动文件
- FO_COPY = 0x0002, //复制文件
- FO_DELETE = 0x0003, //删除文件,只是用pFrom
- FO_RENAME = 0x0004 //文件重命名
- }
-
- private enum FILEOP_FLAGS
- {
- FOF_MULTIDESTFILES = 0x0001, //pTo 指定了多个目标文件,而不是单个目录
- FOF_CONFIRMMOUSE = 0x0002,
- FOF_SILENT = 0x0044, // 不显示一个进度对话框
- FOF_RENAMEONCOLLISION = 0x0008, // 碰到有抵触的名字时,自动分配前缀
- FOF_NOCONFIRMATION = 0x10, // 不对用户显示提示
- FOF_WANTMAPPINGHANDLE = 0x0020, // 填充 hNameMappings 字段,必须使用 SHFreeNameMappings 释放
- FOF_ALLOWUNDO = 0x40, // 允许撤销
- FOF_FILESONLY = 0x0080, // 使用 *.* 时, 只对文件操作
- FOF_SIMPLEPROGRESS = 0x0100, // 简单进度条,意味者不显示文件名。
- FOF_NOCONFIRMMKDIR = 0x0200, // 建新目录时不需要用户确定
- FOF_NOERRORUI = 0x0400, // 不显示出错用户界面
- FOF_NOCOPYSECURITYATTRIBS = 0x0800, // 不复制 NT 文件的安全属性
- FOF_NORECURSION = 0x1000 // 不递归目录
- }
- #endregion 【内部类型定义】
- #region 【DllImport】
-
- [DllImport("shell32.dll")]
- private static extern int SHFileOperation(ref SHFILEOPSTRUCT lpFileOp);
- ///
- ///
- ///
- public enum ShowCommands : int
- {
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Windows.Forms;
+
+namespace ryCommon
+{
+ ///
+ /// 文件操作类
+ ///
+ public class RyFiles
+ {
+ #region 【内部类型定义】
+ private struct SHFILEOPSTRUCT
+ {
+ public IntPtr hwnd; //父窗口句柄
+ public WFunc wFunc; //要执行的动作
+ public string pFrom; //源文件路径,可以是多个文件,以结尾符号"\0"结束
+ public string pTo; //目标路径,可以是路径或文件名
+ public FILEOP_FLAGS fFlags; //标志,附加选项
+ public bool fAnyOperationsAborted; //是否可被中断
+ public IntPtr hNameMappings; //文件映射名字,可在其它 Shell 函数中使用
+ public string lpszProgressTitle; // 只在 FOF_SIMPLEPROGRESS 时,指定对话框的标题。
+ }
+
+ private enum WFunc
+ {
+ FO_MOVE = 0x0001, //移动文件
+ FO_COPY = 0x0002, //复制文件
+ FO_DELETE = 0x0003, //删除文件,只是用pFrom
+ FO_RENAME = 0x0004 //文件重命名
+ }
+
+ private enum FILEOP_FLAGS
+ {
+ FOF_MULTIDESTFILES = 0x0001, //pTo 指定了多个目标文件,而不是单个目录
+ FOF_CONFIRMMOUSE = 0x0002,
+ FOF_SILENT = 0x0044, // 不显示一个进度对话框
+ FOF_RENAMEONCOLLISION = 0x0008, // 碰到有抵触的名字时,自动分配前缀
+ FOF_NOCONFIRMATION = 0x10, // 不对用户显示提示
+ FOF_WANTMAPPINGHANDLE = 0x0020, // 填充 hNameMappings 字段,必须使用 SHFreeNameMappings 释放
+ FOF_ALLOWUNDO = 0x40, // 允许撤销
+ FOF_FILESONLY = 0x0080, // 使用 *.* 时, 只对文件操作
+ FOF_SIMPLEPROGRESS = 0x0100, // 简单进度条,意味者不显示文件名。
+ FOF_NOCONFIRMMKDIR = 0x0200, // 建新目录时不需要用户确定
+ FOF_NOERRORUI = 0x0400, // 不显示出错用户界面
+ FOF_NOCOPYSECURITYATTRIBS = 0x0800, // 不复制 NT 文件的安全属性
+ FOF_NORECURSION = 0x1000 // 不递归目录
+ }
+ #endregion 【内部类型定义】
+ #region 【DllImport】
+
+ [DllImport("shell32.dll")]
+ private static extern int SHFileOperation(ref SHFILEOPSTRUCT lpFileOp);
+ ///
+ ///
+ ///
+ public enum ShowCommands : int
+ {
///
///
- ///
- SW_HIDE = 0,
+ ///
+ SW_HIDE = 0,
///
///
- ///
- SW_SHOWNORMAL = 1,
+ ///
+ SW_SHOWNORMAL = 1,
///
///
- ///
- SW_NORMAL = 1,
+ ///
+ SW_NORMAL = 1,
///
///
- ///
- SW_SHOWMINIMIZED = 2,
+ ///
+ SW_SHOWMINIMIZED = 2,
///
///
- ///
- SW_SHOWMAXIMIZED = 3,
+ ///
+ SW_SHOWMAXIMIZED = 3,
///
///
- ///
- SW_MAXIMIZE = 3,
+ ///
+ SW_MAXIMIZE = 3,
///
///
- ///
- SW_SHOWNOACTIVATE = 4,
+ ///
+ SW_SHOWNOACTIVATE = 4,
///
///
- ///
- SW_SHOW = 5,
+ ///
+ SW_SHOW = 5,
///
///
- ///
- SW_MINIMIZE = 6,
+ ///
+ SW_MINIMIZE = 6,
///
///
- ///
- SW_SHOWMINNOACTIVE = 7,
+ ///
+ SW_SHOWMINNOACTIVE = 7,
///
///
- ///
- SW_SHOWNA = 8,
+ ///
+ SW_SHOWNA = 8,
///
///
- ///
- SW_RESTORE = 9,
+ ///
+ SW_RESTORE = 9,
///
///
- ///
- SW_SHOWDEFAULT = 10,
+ ///
+ SW_SHOWDEFAULT = 10,
///
///
- ///
- SW_FORCEMINIMIZE = 11,
+ ///
+ SW_FORCEMINIMIZE = 11,
///
///
- ///
- SW_MAX = 11
- }
- [DllImport("shell32.dll", CharSet = CharSet.Unicode)]
- static extern int ShellExecute(
- IntPtr hwnd,
- string lpOperation,
- string lpFile,
- string lpParameters,
- string lpDirectory,
- ShowCommands nShowCmd);
- #endregion 【DllImport】
- #region 【删除文件操作】
- ///
- /// 删除单个文件。
- ///
- /// 删除的文件名
- /// 指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除
- /// 指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框
- /// 指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效
- /// 反馈错误消息的字符串
- /// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码
- public static int DeleteFile(string fileName, bool toRecycle, bool showDialog, bool showProgress, ref string errorMsg)
- {
- try
- {
- string fName = fileName;
- if (fileName.IndexOf("*") < 0 && fileName.IndexOf("?") < 0)
- {
- fName = GetFullName(fileName);
- }
- return ToDelete(fName, toRecycle, showDialog, showProgress, ref errorMsg);
- }
- catch (Exception ex)
- {
- errorMsg = ex.Message;
- return -200;
- }
- }
- ///
- /// 删除单个文件。
- ///
- /// 删除的文件名
- /// 指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除
- /// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码
- public static int DeleteFile(string fileName, bool toRecycle)
- {
- string errorMsg = "";
- return DeleteFile(fileName,toRecycle,false,false,ref errorMsg);
- }
- ///
- /// 永久删除单个文件。
- ///
- /// 永久删除的文件名
- /// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码
- public static int DeleteFile(string fileName)
- {
- return DeleteFile(fileName, false);
- }
- ///
- /// 删除一组文件。
- ///
- /// 字符串数组,表示一组文件名
- /// 指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除
- /// 指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框
- /// 指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效
- /// 反馈错误消息的字符串
- /// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码
- public static int DeleteFiles(string[] fileNames, bool toRecycle, bool showDialog, bool showProgress, ref string errorMsg)
- {
- try
- {
- string fName = "";
- foreach (string str in fileNames)
- {
- fName += GetFullName(str) + "\0"; //组件文件组字符串
- }
-
- return ToDelete(fName, toRecycle, showDialog, showProgress, ref errorMsg);
- }
- catch (Exception ex)
- {
- errorMsg = ex.Message;
- return -200;
- }
- }
- #endregion 【删除文件操作】
-
- #region 【移动文件操作】
- ///
- /// 移动文件到指定路径下
- ///
- /// 要移动的文件名
- /// 移动到的目的路径
- ///
- public static int MoveFile(string sourceFileName, string destinationPath)
- {
- string errorMsg = "";
- return MoveFile(sourceFileName, destinationPath,false,false,false,ref errorMsg);
- }
- ///
- /// 移动一个文件到指定路径下
- ///
- /// 要移动的文件名
- /// 移动到的目的路径
- /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
- /// 指示是否显示进度对话框
- /// 指示当文件名重复时,是否自动为新文件加上后缀名
- /// 反馈错误消息的字符串
- /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码
- public static int MoveFile(string sourceFileName, string destinationPath, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
- {
- try
- {
- string sfName = GetFullName(sourceFileName);
- string dfName = GetFullName(destinationPath);
-
- return ToMoveOrCopy(WFunc.FO_MOVE, sfName, dfName, showDialog, showProgress, autoRename, ref errorMsg);
- }
- catch (Exception ex)
- {
- errorMsg = ex.Message;
- return -200;
- }
- }
-
- ///
- /// 移动一组文件到指定的路径下
- ///
- /// 要移动的文件名数组
- /// 移动到的目的路径
- /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
- /// 指示是否显示进度对话框
- /// 指示当文件名重复时,是否自动为新文件加上后缀名
- /// 反馈错误消息的字符串
- /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常
- public static int MoveFiles(string[] sourceFileNames, string destinationPath, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
- {
- try
- {
- string sfName = "";
- foreach (string str in sourceFileNames)
- {
- sfName += GetFullName(str) + "\0"; //组件文件组字符串
- }
- string dfName = GetFullName(destinationPath);
-
- return ToMoveOrCopy(WFunc.FO_MOVE, sfName, dfName, showDialog, showProgress, autoRename, ref errorMsg);
- }
- catch (Exception ex)
- {
- errorMsg = ex.Message;
- return -200;
- }
- }
- #endregion 【移动文件操作】
-
- #region 【复制文件操作】
- ///
- /// 复制文件到指定的文件名或路径
- ///
- /// 要复制的文件名
- /// 复制到的目的文件名或路径
- ///
- public static int CopyFile(string sourceFileName, string destinationFileName)
- {
- string errorMsg = "";
- return CopyFile(sourceFileName, destinationFileName,false,false,false,ref errorMsg);
- }
- ///
- /// 复制文件到指定的文件名或路径
- ///
- /// 要复制的文件名
- /// 复制到的目的文件名或路径
- /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
- /// 指示是否显示进度对话框
- /// 指示当文件名重复时,是否自动为新文件加上后缀名
- /// 返回错误信息
- /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常
- public static int CopyFile(string sourceFileName, string destinationFileName, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
- {
- try
- {
- string sfName = sourceFileName;
- string dfName = destinationFileName;
-
- return ToMoveOrCopy(WFunc.FO_COPY, sfName, dfName, showDialog, showProgress, autoRename, ref errorMsg);
- }
- catch (Exception ex)
- {
- errorMsg = ex.Message;
- return -200;
- }
- }
-
- ///
- /// 复制一组文件到指定的路径
- ///
- /// 要复制的文件名数组
- /// 复制到的目的路径
- /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
- /// 指示是否显示进度对话框
- /// 指示当文件名重复时,是否自动为新文件加上后缀名
- /// 返回错误信息
- /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常
- public static int CopyFiles(string[] sourceFileNames, string destinationPath, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
- {
- try
- {
- string sfName = "";
- foreach (string str in sourceFileNames)
- {
- sfName += GetFullName(str) + "\0"; //组件文件组字符串
- }
- string dfName = GetFullName(destinationPath);
-
- return ToMoveOrCopy(WFunc.FO_COPY, sfName, dfName, showDialog, showProgress, autoRename, ref errorMsg);
- }
- catch (Exception ex)
- {
- errorMsg = ex.Message;
- return -200;
- }
- }
- #endregion 【复制文件操作】
-
- #region 【重命名文件】
- ///
- /// 重命名一个文件为新名称,建议您使用更方便的Microsoft.VisualBasic.FileSystem.ReName();替换该方法
- ///
- /// 要复制的文件名
- /// 复制到的目的文件名或路径
- /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
- /// 返回错误信息
- /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常
- [Obsolete("建议使用 Microsoft.VisualBasic.FileSystem.ReName()方法")]
- public static int ReNameFile(string sourceFileName, string destinationFileName, bool showDialog, ref string errorMsg)
- {
-
- try
- {
- SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT()
- {
- wFunc = WFunc.FO_RENAME,
- pFrom = GetFullName(sourceFileName) + "\0\0", //将文件名以结尾字符"\0\0"结束
- pTo = GetFullName(destinationFileName) + "\0\0",
- fFlags = FILEOP_FLAGS.FOF_NOERRORUI
- };
- if (!showDialog)
- lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMATION; //设定不显示提示对话框
-
-
- lpFileOp.fAnyOperationsAborted = true;
-
- int n = SHFileOperation(ref lpFileOp);
- if (n == 0)
- return 0;
-
- string tmp = GetErrorString(n);
-
- errorMsg = string.Format("{0}({1})", tmp, sourceFileName);
-
- return n;
- }
- catch (Exception ex)
- {
- errorMsg = ex.Message;
- return -200;
- }
- }
-
-
- #endregion 【重命名文件】
-
- ///
- /// 删除单个或多个文件
- ///
- /// 删除的文件名,如果是多个文件,文件名之间以字符串结尾符'\0'隔开
- /// 指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除
- /// 指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框
- /// 指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效
- /// 反馈错误消息的字符串
- /// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码
- private static int ToDelete(string fileName, bool toRecycle, bool showDialog, bool showProgress, ref string errorMsg)
- {
- SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT()
- {
- wFunc = WFunc.FO_DELETE,
- pFrom = fileName + "\0" //将文件名以结尾字符"\0"结束
- };
- lpFileOp.fFlags = FILEOP_FLAGS.FOF_NOERRORUI;
- if (!showDialog)
- lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMATION; //设定不显示提示对话框
- if (!showProgress)
- lpFileOp.fFlags |= FILEOP_FLAGS.FOF_SILENT; //设定不显示进度对话框
- if (!toRecycle)
- lpFileOp.fFlags &= ~FILEOP_FLAGS.FOF_ALLOWUNDO; //设定删除到回收站
- lpFileOp.fAnyOperationsAborted = true;
-
- int n = SHFileOperation(ref lpFileOp);
- if (n == 0)
- return 0;
-
- string tmp = GetErrorString(n);
-
- //.av 文件正常删除了但也提示 402 错误,不知道为什么。屏蔽之。
- if ((fileName.ToLower().EndsWith(".av") && n.ToString("X") == "402"))
- return 0;
-
- errorMsg = string.Format("{0}({1})", tmp, fileName);
-
- return n;
- }
-
- ///
- /// 移动或复制一个或多个文件到指定路径下
- ///
- /// 操作类型,是移动操作还是复制操作
- /// 要移动或复制的文件名,如果是多个文件,文件名之间以字符串结尾符'\0'隔开
- /// 移动到的目的位置
- /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
- /// 指示是否显示进度对话框
- /// 指示当文件名重复时,是否自动为新文件加上后缀名
- /// 反馈错误消息的字符串
- /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码
- private static int ToMoveOrCopy(WFunc flag, string sourceFileName, string destinationFileName, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
- {
- SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT()
- {
- wFunc = flag,
- pFrom = sourceFileName + "\0", //将文件名以结尾字符"\0\0"结束
- pTo = destinationFileName + "\0\0"
- };
- lpFileOp.fFlags = FILEOP_FLAGS.FOF_NOERRORUI;
- lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMMKDIR; //指定在需要时可以直接创建路径
- if (!showDialog)
- lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMATION; //设定不显示提示对话框
- if (!showProgress)
- lpFileOp.fFlags |= FILEOP_FLAGS.FOF_SILENT; //设定不显示进度对话框
- if (autoRename)
- lpFileOp.fFlags |= FILEOP_FLAGS.FOF_RENAMEONCOLLISION; //自动为重名文件添加名称后缀
-
- lpFileOp.fAnyOperationsAborted = true;
-
- int n = SHFileOperation(ref lpFileOp);
- if (n == 0)
- return 0;
-
- string tmp = GetErrorString(n);
-
- errorMsg = string.Format("{0}({1})", tmp, sourceFileName);
-
- return n;
- }
- ///
- /// 如果指定文件夹不存在,则创建文件夹
- ///
- ///
- public static void CreateDirectory(string path)
- {
- if(!System.IO.Directory.Exists(path))
- {
- System.IO.Directory.CreateDirectory(path);
- }
- }
- ///
- /// 获取一个文件的全名
- ///
- /// 文件名
- /// 返回生成文件的完整路径名
- private static string GetFullName(string fileName)
- {
- FileInfo fi = new FileInfo(fileName);
- return fi.FullName;
- }
- ///
- /// 获取一个文件的全名
- ///
- /// 文件名
- /// 返回生成文件的完整路径名
- public static sType.FileTime GetFileDate(string fileName)
- {
- var result = new sType.FileTime();
- FileInfo fi = new FileInfo(fileName);
- result.AccessTime = fi.LastAccessTime;
- result.CreateTime = fi.CreationTime;
- result.LastWriteTime = fi.LastWriteTime;
- return result;
- }
- ///
- /// 解释错误代码
- ///
- /// 代码号
- /// 返回关于错误代码的文字描述
- private static string GetErrorString(int n)
- {
- if (n == 0) return string.Empty;
-
- switch (n)
- {
- case 2:
- return "系统找不到指定的文件。";
- case 7:
- return "存储控制块被销毁。您是否选择的“取消”操作?";
- case 113:
- return "文件已存在!";
- case 115:
- return "重命名文件操作,原始文件和目标文件必须具有相同的路径名。不能使用相对路径。";
- case 117:
- return "I/O控制错误";
- case 123:
- return "指定了重复的文件名";
- case 116:
- return "The source is a root directory, which cannot be moved or renamed.";
- case 118:
- return "Security settings denied access to the source.";
- case 124:
- return "The path in the source or destination or both was invalid.";
- case 65536:
- return "An unspecified error occurred on the destination.";
- case 1026:
- return "在试图移动或拷贝一个不存在的文件.";
- case 1223:
- return "操作被取消!";
- default:
- return "未识别的错误代码:" + n;
- }
- }
- ///
- /// 运行文件
- ///
- ///
- ///
- ///
- public static int RunFile(string FilePath, string PramCom)
- {
- return RunFile(FilePath, PramCom,"");
- }
- ///
- /// /运行文件
- ///
- ///
- ///
- ///
- ///
- public static int RunFile(string FilePath, string PramCom,string lpDirectory)
- {
- try
- {
- return ShellExecute(IntPtr.Zero, "open", FilePath, PramCom, lpDirectory, ShowCommands.SW_SHOWNORMAL);
- //System.Diagnostics.Process.Start(FilePath, PramCom);
- //return 1;
- }
- catch { return 0; }
- }
- ///
- /// 运行程序
- ///
- ///
- ///
- public static int RunProc(string FilePath)
- {
- return RunFile(FilePath, "");
- }
- ///
- /// 打开文件
- ///
- ///
- ///
- public static int OpenFile(string FilePath)
- {
- return RunFile(FilePath, "");
- }
- [DllImport("Kernel32", CharSet = CharSet.Unicode)]
- private static extern Int32 GetShortPathName(String path, StringBuilder shortPath, Int32 shortPathLength);
- ///
- /// 打开文件夹并定位文件
- ///
- ///
- ///
- public static int OpenFolderGotoFile(string FilePath)
- {
- StringBuilder shortpath = new StringBuilder(260);
- int result = GetShortPathName(FilePath, shortpath, shortpath.Capacity);
- return RunFile("explorer.exe", "/select,\""+ shortpath.ToString()+ "\"");
- }
- ///
- /// 打开网址
- ///
- ///
- ///
- public static int OpenUrl(string url)
- {
- return RunFile(url, "");
- }
- ///
- /// 判断文件名是否有效
- ///
- ///
- ///
- public static bool IsValidFileName(string filename)
- {
- char[] no_validstr = @":\/|*?<>""".ToCharArray();
- for(int i=0;i=0)
- {
- return false;
- }
- }
- return true;
- }
- ///
- /// 转换到有效文件名
- ///
- ///
- ///
- public static string ConvertToValidFileName(string filename)
- {
- char[] no_validstr = @":\/|*?<>""".ToCharArray();
- string _file = filename;
- for (int i = 0; i < no_validstr.Length; i++)
- {
- _file = _file.Replace(no_validstr[i].ToString(), "");
- }
- return _file;
- }
- ///
- /// 追加日志
- ///
- ///
- ///
- public void AppendLogs(string path, string content)
- {
- AppendAllText(path, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\t" + content);
- }
- ///
- /// 追加文件
- ///
- ///
- ///
- public void AppendAllText(string path, string content)
- {
- if (!System.IO.File.Exists(path))
- {
- RyFiles.WriteAllText(path, content, Encoding.UTF8);
- }
- else
- {
- System.IO.File.AppendAllText(path, "\r\n" +content, Encoding.UTF8);
- }
- }
- ///
- /// 读取文件内容,可以自动识别文件编码
- ///
- ///
- ///
- public static string ReadAllText(string path)
- {
- if (System.IO.File.Exists(path))
- {
- try
- {
- return System.IO.File.ReadAllText(path, ryCommon.TxtFileEncoder.GetEncoding(path));
- }
- catch { return ""; }
- }
- return "";
- }
- ///
- /// 读取文件所有行,可以自动识别文件编码
- ///
- ///
- ///
- public static string[] ReadAllLines(string path)
- {
- if (System.IO.File.Exists(path))
- {
- return System.IO.File.ReadAllLines(path, ryCommon.TxtFileEncoder.GetEncoding(path));
- }
- return null;
- }
- //static void ReadFile(string path,FileAccess fileAccess, FileShare fileShare)
- //{
- // FileStream fs = new FileStream(path, FileMode.Open, fileAccess, fileShare);
- // var buffer = new byte[fs.Length];
- // fs.Position = 0;
- // fs.Read(buffer, 0, buffer.Length);
- // Console.WriteLine(Encoding.Default.GetString(buffer));
- //}
- ///
- /// 写入所有文本行到文件,如果文件夹不存在,会自动创建
- ///
- ///
- ///
- ///
- public static void WriteAllLines(string path,string[] content,Encoding encoding)
- {
- if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(path)))
- {
- System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(path));
- }
- System.IO.File.WriteAllLines(path, content, encoding);
- }
- ///
- /// 写入所有文本到文件,如果文件夹不存在,会自动创建
- ///
- ///
- ///
- ///
- public static void WriteAllText(string path, string content, Encoding encoding)
- {
- if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(path)))
- {
- System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(path));
- }
- System.IO.File.WriteAllText(path, content, encoding);
- }
- ///
- /// 从文件中加载图片,使用本方法,不会导致图片文件被占用。
- ///
- ///
- public static Image LoadPicFromFile(string path)
- {
- if(!System.IO.File.Exists(path))
- { return null; }
- try
- {
- FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
- //把文件读取到字节数组
- byte[] data = new byte[fs.Length];
- fs.Read(data, 0, data.Length);
- fs.Close();
-
- //实例化一个内存流--->把从文件流中读取的内容[字节数组]放到内存流中去
- MemoryStream ms = new MemoryStream(data);
- //设置图片框 pictureBox1中的图片
- return Image.FromStream(ms);
- }
- catch { return null; }
- }
- ///
- /// 获取文件大小
- ///
- ///
- ///
- public static Int64 GetFileSize(string path)
- {
- try
- {
- FileInfo fileInfo = new FileInfo(path);
- return fileInfo.Length;
- }
- catch { return -1; }
- }
- ///
- /// 添加文件到指定文件夹,会进行自动重命名,并返回重命名后的文件名(含路径)
- ///
- /// 要添加的文件路径
- /// 要添加到的文件夹
- /// 是否根据时间进行重命名
- /// 返回是否成功执行
- /// 成功执行则返回路径,否则返回空
- public static string AddFileToFolder(string filepath,string toFolder,bool RenameByTime, out bool OK)
- {
- OK = false;
- var _toFolder = toFolder.TrimEnd('\\');
- CreateDirectory(_toFolder);
- if (!System.IO.Directory.Exists(_toFolder)) { return ""; }
- if (!System.IO.File.Exists(filepath) && !System.IO.Directory.Exists(filepath)) { return ""; }
- var filename = System.IO.Path.GetFileName(filepath);
- if (RenameByTime) { filename = DateTime.Now.ToString("yyyyMMddHHmmss") + System.IO.Path.GetExtension(filepath); }
- if(!System.IO.File.Exists(_toFolder+"\\"+ filename) && !System.IO.Directory.Exists(_toFolder + "\\" + filename)) {
- string errorMsg = "";
- if (ToMoveOrCopy(WFunc.FO_COPY, filepath, _toFolder + "\\" + filename, false, false, false, ref errorMsg) == 0)
- {
- OK = true;
- return _toFolder + "\\" + filename;
- }
- return "";//如果复制失败,则返回空路径
- }
- else //如果目标路径已经存在同名文件
- {
- int index = 0;
- string filename_noext;
- if (RenameByTime) { filename_noext = DateTime.Now.ToString("yyyyMMddHHmmss"); }
- else { filename_noext = System.IO.Path.GetFileNameWithoutExtension(filepath); }
- var ext= System.IO.Path.GetExtension(filepath);
- while (index<20) //最多重试20次
- {
- Random rd = new Random(Guid.NewGuid().GetHashCode());
- if (RenameByTime) { filename_noext = DateTime.Now.ToString("yyyyMMddHHmmss"); }
- var to_path = _toFolder + "\\" + filename_noext+"_"+ rd.Next(1000, 9999)+ ext;
- if(!System.IO.File.Exists(to_path) && !System.IO.Directory.Exists(to_path))
- {
- string errorMsg = "";
- if (ToMoveOrCopy(WFunc.FO_COPY, filepath, to_path, false, false, false, ref errorMsg) == 0)
- {
- OK = true;
- return to_path;
- }
- return "";
- }
- index++;
- }
- return "";
- }
- }
- ///
- /// 获取文件大小字符串
- ///
- ///
- ///
- public static string GetFileSizeStr(long size)
- {
- if (size == -1) { return "未知"; }
- string s = "";
- string[] u = new string[] { "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB", "NB", "DB" };
- double i = size;
- int n = 0;
- while (i > 1024)
- {
- i = i / 1024.0;
- n++;
- if (n == 4) break;
- }
- s = i.ToString("F2") + u[n];
- return s;
- }
- ///
- /// 获取文件大小字符串
- ///
- ///
- ///
- public static string GetFileSizeStr(string filepath)
- {
- return GetFileSizeStr(GetFileSize(filepath));
- }
- ///
- /// 复制内容到剪切板
- ///
- ///
- public static void CopyToClip(string text)
- {
- try
- {
- Clipboard.Clear();
- Clipboard.SetText(text);
- }
- catch { }
- }
- private static ImageCodecInfo GetEncoderInfo(String mimeType)
- {
- int j;
- ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
- for (j = 0; j < encoders.Length; ++j)
- {
- if (encoders[j].MimeType == mimeType)
- return encoders[j];
- }
- return null;
- }
- private static ImageCodecInfo GetEncoderInfo(ryCommon.sType.ImageType type)
- {
- #region 图片格式
- ImageCodecInfo myImageCodecInfo;
- string type_str = "image/jpeg";
- switch (type)
- {
- case sType.ImageType.Bmp:
- type_str = "image/bmp";
- break;
- case sType.ImageType.Jpeg:
- type_str = "image/jpeg";
- break;
- case sType.ImageType.Gif:
- type_str = "image/gif";
- break;
- case sType.ImageType.Tiff:
- type_str = "image/tiff";
- break;
- case sType.ImageType.Png:
- type_str = "image/png";
- break;
- }
- myImageCodecInfo = GetEncoderInfo(type_str);
- #endregion
- return myImageCodecInfo;
- }
- private static EncoderParameters GetEncoderParameters(ryCommon.sType.ImageType type)
- {
- System.Drawing.Imaging.Encoder myEncoder;
- EncoderParameter myEncoderParameter;
- EncoderParameters myEncoderParameters;
-
- myEncoder = System.Drawing.Imaging.Encoder.Quality;
- myEncoderParameters = new EncoderParameters(1);
- // Save the bitmap as a JPEG file with quality level 100.
- myEncoderParameter = new EncoderParameter(myEncoder, 100L);
- myEncoderParameters.Param[0] = myEncoderParameter;
- return myEncoderParameters;
- }
- ///
- /// 添加某个控件为支持拖放属性
- ///
- ///
- ///
- public static ElevatedDragDropManager AddDropDrag(IntPtr handle)
- {
- ElevatedDragDropManager.Instance.EnableDragDrop(handle);
- return ElevatedDragDropManager.Instance;
- }
- ///
- /// 使管理员方式运行时支持拖放
- ///
- ///
- ///
- public static void AdminDragEnable(IntPtr handle)
- {
- ElevatedDragDropManager.AdminDragEnable(handle);
- }
- ///
- /// 保存高质量不失真照片
- ///
- ///
- ///
- ///
- public static void SaveHighQualityImage(Bitmap m,string path,ryCommon.sType.ImageType type)
- {
- m.Save(path, GetEncoderInfo(type), GetEncoderParameters(type));
- }
- ///
- /// 保存高质量不失真照片
- ///
- ///
- ///
- ///
- public static void SaveHighQualityImage(Bitmap m, MemoryStream ms, ryCommon.sType.ImageType type)
- {
- m.Save(ms, GetEncoderInfo(type), GetEncoderParameters(type));
- }
- ///
- /// 保存高质量不失真照片
- ///
- ///
- ///
- ///
- public static void SaveHighQualityImage(Image m, string path, ryCommon.sType.ImageType type)
- {
- m.Save(path, GetEncoderInfo(type), GetEncoderParameters(type));
- }
- ///
- /// 获取绝对路径
- ///
- ///
- ///
- public static string GetRealPath(string _path)
- {
- string _tmp_path = _path.Replace("", Application.StartupPath);
- _tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.System));
- _tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.SystemX86));
- _tmp_path = _tmp_path.Replace("", Environment.GetEnvironmentVariable("ProgramW6432"));
- _tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86));
- _tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.Windows));
- _tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
- _tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory));
- _tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.Fonts));
- _tmp_path = Environment.ExpandEnvironmentVariables(_tmp_path);
- if(_tmp_path.IndexOf("%")>=0)
- {
- foreach (int i in Enum.GetValues(typeof(Environment.SpecialFolder)))
- {
- string value = Environment.GetFolderPath((Environment.SpecialFolder)i);
- string key= Enum.GetName(typeof(Environment.SpecialFolder), i);
- if (_tmp_path.IndexOfEx(key) >= 0)
- {
- _tmp_path = _tmp_path.ReplaceEx("%"+key+"%", value);
- }
- }
- }
- _tmp_path = _tmp_path.Replace("\\\\", "\\");
- return _tmp_path;
- }
- ///
- /// 获取相对路径
- ///
- ///
- ///
- public static string GetRelativePath(string _path)
- {
- string _tmp_path = _path.Replace(Application.StartupPath, "");
- _tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.System), "");
- _tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.SystemX86), "");
- _tmp_path = _tmp_path.Replace(Environment.GetEnvironmentVariable("ProgramW6432"), "");
- _tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "");
- _tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "");
- _tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "");
- _tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "");
- _tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "");
- string wait_replace_value = "";
- string wait_replace_key = "";
- int max_length = 0;
- foreach (int i in Enum.GetValues(typeof(Environment.SpecialFolder)))
- {
- string value = Environment.GetFolderPath((Environment.SpecialFolder)i);
- if (value == "x86") { continue; }
- if (_tmp_path.IndexOfEx(value) >= 0)
- {
- if (value.Length > max_length)
- {
- wait_replace_value = value;
- wait_replace_key = Enum.GetName(typeof(Environment.SpecialFolder), i); ;
- max_length = value.Length;
- }
- }
- }
- if (max_length > 0)
- {
- _tmp_path = _tmp_path.ReplaceEx(wait_replace_value, "%" + wait_replace_key + "%");
- }
- max_length = 0;
- foreach (DictionaryEntry de in Environment.GetEnvironmentVariables())
- {
- string value = de.Value.ToString();
- if (value == "x86") { continue; }
- if (value.IndexOfEx(":")<0) { continue; }
- if (_tmp_path.IndexOfEx(value) >= 0 && !value.IsInt())
- {
- if (value.Length > max_length)
- {
- wait_replace_value = value;
- wait_replace_key = de.Key.ToString();
- max_length = value.Length;
- }
- }
- }
- if (max_length>0)
- {
- _tmp_path = _tmp_path.ReplaceEx(wait_replace_value, "%" + wait_replace_key + "%");
- }
- return _tmp_path;
- }
- ///
- /// 获取图标
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- [DllImport("User32.dll")]
- public static extern int PrivateExtractIcons(
- string lpszFile, //file name
- int nIconIndex, //The zero-based index of the first icon to extract.
- int cxIcon, //The horizontal icon size wanted.
- int cyIcon, //The vertical icon size wanted.
- IntPtr[] phicon, //(out) A pointer to the returned array of icon handles.
- int[] piconid, //(out) A pointer to a returned resource identifier.
- int nIcons, //The number of icons to extract from the file. Only valid when *.exe and *.dll
- int flags //Specifies flags that control this function.
- );
- ///
- /// 销毁图标
- ///
- ///
- ///
- [DllImport("User32.dll")]
- public static extern bool DestroyIcon(
- IntPtr hIcon //A handle to the icon to be destroyed. The icon must not be in use.
- );
- ///
- /// 获取文件图标
- ///
- ///
- ///
- ///
- ///
- ///
- public static Bitmap GetFileIcon(string _path,int index,out int count,int size)
- {
- var file = _path;
- //选中文件中的图标总数
- var iconTotalCount = PrivateExtractIcons(file, 0, 0, 0, null, null, 0, 0);
- //用于接收获取到的图标指针
- IntPtr[] hIcons = new IntPtr[iconTotalCount];
- //对应的图标id
- int[] ids = new int[iconTotalCount];
- //成功获取到的图标个数
- var successCount = PrivateExtractIcons(file, 0, size, size, hIcons, ids, iconTotalCount, 0);
- count = successCount;
- Bitmap bmp = null;
- if(index>=0 && index< successCount)
- {
- if (hIcons[index] == IntPtr.Zero) { bmp = null; }
- else
- {
- bmp = Icon.FromHandle(hIcons[index]).ToBitmap();
- }
- //内存回收
- for (var i = 0; i < successCount; i++)
- {
- //指针为空,跳过
- if (hIcons[i] == IntPtr.Zero) continue;
- //内存回收
- DestroyIcon(hIcons[i]);
- }
- }
- return bmp;
- }
- }
-
-}
+ ///
+ SW_MAX = 11
+ }
+ [DllImport("shell32.dll", CharSet = CharSet.Unicode)]
+ static extern int ShellExecute(
+ IntPtr hwnd,
+ string lpOperation,
+ string lpFile,
+ string lpParameters,
+ string lpDirectory,
+ ShowCommands nShowCmd);
+ #endregion 【DllImport】
+ #region 【删除文件操作】
+ ///
+ /// 删除单个文件。
+ ///
+ /// 删除的文件名
+ /// 指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除
+ /// 指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框
+ /// 指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效
+ /// 反馈错误消息的字符串
+ /// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码
+ public static int DeleteFile(string fileName, bool toRecycle, bool showDialog, bool showProgress, ref string errorMsg)
+ {
+ try
+ {
+ string fName = fileName;
+ if (fileName.IndexOf("*") < 0 && fileName.IndexOf("?") < 0)
+ {
+ fName = GetFullName(fileName);
+ }
+ return ToDelete(fName, toRecycle, showDialog, showProgress, ref errorMsg);
+ }
+ catch (Exception ex)
+ {
+ errorMsg = ex.Message;
+ return -200;
+ }
+ }
+ ///
+ /// 删除单个文件。
+ ///
+ /// 删除的文件名
+ /// 指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除
+ /// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码
+ public static int DeleteFile(string fileName, bool toRecycle)
+ {
+ string errorMsg = "";
+ return DeleteFile(fileName,toRecycle,false,false,ref errorMsg);
+ }
+ ///
+ /// 永久删除单个文件。
+ ///
+ /// 永久删除的文件名
+ /// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码
+ public static int DeleteFile(string fileName)
+ {
+ return DeleteFile(fileName, false);
+ }
+ ///
+ /// 删除一组文件。
+ ///
+ /// 字符串数组,表示一组文件名
+ /// 指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除
+ /// 指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框
+ /// 指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效
+ /// 反馈错误消息的字符串
+ /// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码
+ public static int DeleteFiles(string[] fileNames, bool toRecycle, bool showDialog, bool showProgress, ref string errorMsg)
+ {
+ try
+ {
+ string fName = "";
+ foreach (string str in fileNames)
+ {
+ fName += GetFullName(str) + "\0"; //组件文件组字符串
+ }
+
+ return ToDelete(fName, toRecycle, showDialog, showProgress, ref errorMsg);
+ }
+ catch (Exception ex)
+ {
+ errorMsg = ex.Message;
+ return -200;
+ }
+ }
+ #endregion 【删除文件操作】
+
+ #region 【移动文件操作】
+ ///
+ /// 移动文件到指定路径下
+ ///
+ /// 要移动的文件名
+ /// 移动到的目的路径
+ ///
+ public static int MoveFile(string sourceFileName, string destinationPath)
+ {
+ string errorMsg = "";
+ return MoveFile(sourceFileName, destinationPath,false,false,false,ref errorMsg);
+ }
+ ///
+ /// 移动一个文件到指定路径下
+ ///
+ /// 要移动的文件名
+ /// 移动到的目的路径
+ /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
+ /// 指示是否显示进度对话框
+ /// 指示当文件名重复时,是否自动为新文件加上后缀名
+ /// 反馈错误消息的字符串
+ /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码
+ public static int MoveFile(string sourceFileName, string destinationPath, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
+ {
+ try
+ {
+ string sfName = GetFullName(sourceFileName);
+ string dfName = GetFullName(destinationPath);
+
+ return ToMoveOrCopy(WFunc.FO_MOVE, sfName, dfName, showDialog, showProgress, autoRename, ref errorMsg);
+ }
+ catch (Exception ex)
+ {
+ errorMsg = ex.Message;
+ return -200;
+ }
+ }
+
+ ///
+ /// 移动一组文件到指定的路径下
+ ///
+ /// 要移动的文件名数组
+ /// 移动到的目的路径
+ /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
+ /// 指示是否显示进度对话框
+ /// 指示当文件名重复时,是否自动为新文件加上后缀名
+ /// 反馈错误消息的字符串
+ /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常
+ public static int MoveFiles(string[] sourceFileNames, string destinationPath, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
+ {
+ try
+ {
+ string sfName = "";
+ foreach (string str in sourceFileNames)
+ {
+ sfName += GetFullName(str) + "\0"; //组件文件组字符串
+ }
+ string dfName = GetFullName(destinationPath);
+
+ return ToMoveOrCopy(WFunc.FO_MOVE, sfName, dfName, showDialog, showProgress, autoRename, ref errorMsg);
+ }
+ catch (Exception ex)
+ {
+ errorMsg = ex.Message;
+ return -200;
+ }
+ }
+ #endregion 【移动文件操作】
+
+ #region 【复制文件操作】
+ ///
+ /// 复制文件到指定的文件名或路径
+ ///
+ /// 要复制的文件名
+ /// 复制到的目的文件名或路径
+ ///
+ public static int CopyFile(string sourceFileName, string destinationFileName)
+ {
+ string errorMsg = "";
+ return CopyFile(sourceFileName, destinationFileName,false,false,false,ref errorMsg);
+ }
+ ///
+ /// 复制文件到指定的文件名或路径
+ ///
+ /// 要复制的文件名
+ /// 复制到的目的文件名或路径
+ /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
+ /// 指示是否显示进度对话框
+ /// 指示当文件名重复时,是否自动为新文件加上后缀名
+ /// 返回错误信息
+ /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常
+ public static int CopyFile(string sourceFileName, string destinationFileName, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
+ {
+ try
+ {
+ string sfName = sourceFileName;
+ string dfName = destinationFileName;
+
+ return ToMoveOrCopy(WFunc.FO_COPY, sfName, dfName, showDialog, showProgress, autoRename, ref errorMsg);
+ }
+ catch (Exception ex)
+ {
+ errorMsg = ex.Message;
+ return -200;
+ }
+ }
+
+ ///
+ /// 复制一组文件到指定的路径
+ ///
+ /// 要复制的文件名数组
+ /// 复制到的目的路径
+ /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
+ /// 指示是否显示进度对话框
+ /// 指示当文件名重复时,是否自动为新文件加上后缀名
+ /// 返回错误信息
+ /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常
+ public static int CopyFiles(string[] sourceFileNames, string destinationPath, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
+ {
+ try
+ {
+ string sfName = "";
+ foreach (string str in sourceFileNames)
+ {
+ sfName += GetFullName(str) + "\0"; //组件文件组字符串
+ }
+ string dfName = GetFullName(destinationPath);
+
+ return ToMoveOrCopy(WFunc.FO_COPY, sfName, dfName, showDialog, showProgress, autoRename, ref errorMsg);
+ }
+ catch (Exception ex)
+ {
+ errorMsg = ex.Message;
+ return -200;
+ }
+ }
+ #endregion 【复制文件操作】
+
+ #region 【重命名文件】
+ ///
+ /// 重命名一个文件为新名称,建议您使用更方便的Microsoft.VisualBasic.FileSystem.ReName();替换该方法
+ ///
+ /// 要复制的文件名
+ /// 复制到的目的文件名或路径
+ /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
+ /// 返回错误信息
+ /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常
+ [Obsolete("建议使用 Microsoft.VisualBasic.FileSystem.ReName()方法")]
+ public static int ReNameFile(string sourceFileName, string destinationFileName, bool showDialog, ref string errorMsg)
+ {
+
+ try
+ {
+ SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT()
+ {
+ wFunc = WFunc.FO_RENAME,
+ pFrom = GetFullName(sourceFileName) + "\0\0", //将文件名以结尾字符"\0\0"结束
+ pTo = GetFullName(destinationFileName) + "\0\0",
+ fFlags = FILEOP_FLAGS.FOF_NOERRORUI
+ };
+ if (!showDialog)
+ lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMATION; //设定不显示提示对话框
+
+
+ lpFileOp.fAnyOperationsAborted = true;
+
+ int n = SHFileOperation(ref lpFileOp);
+ if (n == 0)
+ return 0;
+
+ string tmp = GetErrorString(n);
+
+ errorMsg = string.Format("{0}({1})", tmp, sourceFileName);
+
+ return n;
+ }
+ catch (Exception ex)
+ {
+ errorMsg = ex.Message;
+ return -200;
+ }
+ }
+
+
+ #endregion 【重命名文件】
+
+ ///
+ /// 删除单个或多个文件
+ ///
+ /// 删除的文件名,如果是多个文件,文件名之间以字符串结尾符'\0'隔开
+ /// 指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除
+ /// 指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框
+ /// 指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效
+ /// 反馈错误消息的字符串
+ /// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码
+ private static int ToDelete(string fileName, bool toRecycle, bool showDialog, bool showProgress, ref string errorMsg)
+ {
+ SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT()
+ {
+ wFunc = WFunc.FO_DELETE,
+ pFrom = fileName + "\0" //将文件名以结尾字符"\0"结束
+ };
+ lpFileOp.fFlags = FILEOP_FLAGS.FOF_NOERRORUI;
+ if (!showDialog)
+ lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMATION; //设定不显示提示对话框
+ if (!showProgress)
+ lpFileOp.fFlags |= FILEOP_FLAGS.FOF_SILENT; //设定不显示进度对话框
+ if (!toRecycle)
+ lpFileOp.fFlags &= ~FILEOP_FLAGS.FOF_ALLOWUNDO; //设定删除到回收站
+ lpFileOp.fAnyOperationsAborted = true;
+
+ int n = SHFileOperation(ref lpFileOp);
+ if (n == 0)
+ return 0;
+
+ string tmp = GetErrorString(n);
+
+ //.av 文件正常删除了但也提示 402 错误,不知道为什么。屏蔽之。
+ if ((fileName.ToLower().EndsWith(".av") && n.ToString("X") == "402"))
+ return 0;
+
+ errorMsg = string.Format("{0}({1})", tmp, fileName);
+
+ return n;
+ }
+
+ ///
+ /// 移动或复制一个或多个文件到指定路径下
+ ///
+ /// 操作类型,是移动操作还是复制操作
+ /// 要移动或复制的文件名,如果是多个文件,文件名之间以字符串结尾符'\0'隔开
+ /// 移动到的目的位置
+ /// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
+ /// 指示是否显示进度对话框
+ /// 指示当文件名重复时,是否自动为新文件加上后缀名
+ /// 反馈错误消息的字符串
+ /// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码
+ private static int ToMoveOrCopy(WFunc flag, string sourceFileName, string destinationFileName, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
+ {
+ SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT()
+ {
+ wFunc = flag,
+ pFrom = sourceFileName + "\0", //将文件名以结尾字符"\0\0"结束
+ pTo = destinationFileName + "\0\0"
+ };
+ lpFileOp.fFlags = FILEOP_FLAGS.FOF_NOERRORUI;
+ lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMMKDIR; //指定在需要时可以直接创建路径
+ if (!showDialog)
+ lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMATION; //设定不显示提示对话框
+ if (!showProgress)
+ lpFileOp.fFlags |= FILEOP_FLAGS.FOF_SILENT; //设定不显示进度对话框
+ if (autoRename)
+ lpFileOp.fFlags |= FILEOP_FLAGS.FOF_RENAMEONCOLLISION; //自动为重名文件添加名称后缀
+
+ lpFileOp.fAnyOperationsAborted = true;
+
+ int n = SHFileOperation(ref lpFileOp);
+ if (n == 0)
+ return 0;
+
+ string tmp = GetErrorString(n);
+
+ errorMsg = string.Format("{0}({1})", tmp, sourceFileName);
+
+ return n;
+ }
+ ///
+ /// 如果指定文件夹不存在,则创建文件夹
+ ///
+ ///
+ public static void CreateDirectory(string path)
+ {
+ if(!System.IO.Directory.Exists(path))
+ {
+ System.IO.Directory.CreateDirectory(path);
+ }
+ }
+ ///
+ /// 获取一个文件的全名
+ ///
+ /// 文件名
+ /// 返回生成文件的完整路径名
+ private static string GetFullName(string fileName)
+ {
+ FileInfo fi = new FileInfo(fileName);
+ return fi.FullName;
+ }
+ ///
+ /// 获取一个文件的全名
+ ///
+ /// 文件名
+ /// 返回生成文件的完整路径名
+ public static sType.FileTime GetFileDate(string fileName)
+ {
+ var result = new sType.FileTime();
+ FileInfo fi = new FileInfo(fileName);
+ result.AccessTime = fi.LastAccessTime;
+ result.CreateTime = fi.CreationTime;
+ result.LastWriteTime = fi.LastWriteTime;
+ return result;
+ }
+ ///
+ /// 解释错误代码
+ ///
+ /// 代码号
+ /// 返回关于错误代码的文字描述
+ private static string GetErrorString(int n)
+ {
+ if (n == 0) return string.Empty;
+
+ switch (n)
+ {
+ case 2:
+ return "系统找不到指定的文件。";
+ case 7:
+ return "存储控制块被销毁。您是否选择的“取消”操作?";
+ case 113:
+ return "文件已存在!";
+ case 115:
+ return "重命名文件操作,原始文件和目标文件必须具有相同的路径名。不能使用相对路径。";
+ case 117:
+ return "I/O控制错误";
+ case 123:
+ return "指定了重复的文件名";
+ case 116:
+ return "The source is a root directory, which cannot be moved or renamed.";
+ case 118:
+ return "Security settings denied access to the source.";
+ case 124:
+ return "The path in the source or destination or both was invalid.";
+ case 65536:
+ return "An unspecified error occurred on the destination.";
+ case 1026:
+ return "在试图移动或拷贝一个不存在的文件.";
+ case 1223:
+ return "操作被取消!";
+ default:
+ return "未识别的错误代码:" + n;
+ }
+ }
+ ///
+ /// 运行文件
+ ///
+ ///
+ ///
+ ///
+ public static int RunFile(string FilePath, string PramCom)
+ {
+ return RunFile(FilePath, PramCom,"");
+ }
+ ///
+ /// /运行文件
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static int RunFile(string FilePath, string PramCom,string lpDirectory)
+ {
+ try
+ {
+ return ShellExecute(IntPtr.Zero, "open", FilePath, PramCom, lpDirectory, ShowCommands.SW_SHOWNORMAL);
+ //System.Diagnostics.Process.Start(FilePath, PramCom);
+ //return 1;
+ }
+ catch { return 0; }
+ }
+ ///
+ /// 运行程序
+ ///
+ ///
+ ///
+ public static int RunProc(string FilePath)
+ {
+ return RunFile(FilePath, "");
+ }
+ ///
+ /// 打开文件
+ ///
+ ///
+ ///
+ public static int OpenFile(string FilePath)
+ {
+ return RunFile(FilePath, "");
+ }
+ [DllImport("Kernel32", CharSet = CharSet.Unicode)]
+ private static extern Int32 GetShortPathName(String path, StringBuilder shortPath, Int32 shortPathLength);
+ ///
+ /// 打开文件夹并定位文件
+ ///
+ ///
+ ///
+ public static int OpenFolderGotoFile(string FilePath)
+ {
+ StringBuilder shortpath = new StringBuilder(260);
+ int result = GetShortPathName(FilePath, shortpath, shortpath.Capacity);
+ return RunFile("explorer.exe", "/select,\""+ shortpath.ToString()+ "\"");
+ }
+ ///
+ /// 打开网址
+ ///
+ ///
+ ///
+ public static int OpenUrl(string url)
+ {
+ return RunFile(url, "");
+ }
+ ///
+ /// 判断文件名是否有效
+ ///
+ ///
+ ///
+ public static bool IsValidFileName(string filename)
+ {
+ char[] no_validstr = @":\/|*?<>""".ToCharArray();
+ for(int i=0;i=0)
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+ ///
+ /// 转换到有效文件名
+ ///
+ ///
+ ///
+ public static string ConvertToValidFileName(string filename)
+ {
+ char[] no_validstr = @":\/|*?<>""".ToCharArray();
+ string _file = filename;
+ for (int i = 0; i < no_validstr.Length; i++)
+ {
+ _file = _file.Replace(no_validstr[i].ToString(), "");
+ }
+ return _file;
+ }
+ ///
+ /// 追加日志
+ ///
+ ///
+ ///
+ public void AppendLogs(string path, string content)
+ {
+ AppendAllText(path, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\t" + content);
+ }
+ ///
+ /// 追加文件
+ ///
+ ///
+ ///
+ public void AppendAllText(string path, string content)
+ {
+ if (!System.IO.File.Exists(path))
+ {
+ RyFiles.WriteAllText(path, content, Encoding.UTF8);
+ }
+ else
+ {
+ System.IO.File.AppendAllText(path, "\r\n" +content, Encoding.UTF8);
+ }
+ }
+ ///
+ /// 读取文件内容,可以自动识别文件编码
+ ///
+ ///
+ ///
+ public static string ReadAllText(string path)
+ {
+ if (System.IO.File.Exists(path))
+ {
+ try
+ {
+ return System.IO.File.ReadAllText(path, ryCommon.TxtFileEncoder.GetEncoding(path));
+ }
+ catch { return ""; }
+ }
+ return "";
+ }
+ ///
+ /// 读取文件所有行,可以自动识别文件编码
+ ///
+ ///
+ ///
+ public static string[] ReadAllLines(string path)
+ {
+ if (System.IO.File.Exists(path))
+ {
+ return System.IO.File.ReadAllLines(path, ryCommon.TxtFileEncoder.GetEncoding(path));
+ }
+ return null;
+ }
+ //static void ReadFile(string path,FileAccess fileAccess, FileShare fileShare)
+ //{
+ // FileStream fs = new FileStream(path, FileMode.Open, fileAccess, fileShare);
+ // var buffer = new byte[fs.Length];
+ // fs.Position = 0;
+ // fs.Read(buffer, 0, buffer.Length);
+ // Console.WriteLine(Encoding.Default.GetString(buffer));
+ //}
+ ///
+ /// 写入所有文本行到文件,如果文件夹不存在,会自动创建
+ ///
+ ///
+ ///
+ ///
+ public static void WriteAllLines(string path,string[] content,Encoding encoding)
+ {
+ if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(path)))
+ {
+ System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(path));
+ }
+ System.IO.File.WriteAllLines(path, content, encoding);
+ }
+ ///
+ /// 写入所有文本到文件,如果文件夹不存在,会自动创建
+ ///
+ ///
+ ///
+ ///
+ public static void WriteAllText(string path, string content, Encoding encoding)
+ {
+ if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(path)))
+ {
+ System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(path));
+ }
+ System.IO.File.WriteAllText(path, content, encoding);
+ }
+ ///
+ /// 从文件中加载图片,使用本方法,不会导致图片文件被占用。
+ ///
+ ///
+ public static Image LoadPicFromFile(string path)
+ {
+ if(!System.IO.File.Exists(path))
+ { return null; }
+ try
+ {
+ FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
+ //把文件读取到字节数组
+ byte[] data = new byte[fs.Length];
+ fs.Read(data, 0, data.Length);
+ fs.Close();
+
+ //实例化一个内存流--->把从文件流中读取的内容[字节数组]放到内存流中去
+ MemoryStream ms = new MemoryStream(data);
+ //设置图片框 pictureBox1中的图片
+ return Image.FromStream(ms);
+ }
+ catch { return null; }
+ }
+ ///
+ /// 获取文件大小
+ ///
+ ///
+ ///
+ public static Int64 GetFileSize(string path)
+ {
+ try
+ {
+ FileInfo fileInfo = new FileInfo(path);
+ return fileInfo.Length;
+ }
+ catch { return -1; }
+ }
+ ///
+ /// 添加文件到指定文件夹,会进行自动重命名,并返回重命名后的文件名(含路径)
+ ///
+ /// 要添加的文件路径
+ /// 要添加到的文件夹
+ /// 是否根据时间进行重命名
+ /// 返回是否成功执行
+ /// 成功执行则返回路径,否则返回空
+ public static string AddFileToFolder(string filepath,string toFolder,bool RenameByTime, out bool OK)
+ {
+ OK = false;
+ var _toFolder = toFolder.TrimEnd('\\');
+ CreateDirectory(_toFolder);
+ if (!System.IO.Directory.Exists(_toFolder)) { return ""; }
+ if (!System.IO.File.Exists(filepath) && !System.IO.Directory.Exists(filepath)) { return ""; }
+ var filename = System.IO.Path.GetFileName(filepath);
+ if (RenameByTime) { filename = DateTime.Now.ToString("yyyyMMddHHmmss") + System.IO.Path.GetExtension(filepath); }
+ if(!System.IO.File.Exists(_toFolder+"\\"+ filename) && !System.IO.Directory.Exists(_toFolder + "\\" + filename)) {
+ string errorMsg = "";
+ if (ToMoveOrCopy(WFunc.FO_COPY, filepath, _toFolder + "\\" + filename, false, false, false, ref errorMsg) == 0)
+ {
+ OK = true;
+ return _toFolder + "\\" + filename;
+ }
+ return "";//如果复制失败,则返回空路径
+ }
+ else //如果目标路径已经存在同名文件
+ {
+ int index = 0;
+ string filename_noext;
+ if (RenameByTime) { filename_noext = DateTime.Now.ToString("yyyyMMddHHmmss"); }
+ else { filename_noext = System.IO.Path.GetFileNameWithoutExtension(filepath); }
+ var ext= System.IO.Path.GetExtension(filepath);
+ while (index<20) //最多重试20次
+ {
+ Random rd = new Random(Guid.NewGuid().GetHashCode());
+ if (RenameByTime) { filename_noext = DateTime.Now.ToString("yyyyMMddHHmmss"); }
+ var to_path = _toFolder + "\\" + filename_noext+"_"+ rd.Next(1000, 9999)+ ext;
+ if(!System.IO.File.Exists(to_path) && !System.IO.Directory.Exists(to_path))
+ {
+ string errorMsg = "";
+ if (ToMoveOrCopy(WFunc.FO_COPY, filepath, to_path, false, false, false, ref errorMsg) == 0)
+ {
+ OK = true;
+ return to_path;
+ }
+ return "";
+ }
+ index++;
+ }
+ return "";
+ }
+ }
+ ///
+ /// 获取文件大小字符串
+ ///
+ ///
+ ///
+ public static string GetFileSizeStr(long size)
+ {
+ if (size == -1) { return "未知"; }
+ string s = "";
+ string[] u = new string[] { "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB", "NB", "DB" };
+ double i = size;
+ int n = 0;
+ while (i > 1024)
+ {
+ i = i / 1024.0;
+ n++;
+ if (n == 4) break;
+ }
+ s = i.ToString("F2") + u[n];
+ return s;
+ }
+ ///
+ /// 获取文件大小字符串
+ ///
+ ///
+ ///
+ public static string GetFileSizeStr(string filepath)
+ {
+ return GetFileSizeStr(GetFileSize(filepath));
+ }
+ ///
+ /// 复制内容到剪切板
+ ///
+ ///
+ public static void CopyToClip(string text)
+ {
+ try
+ {
+ Clipboard.Clear();
+ Clipboard.SetText(text);
+ }
+ catch { }
+ }
+ private static ImageCodecInfo GetEncoderInfo(String mimeType)
+ {
+ int j;
+ ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
+ for (j = 0; j < encoders.Length; ++j)
+ {
+ if (encoders[j].MimeType == mimeType)
+ return encoders[j];
+ }
+ return null;
+ }
+ private static ImageCodecInfo GetEncoderInfo(ryCommon.sType.ImageType type)
+ {
+ #region 图片格式
+ ImageCodecInfo myImageCodecInfo;
+ string type_str = "image/jpeg";
+ switch (type)
+ {
+ case sType.ImageType.Bmp:
+ type_str = "image/bmp";
+ break;
+ case sType.ImageType.Jpeg:
+ type_str = "image/jpeg";
+ break;
+ case sType.ImageType.Gif:
+ type_str = "image/gif";
+ break;
+ case sType.ImageType.Tiff:
+ type_str = "image/tiff";
+ break;
+ case sType.ImageType.Png:
+ type_str = "image/png";
+ break;
+ }
+ myImageCodecInfo = GetEncoderInfo(type_str);
+ #endregion
+ return myImageCodecInfo;
+ }
+ private static EncoderParameters GetEncoderParameters(ryCommon.sType.ImageType type)
+ {
+ System.Drawing.Imaging.Encoder myEncoder;
+ EncoderParameter myEncoderParameter;
+ EncoderParameters myEncoderParameters;
+
+ myEncoder = System.Drawing.Imaging.Encoder.Quality;
+ myEncoderParameters = new EncoderParameters(1);
+ // Save the bitmap as a JPEG file with quality level 100.
+ myEncoderParameter = new EncoderParameter(myEncoder, 100L);
+ myEncoderParameters.Param[0] = myEncoderParameter;
+ return myEncoderParameters;
+ }
+ ///
+ /// 添加某个控件为支持拖放属性
+ ///
+ ///
+ ///
+ public static ElevatedDragDropManager AddDropDrag(IntPtr handle)
+ {
+ ElevatedDragDropManager.Instance.EnableDragDrop(handle);
+ return ElevatedDragDropManager.Instance;
+ }
+ ///
+ /// 使管理员方式运行时支持拖放
+ ///
+ ///
+ ///
+ public static void AdminDragEnable(IntPtr handle)
+ {
+ ElevatedDragDropManager.AdminDragEnable(handle);
+ }
+ ///
+ /// 保存高质量不失真照片
+ ///
+ ///
+ ///
+ ///
+ public static void SaveHighQualityImage(Bitmap m,string path,ryCommon.sType.ImageType type)
+ {
+ m.Save(path, GetEncoderInfo(type), GetEncoderParameters(type));
+ }
+ ///
+ /// 保存高质量不失真照片
+ ///
+ ///
+ ///
+ ///
+ public static void SaveHighQualityImage(Bitmap m, MemoryStream ms, ryCommon.sType.ImageType type)
+ {
+ m.Save(ms, GetEncoderInfo(type), GetEncoderParameters(type));
+ }
+ ///
+ /// 保存高质量不失真照片
+ ///
+ ///
+ ///
+ ///
+ public static void SaveHighQualityImage(Image m, string path, ryCommon.sType.ImageType type)
+ {
+ m.Save(path, GetEncoderInfo(type), GetEncoderParameters(type));
+ }
+ ///
+ /// 获取绝对路径
+ ///
+ ///
+ ///
+ public static string GetRealPath(string _path)
+ {
+ string _tmp_path = _path.Replace("", Application.StartupPath);
+ _tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.System));
+ _tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.SystemX86));
+ _tmp_path = _tmp_path.Replace("", Environment.GetEnvironmentVariable("ProgramW6432"));
+ _tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86));
+ _tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.Windows));
+ _tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
+ _tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory));
+ _tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.Fonts));
+ _tmp_path = Environment.ExpandEnvironmentVariables(_tmp_path);
+ if(_tmp_path.IndexOf("%")>=0)
+ {
+ foreach (int i in Enum.GetValues(typeof(Environment.SpecialFolder)))
+ {
+ string value = Environment.GetFolderPath((Environment.SpecialFolder)i);
+ string key= Enum.GetName(typeof(Environment.SpecialFolder), i);
+ if (_tmp_path.IndexOfEx(key) >= 0)
+ {
+ _tmp_path = _tmp_path.ReplaceEx("%"+key+"%", value);
+ }
+ }
+ }
+ _tmp_path = _tmp_path.Replace("\\\\", "\\");
+ return _tmp_path;
+ }
+ ///
+ /// 获取相对路径
+ ///
+ ///
+ ///
+ public static string GetRelativePath(string _path)
+ {
+ string _tmp_path = _path.Replace(Application.StartupPath, "");
+ _tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.System), "");
+ _tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.SystemX86), "");
+ _tmp_path = _tmp_path.Replace(Environment.GetEnvironmentVariable("ProgramW6432"), "");
+ _tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "");
+ _tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "");
+ _tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "");
+ _tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "");
+ _tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "");
+ string wait_replace_value = "";
+ string wait_replace_key = "";
+ int max_length = 0;
+ foreach (int i in Enum.GetValues(typeof(Environment.SpecialFolder)))
+ {
+ string value = Environment.GetFolderPath((Environment.SpecialFolder)i);
+ if (value == "x86") { continue; }
+ if (_tmp_path.IndexOfEx(value) >= 0)
+ {
+ if (value.Length > max_length)
+ {
+ wait_replace_value = value;
+ wait_replace_key = Enum.GetName(typeof(Environment.SpecialFolder), i); ;
+ max_length = value.Length;
+ }
+ }
+ }
+ if (max_length > 0)
+ {
+ _tmp_path = _tmp_path.ReplaceEx(wait_replace_value, "%" + wait_replace_key + "%");
+ }
+ max_length = 0;
+ foreach (DictionaryEntry de in Environment.GetEnvironmentVariables())
+ {
+ string value = de.Value.ToString();
+ if (value == "x86") { continue; }
+ if (value.IndexOfEx(":")<0) { continue; }
+ if (_tmp_path.IndexOfEx(value) >= 0 && !value.IsInt())
+ {
+ if (value.Length > max_length)
+ {
+ wait_replace_value = value;
+ wait_replace_key = de.Key.ToString();
+ max_length = value.Length;
+ }
+ }
+ }
+ if (max_length>0)
+ {
+ _tmp_path = _tmp_path.ReplaceEx(wait_replace_value, "%" + wait_replace_key + "%");
+ }
+ return _tmp_path;
+ }
+ ///
+ /// 获取图标
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("User32.dll")]
+ public static extern int PrivateExtractIcons(
+ string lpszFile, //file name
+ int nIconIndex, //The zero-based index of the first icon to extract.
+ int cxIcon, //The horizontal icon size wanted.
+ int cyIcon, //The vertical icon size wanted.
+ IntPtr[] phicon, //(out) A pointer to the returned array of icon handles.
+ int[] piconid, //(out) A pointer to a returned resource identifier.
+ int nIcons, //The number of icons to extract from the file. Only valid when *.exe and *.dll
+ int flags //Specifies flags that control this function.
+ );
+ ///
+ /// 销毁图标
+ ///
+ ///
+ ///
+ [DllImport("User32.dll")]
+ public static extern bool DestroyIcon(
+ IntPtr hIcon //A handle to the icon to be destroyed. The icon must not be in use.
+ );
+ ///
+ /// 获取文件图标
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static Bitmap GetFileIcon(string _path,int index,out int count,int size)
+ {
+ var file = _path;
+ //选中文件中的图标总数
+ var iconTotalCount = PrivateExtractIcons(file, 0, 0, 0, null, null, 0, 0);
+ //用于接收获取到的图标指针
+ IntPtr[] hIcons = new IntPtr[iconTotalCount];
+ //对应的图标id
+ int[] ids = new int[iconTotalCount];
+ //成功获取到的图标个数
+ var successCount = PrivateExtractIcons(file, 0, size, size, hIcons, ids, iconTotalCount, 0);
+ count = successCount;
+ Bitmap bmp = null;
+ if(index>=0 && index< successCount)
+ {
+ if (hIcons[index] == IntPtr.Zero) { bmp = null; }
+ else
+ {
+ bmp = Icon.FromHandle(hIcons[index]).ToBitmap();
+ }
+ //内存回收
+ for (var i = 0; i < successCount; i++)
+ {
+ //指针为空,跳过
+ if (hIcons[i] == IntPtr.Zero) continue;
+ //内存回收
+ DestroyIcon(hIcons[i]);
+ }
+ }
+ return bmp;
+ }
+ }
+
+}
diff --git a/Source/MyDb/MyDbV4.csproj b/Source/MyDb/MyDbV4.csproj
index 4710dca..16504f4 100644
--- a/Source/MyDb/MyDbV4.csproj
+++ b/Source/MyDb/MyDbV4.csproj
@@ -100,6 +100,9 @@
+
+
+
diff --git a/Source/MyDb/Properties/AssemblyInfo.cs b/Source/MyDb/Properties/AssemblyInfo.cs
index bad3b96..a7a87ff 100644
--- a/Source/MyDb/Properties/AssemblyInfo.cs
+++ b/Source/MyDb/Properties/AssemblyInfo.cs
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”: :
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("2.1.2012.3001")]
-[assembly: AssemblyFileVersion("2.1.2012.3001")]
\ No newline at end of file
+[assembly: AssemblyVersion("2.1.2102.1101")]
+[assembly: AssemblyFileVersion("2.1.2102.1101")]
\ No newline at end of file
diff --git a/Source/MyDb/SysFuns/Auto.cs b/Source/MyDb/SysFuns/Auto.cs
index 17e6d8d..846d041 100644
--- a/Source/MyDb/SysFuns/Auto.cs
+++ b/Source/MyDb/SysFuns/Auto.cs
@@ -1,35 +1,330 @@
using System;
using System.Collections.Generic;
+using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
+using System.Windows.Forms;
+using Win32API;
-namespace ryCommon.SysFuns
+namespace ryCommon
{
///
/// 对鼠标或键盘的自动化操作
///
public class Auto
{
- uint WM_LBUTTONDOWN = 0x201;
- uint WM_LBUTTONUP = 0x202;
+ ///
+ /// 鼠标左键
+ ///
+ public const int MK_LBUTTON = 1;//鼠标左键
+ ///
+ /// 鼠标中键
+ ///
+ public const int MK_MBUTTON = 16;//鼠标中键
+ ///
+ /// 鼠标右键
+ ///
+ public const int MK_RBUTTON = 2;//鼠标右键
+ //移动鼠标
+ const int MOUSEEVENTF_MOVE = 0x0001;
+ //模拟鼠标左键按下
+ const int MOUSEEVENTF_LEFTDOWN = 0x0002;
+ //模拟鼠标左键抬起
+ const int MOUSEEVENTF_LEFTUP = 0x0004;
+ //模拟鼠标右键按下
+ const int MOUSEEVENTF_RIGHTDOWN = 0x0008;
+ //模拟鼠标右键抬起
+ const int MOUSEEVENTF_RIGHTUP = 0x0010;
+ //模拟鼠标中键按下
+ const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;
+ //模拟鼠标中键抬起
+ const int MOUSEEVENTF_MIDDLEUP = 0x0040;
+ //标示是否采用绝对坐标
+ const int MOUSEEVENTF_ABSOLUTE = 0x8000;
+ //模拟鼠标滚轮滚动操作,必须配合dwData参数
+ const int MOUSEEVENTF_WHEEL = 0x0800;
+ const uint WM_LBUTTONDOWN = 0x201;
+ const uint WM_LBUTTONUP = 0x202;
+ const int WM_RBUTTONDOWN = 516; // 鼠标右键按下
+ const int WM_RBUTTONUP = 517; // 鼠标右键抬起
+ const int WM_MBUTTONDOWN = 519; // 鼠标中键按下
+ const int WM_MBUTTONUP = 520; // 鼠标中键抬起
+ const uint WM_MOUSEWHEEL = 0x020A;
+ const uint WM_MOUSEMOVE = 0x0200;
+ const uint WM_KEYDOWN = 0x0100;
+ const uint WM_KEYUP = 0x0101;
- [DllImport("user32.dll", SetLastError = true)]
- static extern bool SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
- private int MakeLParam(int LoWord, int HiWord)
+ private static int MakeLParam(int LoWord, int HiWord)
{
return ((HiWord << 16) | (LoWord & 0xffff));
}
///
+ /// 模拟键盘按键
+ ///
+ ///
+ ///
+ /// 按下还是抬起
+ public static void KeyButton(IntPtr hWnd, int key, bool isPress)
+ {
+ if (isPress)
+ User32.SendMessage(hWnd, WM_KEYDOWN, key, 0);
+ else
+ User32.SendMessage(hWnd, WM_KEYUP, key, 0);
+ }
+ ///
+ /// 鼠标滚轮
+ ///
+ ///
+ ///
+ ///
+ public static void Mouse_Wheel(IntPtr hWnd, Point mouse_position, int delta)
+ {
+ User32.SendMessage(hWnd, WM_MOUSEWHEEL, delta * 65536, mouse_position.X + mouse_position.Y * 65536);
+ }
+ ///
+ /// 鼠标移动
+ ///
+ ///
+ ///
+ ///
+ public static void Mouse_Move(IntPtr hWnd, int button, Point mouse_position)
+ {
+ User32.SendMessage(hWnd, WM_MOUSEMOVE, button, mouse_position.X + mouse_position.Y * 65536);
+ }
+ ///
+ /// 自定义鼠标按下或抬起
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static void Mouse_Button(IntPtr hWnd,MouseButtons button, Point mouse_position, bool isPress)
+ {
+ if (button == MouseButtons.Middle)
+ {
+ if (isPress)
+ User32.SendMessage(hWnd, WM_MBUTTONDOWN, MK_MBUTTON, mouse_position.X + mouse_position.Y * 65536);
+ else
+ User32.SendMessage(hWnd, WM_MBUTTONUP, 0, mouse_position.X + mouse_position.Y * 65536);
+ }
+ else if (button == MouseButtons.Right)
+ {
+ if (isPress)
+ User32.SendMessage(hWnd, WM_RBUTTONDOWN, MK_RBUTTON, mouse_position.X + mouse_position.Y * 65536);
+ else
+ User32.SendMessage(hWnd, WM_RBUTTONUP, 0, mouse_position.X + mouse_position.Y * 65536);
+ }
+ else if (button == MouseButtons.Left)
+ {
+ if (isPress)
+ User32.SendMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, mouse_position.X + mouse_position.Y * 65536);
+ else
+ User32.SendMessage(hWnd, WM_LBUTTONUP, 0, mouse_position.X + mouse_position.Y * 65536);
+ }
+ }
+ ///
///左键单击鼠标(支持后台单击)
///
/// 指定要发送单击命令的句柄
/// 坐标x(句柄内的坐标,非屏幕坐标)
/// 坐标y(句柄内的坐标,非屏幕坐标)
- public void LeftClick(IntPtr handle, int x, int y)
+ public static void LeftClick(IntPtr handle, int x, int y)
{
- SendMessage(handle, WM_LBUTTONDOWN, 1, MakeLParam(x, y));
- SendMessage(handle, WM_LBUTTONUP, 0, MakeLParam(x, y));
+ User32.SendMessage(handle, WM_LBUTTONDOWN, 1, MakeLParam(x, y));
+ User32.SendMessage(handle, WM_LBUTTONUP, 0, MakeLParam(x, y));
}
+ ///
+ ///左键单击鼠标(支持后台单击)
+ ///
+ /// 指定要发送单击命令的句柄
+ /// 坐标(句柄内的坐标,非屏幕坐标)
+ public static void LeftClick(IntPtr handle,Point point)
+ {
+ LeftClick(handle,point.X,point.Y);
+ }
+ ///
+ ///右键单击鼠标(支持后台单击)
+ ///
+ /// 指定要发送单击命令的句柄
+ /// 坐标x(句柄内的坐标,非屏幕坐标)
+ /// 坐标y(句柄内的坐标,非屏幕坐标)
+ public static void RightClick(IntPtr handle, int x, int y)
+ {
+ User32.SendMessage(handle, WM_RBUTTONDOWN, 1, MakeLParam(x, y));
+ User32.SendMessage(handle, WM_RBUTTONUP, 0, MakeLParam(x, y));
+ }
+ ///
+ ///右键单击鼠标(支持后台单击)
+ ///
+ /// 指定要发送单击命令的句柄
+ /// 坐标(句柄内的坐标,非屏幕坐标)
+ public static void RightClick(IntPtr handle, Point point)
+ {
+ RightClick(handle, point.X, point.Y);
+ }
+ ///
+ ///中键单击鼠标(支持后台单击)
+ ///
+ /// 指定要发送单击命令的句柄
+ /// 坐标x(句柄内的坐标,非屏幕坐标)
+ /// 坐标y(句柄内的坐标,非屏幕坐标)
+ public static void MiddleClick(IntPtr handle, int x, int y)
+ {
+ User32.SendMessage(handle, WM_MBUTTONDOWN, 1, MakeLParam(x, y));
+ User32.SendMessage(handle, WM_MBUTTONUP, 0, MakeLParam(x, y));
+ }
+ ///
+ ///中键单击鼠标(支持后台单击)
+ ///
+ /// 指定要发送单击命令的句柄
+ /// 坐标(句柄内的坐标,非屏幕坐标)
+ public static void MiddleClick(IntPtr handle, Point point)
+ {
+ MiddleClick(handle, point.X, point.Y);
+ }
+ ///
+ ///左键单击鼠标(不支持后台单击)
+ ///
+ /// 坐标x(屏幕坐标)
+ /// 坐标y(屏幕坐标)
+ public static void LeftClick(int x, int y)
+ {
+ Cursor.Position = new System.Drawing.Point(x,y);
+ User32.mouse_event(MOUSEEVENTF_LEFTDOWN , 0,0, 0, 0);
+ User32.mouse_event(MOUSEEVENTF_LEFTUP, 0,0, 0, 0);
+ }
+ ///
+ ///左键单击鼠标(不支持后台单击)
+ ///
+ /// 坐标(屏幕坐标)
+ public static void LeftClick(Point point)
+ {
+ LeftClick(point.X, point.Y);
+ }
+ ///
+ ///右键单击鼠标(不支持后台单击)
+ ///
+ /// 坐标x(屏幕坐标)
+ /// 坐标y(屏幕坐标)
+ public static void RightClick(int x, int y)
+ {
+ Cursor.Position = new System.Drawing.Point(x, y);
+ User32.mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
+ User32.mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
+ }
+ ///
+ ///右键单击鼠标(不支持后台单击)
+ ///
+ /// 坐标(屏幕坐标)
+ public static void RightClick(Point point)
+ {
+ RightClick(point.X, point.Y);
+ }
+ ///
+ ///中键单击鼠标(不支持后台单击)
+ ///
+ /// 坐标x(屏幕坐标)
+ /// 坐标y(屏幕坐标)
+ public static void MiddleClick(int x, int y)
+ {
+ Cursor.Position = new System.Drawing.Point(x, y);
+ User32.mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0);
+ User32.mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0);
+ }
+ ///
+ ///中键单击鼠标(不支持后台单击)
+ ///
+ /// 坐标(屏幕坐标)
+ public static void MiddleClick(Point point)
+ {
+ MiddleClick(point.X, point.Y);
+ }
+ ///
+ /// 粘贴文本
+ ///
+ ///
+ public static void PasteText(string text)
+ {
+ var _text = Clipboard.GetText();
+ try
+ {
+ Clipboard.SetText(text);
+ }
+ catch { }
+ SendKeys.SendWait("^{V}");
+ }
+ ///
+ /// 获取指定句柄的大小及位置
+ ///
+ ///
+ ///
+ ///
+ public static Rectangle GetRect(IntPtr handle, out Size size)
+ {
+ IntPtr hdcSrc = User32.GetWindowDC(handle);
+ Rectangle windowRect = new Rectangle();
+ size = new Size(0, 0);
+ if (hdcSrc == IntPtr.Zero) { return windowRect; }
+ User32.GetWindowRect(handle, ref windowRect);
+ int width = windowRect.Right - windowRect.Left;
+ int height = windowRect.Bottom - windowRect.Top;
+ size = new Size(width, height);
+ return windowRect;
+ }
+ ///
+ /// 设置指定句柄的大小
+ ///
+ ///
+ ///
+ public static void SetRect(IntPtr handle, Size size)
+ {
+ var rect = GetRect(handle, out var size2);
+ User32.MoveWindow(handle, rect.Left, rect.Top, size.Width, size.Height, true);
+ }
+ ///
+ /// 判断鼠标位置是不是在指定的矩形中
+ ///
+ ///
+ ///
+ ///
+ public static bool IsInRect(MyDb.RyWin32.RECT rect, Point mouse_position)
+ {
+ return mouse_position.X >= rect.Left && mouse_position.X <= rect.Right && mouse_position.Y >= rect.Top && mouse_position.Y <= rect.Bottom;
+ }
+ ///
+ /// 判断2张图是否相似度超90
+ ///
+ ///
+ ///
+ ///
+ public static bool ImageEquals(Bitmap bmpOne, Bitmap bmpTwo)
+ {
+ if (bmpOne == null && bmpTwo == null) { return true; }
+ if (bmpOne == null || bmpTwo == null) { return false; }
+ for (int i = 0; i < bmpOne.Width; i++)
+ {
+ for (int j = 0; j < bmpOne.Height; j++)
+ {
+ double xsd = GetXsd(bmpOne.GetPixel(i, j), bmpTwo.GetPixel(i, j));
+ if (xsd < 90)
+ return false;
+ }
+ }
+ return true;
+ }
+ ///
+ /// /获取2种颜色的相似度,范围为0~100
+ ///
+ ///
+ ///
+ ///
+ public static double GetXsd(Color c1, Color c2)
+ {
+ //像素点相似度公式(255 - abs(r1 - r2) * 0.297 - abs(g1 - g2) * 0.593 - abs(b1 - b2) * 0.11) / 255
+ double xsd2 = (255 - Math.Abs(c1.R - c2.R) * 0.297 - Math.Abs(c1.G - c2.G) * 0.593 - Math.Abs(c1.B - c2.B) * 0.11) / 255;
+ return xsd2 * 100;
+ }
+
}
}
diff --git a/Source/MyDb/SysFuns/RyRegedit.cs b/Source/MyDb/SysFuns/RyRegedit.cs
index 691fb14..5af3caf 100644
--- a/Source/MyDb/SysFuns/RyRegedit.cs
+++ b/Source/MyDb/SysFuns/RyRegedit.cs
@@ -1,249 +1,369 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-using Microsoft.Win32;
-using System.Windows.Forms;
-
-namespace ryCommon
-{
- ///
- /// 设置注册表操作,部分功能需要管理员权限
- ///
- public class RyRegedit
- {
- ///
- /// 访问的注册表位置(64位还是32位)
- ///
- public static RegistryView UseSystemBit = RegistryView.Default;
- ///
- /// 访问的注册表节点
- ///
- public static RegistryHive RegRoot = RegistryHive.LocalMachine;
- ///
- /// 设置是否开机启动
- ///
- /// 是否开机启动
- /// 开机启动名称
- /// 启动命令
- ///
- public static bool SetAutoRun(bool AutoRun, string StartName, string StartCommand)
- {
- try
- {
- RegistryKey LMach = RegistryKey.OpenBaseKey(RegRoot, UseSystemBit);
- RegistryKey softwareRun = LMach.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
- if (AutoRun)
- { softwareRun.SetValue(StartName, StartCommand, RegistryValueKind.String); }
- else
- {
- if (softwareRun.GetValue(StartName) != null)
- {
- softwareRun.DeleteValue(StartName);
- }
- }
- softwareRun.Close();
- LMach.Close();
- return true;
- }
- catch
- {
- return false;
- }
- }
- ///
- /// 设置是否开机启动
- ///
- /// 是否开机启动
- /// 开机启动名称
- ///
- public static bool SetAutoRun(bool AutoRun, string StartName)
- {
- return SetAutoRun(AutoRun, StartName, "\"" + Application.ExecutablePath + "\" q");
- }
- ///
- /// 把指定文件设置为开机启动或取消开机启动
- ///
- /// 是否开机启动
- /// 开机启动名称
- /// 要开机启动的文件路径
- ///
- public static bool SetAutoRunByPath(bool AutoRun, string StartName, string Path)
- {
- return SetAutoRun(AutoRun, StartName, "\"" + Path + "\" q");
- }
- ///
- /// 检查是否开机启动
- ///
- /// 开机启动名称
- /// 开机启动命令
- ///
- public static bool IsAutoRun(string StartName, string StartCommand)
- {
- try
- {
- bool sxResult = false;
- RegistryKey LMach = RegistryKey.OpenBaseKey(RegRoot, UseSystemBit);
- RegistryKey softwareRun = LMach.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
- if (softwareRun.GetValue(StartName, "").ToString() == StartCommand)
- { sxResult = true; }
- else { sxResult = false; }
- softwareRun.Close();
- LMach.Close();
- return sxResult;
- }
- catch
- {
- return false;
- }
- }
- ///
- /// 检查是否开机启动
- ///
- /// 开机启动名称
- ///
- public static bool IsAutoRun(string StartName)
- {
- try
- {
- bool sxResult = false;
- RegistryKey LMach = RegistryKey.OpenBaseKey(RegRoot, UseSystemBit);
- RegistryKey softwareRun = LMach.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
- if (softwareRun.GetValue(StartName, "").ToString() != "")
- { sxResult = true; }
- else { sxResult = false; }
- softwareRun.Close();
- LMach.Close();
- return sxResult;
- }
- catch
- {
- return false;
- }
- }
- ///
- /// 判断指定文件是否是开机启动
- ///
- /// 开机启动名称
- /// 文件路径
- ///
- public static bool IsAutoRunByPath(string StartName, string Path)
- {
- return IsAutoRun(StartName, "\"" + Path + "\" q");
- }
- ///
- /// 判断当前程序是否是开机启动
- ///
- /// 开机启动名称
- ///
- public static bool IsAutoRunByMe(string StartName)
- {
- return IsAutoRun(StartName, "\"" + Application.ExecutablePath + "\" q");
- }
- ///
- /// 判断当前程序是否是开机启动
- ///
- /// 开机启动名称
- /// 启动命令行
- ///
- public static bool IsAutoRunByMe(string StartName, string Cmd)
- {
- return IsAutoRun(StartName, "\"" + Application.ExecutablePath + "\" " + Cmd);
- }
- ///
- /// 设置指定文件的浏览器控件内核版本
- ///
- /// 文件名,要求不带路径
- /// 7000 表示IE7兼容视图模式;8000 表示IE8 标准模式 ;8888 表示IE8 强制标准模式,在渲染失败的情况下不尝试用兼容视图模式
- ///
- public static bool SetIE_EMULATION(string filename, uint IEMode)
- {
- try
- {
- RegistryKey LMach = RegistryKey.OpenBaseKey(RegRoot, UseSystemBit);
- RegistryKey softwareRun = LMach.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", true);
- softwareRun.SetValue(filename, IEMode, RegistryValueKind.DWord);
- softwareRun.Close();
- LMach.Close();
- return true;
- }
- catch
- {
- return false;
- }
- }
- ///
- /// 采用的IE模式
- ///
- public enum IeMode
- {
- ///
- /// IE7兼容视图
- ///
- IE7CompatibleView = 7000,
- ///
- /// IE8 标准模式
- ///
- IE8StandardMode = 8000,
- ///
- /// IE8 强制标准模式,在渲染失败的情况下不尝试用兼容视图模式
- ///
- IE8Forced = 8888,
- ///
- /// IE9 标准模式
- ///
- IE9StandardMode = 9000,
- ///
- /// IE9 强制标准模式,在渲染失败的情况下不尝试用兼容视图模式
- ///
- IE9Forced = 9999,
- ///
- /// IE10 标准模式
- ///
- IE10StandardMode = 10000,
- ///
- /// IE10 强制标准模式,在渲染失败的情况下不尝试用兼容视图模式
- ///
- IE10Forced = 10001
- }
- ///
- /// 设置当前软件的浏览器控件内核版本
- ///
- /// 7000 表示IE7兼容视图模式;8000 表示IE8 标准模式 ;8888 表示IE8 强制标准模式,在渲染失败的情况下不尝试用兼容视图模式
- ///
- public static bool SetIE_EMULATION(uint IEMode)
- {
- return SetIE_EMULATION(System.IO.Path.GetFileName(Application.ExecutablePath), IEMode);
- }
- ///
- /// 设置指定文件的浏览器控件内核版本
- ///
- /// 文件名,要求不带路径
- /// IE内核版本
- ///
- public static bool SetIE_EMULATION(string filename, IeMode IEMode)
- {
- try
- {
- RegistryKey LMach = RegistryKey.OpenBaseKey(RegRoot, UseSystemBit);
- RegistryKey softwareRun = LMach.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", true);
- softwareRun.SetValue(filename, IEMode, RegistryValueKind.DWord);
- softwareRun.Close();
- LMach.Close();
- return true;
- }
- catch
- {
- return false;
- }
- }
- ///
- /// 设置当前软件的浏览器控件内核版本
- ///
- /// IE内核版本
- ///
- public static bool SetIE_EMULATION(IeMode IEMode)
- {
- return SetIE_EMULATION(System.IO.Path.GetFileName(Application.ExecutablePath), IEMode);
- }
- }
-}
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Microsoft.Win32;
+using System.Windows.Forms;
+
+namespace ryCommon
+{
+ ///
+ /// 设置注册表操作,部分功能需要管理员权限
+ ///
+ public class RyRegedit
+ {
+ ///
+ /// 访问的注册表位置(64位还是32位)
+ ///
+ public static RegistryView UseSystemBit = RegistryView.Default;
+ ///
+ /// 访问的注册表节点
+ ///
+ public static RegistryHive RegRoot = RegistryHive.LocalMachine;
+ ///
+ /// 设置是否开机启动
+ ///
+ /// 是否开机启动
+ /// 开机启动名称
+ /// 启动命令
+ ///
+ public static bool SetAutoRun(bool AutoRun, string StartName, string StartCommand)
+ {
+ try
+ {
+ RegistryKey LMach = RegistryKey.OpenBaseKey(RegRoot, UseSystemBit);
+ RegistryKey softwareRun = LMach.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
+ if (AutoRun)
+ { softwareRun.SetValue(StartName, StartCommand, RegistryValueKind.String); }
+ else
+ {
+ if (softwareRun.GetValue(StartName) != null)
+ {
+ softwareRun.DeleteValue(StartName);
+ }
+ }
+ softwareRun.Close();
+ LMach.Close();
+ return true;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+ ///
+ /// 设置是否开机启动
+ ///
+ /// 是否开机启动
+ /// 开机启动名称
+ ///
+ public static bool SetAutoRun(bool AutoRun, string StartName)
+ {
+ return SetAutoRun(AutoRun, StartName, "\"" + Application.ExecutablePath + "\" q");
+ }
+ ///
+ /// 把指定文件设置为开机启动或取消开机启动
+ ///
+ /// 是否开机启动
+ /// 开机启动名称
+ /// 要开机启动的文件路径
+ ///
+ public static bool SetAutoRunByPath(bool AutoRun, string StartName, string Path)
+ {
+ return SetAutoRun(AutoRun, StartName, "\"" + Path + "\" q");
+ }
+ ///
+ /// 检查是否开机启动
+ ///
+ /// 开机启动名称
+ /// 开机启动命令
+ ///
+ public static bool IsAutoRun(string StartName, string StartCommand)
+ {
+ try
+ {
+ bool sxResult = false;
+ RegistryKey LMach = RegistryKey.OpenBaseKey(RegRoot, UseSystemBit);
+ RegistryKey softwareRun = LMach.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
+ if (softwareRun.GetValue(StartName, "").ToString() == StartCommand)
+ { sxResult = true; }
+ else { sxResult = false; }
+ softwareRun.Close();
+ LMach.Close();
+ return sxResult;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+ ///
+ /// 检查是否开机启动
+ ///
+ /// 开机启动名称
+ ///
+ public static bool IsAutoRun(string StartName)
+ {
+ try
+ {
+ bool sxResult = false;
+ RegistryKey LMach = RegistryKey.OpenBaseKey(RegRoot, UseSystemBit);
+ RegistryKey softwareRun = LMach.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
+ if (softwareRun.GetValue(StartName, "").ToString() != "")
+ { sxResult = true; }
+ else { sxResult = false; }
+ softwareRun.Close();
+ LMach.Close();
+ return sxResult;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+ ///
+ /// 判断指定文件是否是开机启动
+ ///
+ /// 开机启动名称
+ /// 文件路径
+ ///
+ public static bool IsAutoRunByPath(string StartName, string Path)
+ {
+ return IsAutoRun(StartName, "\"" + Path + "\" q");
+ }
+ ///
+ /// 判断当前程序是否是开机启动
+ ///
+ /// 开机启动名称
+ ///
+ public static bool IsAutoRunByMe(string StartName)
+ {
+ return IsAutoRun(StartName, "\"" + Application.ExecutablePath + "\" q");
+ }
+ ///
+ /// 判断当前程序是否是开机启动
+ ///
+ /// 开机启动名称
+ /// 启动命令行
+ ///
+ public static bool IsAutoRunByMe(string StartName, string Cmd)
+ {
+ return IsAutoRun(StartName, "\"" + Application.ExecutablePath + "\" " + Cmd);
+ }
+ ///
+ /// 设置指定文件的浏览器控件内核版本
+ ///
+ /// 文件名,要求不带路径
+ /// 7000 表示IE7兼容视图模式;8000 表示IE8 标准模式 ;8888 表示IE8 强制标准模式,在渲染失败的情况下不尝试用兼容视图模式
+ ///
+ public static bool SetIE_EMULATION(string filename, uint IEMode)
+ {
+ try
+ {
+ RegistryKey LMach = RegistryKey.OpenBaseKey(RegRoot, UseSystemBit);
+ RegistryKey softwareRun = LMach.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", true);
+ softwareRun.SetValue(filename, IEMode, RegistryValueKind.DWord);
+ softwareRun.Close();
+ LMach.Close();
+ return true;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+ ///
+ /// 设置文件关联
+ ///
+ /// 扩展名(如.apk)
+ /// 映射的扩展名(如apkfile)
+ /// app名称(建议用英文数字)
+ /// 文件关联描述
+ /// 文件路径
+ public static void SetFileAssociation(string Ext, string ExtName, string sName, string AssDes, string filePath)
+ {
+ RegistryKey LRoot = Registry.ClassesRoot;
+ try
+ {
+ RegistryKey reg1 = LRoot.CreateSubKey(Ext);
+ reg1.SetValue("", ExtName);
+ reg1.Close();
+ }
+ catch { }
+ LRoot.Close();
+ SetFileAssociation(ExtName, sName, AssDes, filePath);
+ }
+ ///
+ /// 设置文件关联
+ ///
+ /// 映射的扩展名(如apkfile)
+ /// app名称(建议用英文数字)
+ /// 文件关联描述
+ /// 文件路径
+ public static void SetFileAssociation(string ExtName, string sName, string AssDes, string filePath)
+ {
+ RegistryKey LRoot = Registry.ClassesRoot;
+ try
+ {
+ SetReg(sName);
+ SetReg("open");
+ RegistryKey reg_3 = LRoot.CreateSubKey(ExtName + @"\DefaultIcon");
+ reg_3.SetValue("", filePath + ",0");
+ reg_3.Close();
+ void SetReg(string key)
+ {
+ RegistryKey reg1 = LRoot.CreateSubKey(ExtName + @"\shell\" + key);
+ reg1.SetValue("", AssDes);
+ reg1.Close();
+ RegistryKey reg_2 = LRoot.CreateSubKey(ExtName + @"\shell\" + key + "\\command");
+ reg_2.SetValue("", "\"" + filePath + "\" \"%1\"");
+ reg_2.Close();
+ }
+ }
+ catch
+ { }
+ LRoot.Close();
+ }
+ ///
+ /// 在指定文件格式右键菜单中增加菜单
+ ///
+ ///扩展名(如.apk)
+ /// app名称(建议用英文数字)
+ /// 文件关联描述
+ /// 文件路径
+ public static void SetFileAssociationOpenAs(string Ext, string sName, string AssDes, string filePath)
+ {
+ RegistryKey LRoot = Registry.ClassesRoot;
+ try
+ {
+ SetReg(sName);
+ void SetReg(string key)
+ {
+ RegistryKey reg1 = LRoot.CreateSubKey(Ext + @"\shell\" + key);
+ reg1.SetValue("", AssDes);
+ reg1.Close();
+ RegistryKey reg_2 = LRoot.CreateSubKey(Ext + @"\shell\" + key + "\\command");
+ reg_2.SetValue("", "\"" + filePath + "\" \"%1\"");
+ reg_2.Close();
+ }
+ }
+ catch { }
+ LRoot.Close();
+ }
+ ///
+ /// 删除文件关联
+ ///
+ /// 映射的扩展名(如apkfile)
+ /// app名称(建议用英文数字)
+ public static void DelFileAssociation(string ExtName, string sName)
+ {
+ RegistryKey LRoot = Registry.ClassesRoot;
+ try
+ {
+ RegistryKey reg1 = LRoot.OpenSubKey(ExtName + @"\shell");
+ if (reg1 != null)
+ {
+ reg1.DeleteSubKeyTree(sName);
+ reg1.Close();
+ }
+ }
+ catch { }
+ LRoot.Close();
+ }
+ ///
+ /// 获取文件关联是否存在
+ ///
+ /// 映射的扩展名(如apkfile)
+ /// app名称(建议用英文数字)
+ public static bool GetFileAssociation(string ExtName, string sName)
+ {
+ bool result = false;
+ RegistryKey LRoot = Registry.ClassesRoot;
+ try
+ {
+ RegistryKey reg1 = LRoot.OpenSubKey(ExtName + @"\shell\"+ sName);
+ if (reg1 != null)
+ {
+ reg1.Close();
+ result = true;
+ }
+ }
+ catch { }
+ LRoot.Close();
+ return result;
+ }
+ ///
+ /// 采用的IE模式
+ ///
+ public enum IeMode
+ {
+ ///
+ /// IE7兼容视图
+ ///
+ IE7CompatibleView = 7000,
+ ///
+ /// IE8 标准模式
+ ///
+ IE8StandardMode = 8000,
+ ///
+ /// IE8 强制标准模式,在渲染失败的情况下不尝试用兼容视图模式
+ ///
+ IE8Forced = 8888,
+ ///
+ /// IE9 标准模式
+ ///
+ IE9StandardMode = 9000,
+ ///
+ /// IE9 强制标准模式,在渲染失败的情况下不尝试用兼容视图模式
+ ///
+ IE9Forced = 9999,
+ ///
+ /// IE10 标准模式
+ ///
+ IE10StandardMode = 10000,
+ ///
+ /// IE10 强制标准模式,在渲染失败的情况下不尝试用兼容视图模式
+ ///
+ IE10Forced = 10001
+ }
+ ///
+ /// 设置当前软件的浏览器控件内核版本
+ ///
+ /// 7000 表示IE7兼容视图模式;8000 表示IE8 标准模式 ;8888 表示IE8 强制标准模式,在渲染失败的情况下不尝试用兼容视图模式
+ ///
+ public static bool SetIE_EMULATION(uint IEMode)
+ {
+ return SetIE_EMULATION(System.IO.Path.GetFileName(Application.ExecutablePath), IEMode);
+ }
+ ///
+ /// 设置指定文件的浏览器控件内核版本
+ ///
+ /// 文件名,要求不带路径
+ /// IE内核版本
+ ///
+ public static bool SetIE_EMULATION(string filename, IeMode IEMode)
+ {
+ try
+ {
+ RegistryKey LMach = RegistryKey.OpenBaseKey(RegRoot, UseSystemBit);
+ RegistryKey softwareRun = LMach.OpenSubKey(@"SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", true);
+ softwareRun.SetValue(filename, IEMode, RegistryValueKind.DWord);
+ softwareRun.Close();
+ LMach.Close();
+ return true;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+ ///
+ /// 设置当前软件的浏览器控件内核版本
+ ///
+ /// IE内核版本
+ ///
+ public static bool SetIE_EMULATION(IeMode IEMode)
+ {
+ return SetIE_EMULATION(System.IO.Path.GetFileName(Application.ExecutablePath), IEMode);
+ }
+ }
+}
diff --git a/Source/MyDb/SysFuns/RyWin32.cs b/Source/MyDb/SysFuns/RyWin32.cs
index d197c04..cc43549 100644
--- a/Source/MyDb/SysFuns/RyWin32.cs
+++ b/Source/MyDb/SysFuns/RyWin32.cs
@@ -282,5 +282,6 @@ namespace MyDb
MoveWindow(sub_form, 0, 0, size.Width, size.Height, false);
return true;
}
+
}
}
diff --git a/Source/MyDb/WinAPI/GDI32.cs b/Source/MyDb/WinAPI/GDI32.cs
new file mode 100644
index 0000000..2e34991
--- /dev/null
+++ b/Source/MyDb/WinAPI/GDI32.cs
@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace WinAPI
+{
+ ///
+ ///
+ ///
+ public class GDI32
+ {
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("gdi32")]
+ public static extern bool DeleteObject(IntPtr hObject);
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("gdi32")]
+ public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("gdi32", SetLastError = true)]
+ public static extern IntPtr CreateCompatibleDC(IntPtr hdc);
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("gdi32")]
+ public static extern IntPtr CreateDC(
+ String driverName,
+ String deviceName,
+ String output,
+ IntPtr lpInitData);
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("gdi32")]
+ public static extern bool DeleteDC(
+ IntPtr dc);
+ }
+}
diff --git a/Source/MyDb/WinAPI/Structs.cs b/Source/MyDb/WinAPI/Structs.cs
new file mode 100644
index 0000000..5b0ba23
--- /dev/null
+++ b/Source/MyDb/WinAPI/Structs.cs
@@ -0,0 +1,108 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace WinAPI
+{
+ ///
+ ///
+ ///
+ public class Struct
+ {
+ #region Struct
+ ///
+ ///
+ ///
+ [StructLayout(LayoutKind.Sequential)]
+ public struct BLENDFUNCTION
+ {
+ ///
+ ///
+ ///
+ public byte BlendOp;
+ ///
+ /// /
+ ///
+ public byte BlendFlags;
+ ///
+ ///
+ ///
+ public byte SourceConstantAlpha;
+ ///
+ ///
+ ///
+ public byte AlphaFormat;
+ }
+
+ #endregion
+ ///
+ ///
+ ///
+ [Flags]
+ public enum FlagsSetWindowPos : uint
+ {
+ ///
+ ///
+ ///
+ SWP_NOSIZE = 0x0001,
+ ///
+ ///
+ ///
+ SWP_NOMOVE = 0x0002,
+ ///
+ ///
+ ///
+ SWP_NOZORDER = 0x0004,
+ ///
+ ///
+ ///
+ SWP_NOREDRAW = 0x0008,
+ ///
+ ///
+ ///
+ SWP_NOACTIVATE = 0x0010,
+ ///
+ ///
+ ///
+ SWP_FRAMECHANGED = 0x0020,
+ ///
+ ///
+ ///
+ SWP_SHOWWINDOW = 0x0040,
+ ///
+ ///
+ ///
+ SWP_HIDEWINDOW = 0x0080,
+ ///
+ ///
+ ///
+ SWP_NOCOPYBITS = 0x0100,
+ ///
+ ///
+ ///
+ SWP_NOOWNERZORDER = 0x0200,
+ ///
+ /// /
+ ///
+ SWP_NOSENDCHANGING = 0x0400,
+ ///
+ /// /
+ ///
+ SWP_DRAWFRAME = 0x0020,
+ ///
+ ///
+ ///
+ SWP_NOREPOSITION = 0x0200,
+ ///
+ ///
+ ///
+ SWP_DEFERERASE = 0x2000,
+ ///
+ ///
+ ///
+ SWP_ASYNCWINDOWPOS = 0x4000
+ };
+ }
+}
diff --git a/Source/MyDb/WinAPI/User32.cs b/Source/MyDb/WinAPI/User32.cs
new file mode 100644
index 0000000..87ca47a
--- /dev/null
+++ b/Source/MyDb/WinAPI/User32.cs
@@ -0,0 +1,289 @@
+using System;
+using System.Text;
+using System.Drawing;
+using System.Runtime.InteropServices;
+using static WinAPI.Struct;
+using System.Windows.Forms;
+
+namespace Win32API
+{
+ ///
+ ///
+ ///
+ public partial class User32
+ {
+
+
+ #region UnmanagedMethods
+ ///
+ /// 模拟鼠标点击
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("user32")]
+ public static extern int mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
+ ///
+ /// 模拟按键
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]
+ public static extern void keybd_event(Keys bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("User32.dll", CharSet = CharSet.Auto)]
+ public static extern IntPtr GetWindowDC(IntPtr hWnd);
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("User32.dll", CharSet = CharSet.Auto)]
+ public static extern bool MoveWindow(IntPtr hWnd, int x, int y, int width, int height, bool repaint);
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern IntPtr SetParent(IntPtr hwndChild, IntPtr hwndParent);
+
+ ///
+ /// The GetParent function retrieves a handle to the specified window's parent or owner.
+ ///
+ /// Handle to the window whose parent window handle is to be retrieved.
+ /// If the window is a child window, the return value is a handle to the parent window. If the window is a top-level window, the return value is a handle to the owner window. If the window is a top-level unowned window or if the function fails, the return value is NULL.
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern IntPtr GetParent(IntPtr hwnd);
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern int SendMessage(
+ IntPtr hwnd,
+ int wMsg,
+ int wParam,
+ int lParam);
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern int SendMessage(
+ IntPtr hwnd,
+ int wMsg,
+ IntPtr wParam,
+ IntPtr lParam);
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("user32.dll", SetLastError = true)]
+ public static extern bool SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern IntPtr LoadCursorFromFile(string filename);
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern bool IsWindowVisible(IntPtr hwnd);
+
+ ///
+ /// The FindWindowEx function retrieves a handle to a window whose class name and window name match the specified strings. The function searches child windows, beginning with the one following the specified child window.
+ ///
+ /// Handle to the parent window whose child windows are to be searched.
+ /// Handle to a child window.
+ /// Specifies class name.
+ /// Pointer to a null-terminated string that specifies the window name (the window's title).
+ /// If the function succeeds, the return value is a handle to the window that has the specified class and window names.If the function fails, the return value is NULL.
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern IntPtr FindWindowEx(
+ IntPtr hwndParent,
+ IntPtr hwndChildAfter,
+ [MarshalAs(UnmanagedType.LPTStr)]
+ string lpszClass,
+ [MarshalAs(UnmanagedType.LPTStr)]
+ string lpszWindow);
+
+ ///
+ /// The InvalidateRect function adds a rectangle to the specified window's update region.
+ ///
+ /// Handle to window.
+ /// Rectangle coordinates.
+ /// Erase state.
+ /// If the function succeeds, the return value is true.If the function fails, the return value is false.
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern bool InvalidateRect(
+ IntPtr hwnd,
+ ref Rectangle rect,
+ bool bErase);
+
+ ///
+ /// The ValidateRect function validates the client area within a rectangle by removing the rectangle from the update region of the specified window.
+ ///
+ /// Handle to window.
+ /// Validation rectangle coordinates.
+ /// If the function succeeds, the return value is true.If the function fails, the return value is false.
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern bool ValidateRect(
+ IntPtr hwnd,
+ ref Rectangle rect);
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern int GetWindowLong(
+ IntPtr hWnd,
+ int dwStyle);
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern IntPtr GetDC(
+ IntPtr hwnd);
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern int ReleaseDC(
+ IntPtr hwnd,
+ IntPtr hdc);
+
+ //[DllImport("user32", SetLastError = false)]
+ //internal static extern IntPtr GetDesktopWindow();
+
+ //[DllImport("user32", CharSet = CharSet.Auto)]
+ //internal static extern int GetScrollPos(
+ // IntPtr hwnd,
+ // int nBar);
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern int GetClientRect(
+ IntPtr hwnd,
+ [In, Out] ref Rectangle rect);
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern bool GetWindowRect(
+ IntPtr hWnd,
+ [In, Out] ref Rectangle rect);
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("user32", ExactSpelling = true, SetLastError = true)]
+ public static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pprSrc, Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags);
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern uint SetWindowLong(
+ IntPtr hWnd,
+ int nIndex,
+ int dwNewLong);
+
+ ///
+ /// Changes the size, position, and Z order of a child, pop-up, or top-level window.
+ /// These windows are ordered according to their appearance on the screen.
+ /// The topmost window receives the highest rank and is the first window in the Z order.
+ ///
+ /// A handle to the window.
+ /// A handle to the window to precede the positioned window in the Z order. This parameter must be a window handle or one of the following values.
+ /// Specifies the new position of the left side of the window, in client coordinates.
+ /// Specifies the new position of the top of the window, in client coordinates.
+ /// Specifies the new width of the window, in pixels.
+ /// Specifies the new height of the window, in pixels.
+ /// Specifies the window sizing and positioning flags. This parameter can be a combination of the following values.
+ /// If the function succeeds, the return value is nonzero, if the function fails, the return value is zero.
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern int SetWindowPos(
+ IntPtr hWnd,
+ IntPtr hWndAfter,
+ int X,
+ int Y,
+ int Width,
+ int Height,
+ FlagsSetWindowPos flags);
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [DllImport("user32", CharSet = CharSet.Auto)]
+ public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X,
+ int Y, int cx, int cy, uint uFlags);
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/Source/MyDb/bin/x86/Debug/MyDb.dll b/Source/MyDb/bin/x86/Debug/MyDb.dll
index a867a7b..11202e9 100644
Binary files a/Source/MyDb/bin/x86/Debug/MyDb.dll and b/Source/MyDb/bin/x86/Debug/MyDb.dll differ
diff --git a/Source/MyDb/bin/x86/Release/MyDb.dll b/Source/MyDb/bin/x86/Release/MyDb.dll
index 4594bfc..06bbe29 100644
Binary files a/Source/MyDb/bin/x86/Release/MyDb.dll and b/Source/MyDb/bin/x86/Release/MyDb.dll differ
diff --git a/Source/ryControls/Controls/rySearch.cs b/Source/ryControls/Controls/rySearch.cs
index 1c7ee0c..46c86e5 100644
--- a/Source/ryControls/Controls/rySearch.cs
+++ b/Source/ryControls/Controls/rySearch.cs
@@ -212,8 +212,8 @@ namespace ryControls
else
{
HaveTextShow(); txtSearch.Text = _text;
- txtSearch.Select(0, 1);
- txtSearch.Select(_text.Length, 0);
+ //txtSearch.Select(0, 1);
+ //txtSearch.Select(_text.Length, 0);
}
}
}
diff --git a/Source/ryControls/ObjectListView/Rendering/Drawing.cs b/Source/ryControls/ObjectListView/Rendering/Drawing.cs
new file mode 100644
index 0000000..caf7bde
--- /dev/null
+++ b/Source/ryControls/ObjectListView/Rendering/Drawing.cs
@@ -0,0 +1,126 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Text;
+
+namespace ryControls
+{
+ ///
+ /// 建立圆角路径的样式。
+ ///
+ public enum RoundStyle
+ {
+ ///
+ /// 四个角都不是圆角。
+ ///
+ None = 0,
+ ///
+ /// 四个角都为圆角。
+ ///
+ All = 1,
+ ///
+ /// 左边两个角为圆角。
+ ///
+ Left = 2,
+ ///
+ /// 右边两个角为圆角。
+ ///
+ Right = 3,
+ ///
+ /// 上边两个角为圆角。
+ ///
+ Top = 4,
+ ///
+ /// 下边两个角为圆角。
+ ///
+ Bottom = 5,
+ ///
+ /// 左下角为圆角。
+ ///
+ BottomLeft = 6,
+ ///
+ /// 右下角为圆角。
+ ///
+ BottomRight = 7
+ }
+ ///
+ /// 画图相关API
+ ///
+ public class Drawing
+ {
+ ///
+ /// 建立带有圆角样式的路径。
+ ///
+ /// 用来建立路径的矩形。
+ /// 圆角的大小。
+ /// 圆角的样式。
+ /// 是否把矩形长宽减 1,以便画出边框。
+ /// 建立的路径。
+ public static GraphicsPath CreatePath(Rectangle rect, int radius, RoundStyle style, bool correction)
+ {
+ GraphicsPath path = new GraphicsPath();
+ int radiusCorrection = correction ? 1 : 0;
+ switch (style)
+ {
+ case RoundStyle.None:
+ path.AddRectangle(rect);
+ break;
+ case RoundStyle.All:
+ path.AddArc(rect.X, rect.Y, radius, radius, 180, 90);
+ path.AddArc(rect.Right - radius - radiusCorrection, rect.Y, radius, radius, 270, 90);
+ path.AddArc(rect.Right - radius - radiusCorrection, rect.Bottom - radius - radiusCorrection, radius, radius, 0, 90);
+ path.AddArc(rect.X, rect.Bottom - radius - radiusCorrection, radius, radius, 90, 90);
+ break;
+ case RoundStyle.Left:
+ path.AddArc(rect.X, rect.Y, radius, radius, 180, 90);
+ path.AddLine(rect.Right - radiusCorrection, rect.Y, rect.Right - radiusCorrection, rect.Bottom - radiusCorrection);
+ path.AddArc(rect.X, rect.Bottom - radius - radiusCorrection, radius, radius, 90, 90);
+ break;
+ case RoundStyle.Right:
+ path.AddArc(rect.Right - radius - radiusCorrection, rect.Y, radius, radius, 270, 90);
+ path.AddArc(rect.Right - radius - radiusCorrection, rect.Bottom - radius - radiusCorrection, radius, radius, 0, 90);
+ path.AddLine(rect.X, rect.Bottom - radiusCorrection, rect.X, rect.Y);
+ break;
+ case RoundStyle.Top:
+ path.AddArc(rect.X, rect.Y, radius, radius, 180, 90);
+ path.AddArc(rect.Right - radius - radiusCorrection, rect.Y, radius, radius, 270, 90);
+ path.AddLine(rect.Right - radiusCorrection, rect.Bottom - radiusCorrection, rect.X, rect.Bottom - radiusCorrection);
+ break;
+ case RoundStyle.Bottom:
+ path.AddArc(rect.Right - radius - radiusCorrection, rect.Bottom - radius - radiusCorrection, radius, radius, 0, 90);
+ path.AddArc(rect.X, rect.Bottom - radius - radiusCorrection, radius, radius, 90, 90);
+ path.AddLine(rect.X, rect.Y, rect.Right - radiusCorrection, rect.Y);
+ break;
+ case RoundStyle.BottomLeft:
+ path.AddArc(
+ rect.X,
+ rect.Bottom - radius - radiusCorrection,
+ radius,
+ radius,
+ 90,
+ 90);
+ path.AddLine(rect.X, rect.Y, rect.Right - radiusCorrection, rect.Y);
+ path.AddLine(
+ rect.Right - radiusCorrection,
+ rect.Y,
+ rect.Right - radiusCorrection,
+ rect.Bottom - radiusCorrection);
+ break;
+ case RoundStyle.BottomRight:
+ path.AddArc(
+ rect.Right - radius - radiusCorrection,
+ rect.Bottom - radius - radiusCorrection,
+ radius,
+ radius,
+ 0,
+ 90);
+ path.AddLine(rect.X, rect.Bottom - radiusCorrection, rect.X, rect.Y);
+ path.AddLine(rect.X, rect.Y, rect.Right - radiusCorrection, rect.Y);
+ break;
+ }
+ path.CloseFigure(); //这句很关键,缺少会没有左边线。
+ return path;
+ }
+ }
+}
diff --git a/Source/ryControls/ObjectListView/Rendering/Renderers.cs b/Source/ryControls/ObjectListView/Rendering/Renderers.cs
index 115cc90..b658b22 100644
--- a/Source/ryControls/ObjectListView/Rendering/Renderers.cs
+++ b/Source/ryControls/ObjectListView/Rendering/Renderers.cs
@@ -114,14 +114,12 @@ using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
using Timer = System.Threading.Timer;
-namespace BrightIdeasSoftware
-{
+namespace BrightIdeasSoftware {
///
/// Renderers are the mechanism used for owner drawing cells. As such, they can also handle
/// hit detection and positioning of cell editing rectangles.
///
- public interface IRenderer
- {
+ public interface IRenderer {
///
/// Render the whole item within an ObjectListView. This is only used in non-Details views.
///
@@ -180,8 +178,7 @@ namespace BrightIdeasSoftware
///
[Browsable(true),
ToolboxItem(false)]
- public class AbstractRenderer : Component, IRenderer
- {
+ public class AbstractRenderer : Component, IRenderer {
#region IRenderer Members
///
@@ -192,8 +189,7 @@ namespace BrightIdeasSoftware
/// The bounds of the item
/// The model object to be drawn
/// Return true to indicate that the event was handled and no further processing is needed.
- public virtual bool RenderItem(DrawListViewItemEventArgs e, Graphics g, Rectangle itemBounds, object rowObject)
- {
+ public virtual bool RenderItem(DrawListViewItemEventArgs e, Graphics g, Rectangle itemBounds, object rowObject) {
return true;
}
@@ -205,8 +201,7 @@ namespace BrightIdeasSoftware
/// The bounds of the cell
/// The model object to be drawn
/// Return true to indicate that the event was handled and no further processing is needed.
- public virtual bool RenderSubItem(DrawListViewSubItemEventArgs e, Graphics g, Rectangle cellBounds, object rowObject)
- {
+ public virtual bool RenderSubItem(DrawListViewSubItemEventArgs e, Graphics g, Rectangle cellBounds, object rowObject) {
return false;
}
@@ -217,7 +212,7 @@ namespace BrightIdeasSoftware
/// x co-ordinate
/// y co-ordinate
/// This method should only alter HitTestLocation and/or UserData.
- public virtual void HitTest(OlvListViewHitTestInfo hti, int x, int y) { }
+ public virtual void HitTest(OlvListViewHitTestInfo hti, int x, int y) {}
///
/// When the value in the given cell is to be edited, where should the edit rectangle be placed?
@@ -228,8 +223,7 @@ namespace BrightIdeasSoftware
///
///
///
- public virtual Rectangle GetEditRectangle(Graphics g, Rectangle cellBounds, OLVListItem item, int subItemIndex, Size preferredSize)
- {
+ public virtual Rectangle GetEditRectangle(Graphics g, Rectangle cellBounds, OLVListItem item, int subItemIndex, Size preferredSize) {
return cellBounds;
}
@@ -240,10 +234,8 @@ namespace BrightIdeasSoftware
/// This class provides compatibility for v1 RendererDelegates
///
[ToolboxItem(false)]
- internal class Version1Renderer : AbstractRenderer
- {
- public Version1Renderer(RenderDelegate renderDelegate)
- {
+ internal class Version1Renderer : AbstractRenderer {
+ public Version1Renderer(RenderDelegate renderDelegate) {
this.RenderDelegate = renderDelegate;
}
@@ -254,8 +246,7 @@ namespace BrightIdeasSoftware
#region IRenderer Members
- public override bool RenderSubItem(DrawListViewSubItemEventArgs e, Graphics g, Rectangle cellBounds, object rowObject)
- {
+ public override bool RenderSubItem(DrawListViewSubItemEventArgs e, Graphics g, Rectangle cellBounds, object rowObject) {
if (this.RenderDelegate == null)
return base.RenderSubItem(e, g, cellBounds, rowObject);
else
@@ -274,8 +265,7 @@ namespace BrightIdeasSoftware
///
[Browsable(true),
ToolboxItem(true)]
- public class BaseRenderer : AbstractRenderer
- {
+ public class BaseRenderer : AbstractRenderer {
internal const TextFormatFlags NormalTextFormatFlags = TextFormatFlags.NoPrefix |
TextFormatFlags.EndEllipsis |
TextFormatFlags.PreserveGraphicsTranslateTransform;
@@ -289,11 +279,9 @@ namespace BrightIdeasSoftware
[Category("Appearance"),
Description("Can the renderer wrap text that does not fit completely within the cell"),
DefaultValue(false)]
- public bool CanWrap
- {
+ public bool CanWrap {
get { return canWrap; }
- set
- {
+ set {
canWrap = value;
if (canWrap)
this.UseGdiTextRendering = false;
@@ -313,8 +301,7 @@ namespace BrightIdeasSoftware
[Category("ObjectListView"),
Description("The number of pixels that renderer will leave empty around the edge of the cell"),
DefaultValue(null)]
- public Rectangle? CellPadding
- {
+ public Rectangle? CellPadding {
get { return this.cellPadding; }
set { this.cellPadding = value; }
}
@@ -340,8 +327,7 @@ namespace BrightIdeasSoftware
[Category("ObjectListView"),
Description("How will cell values be vertically aligned?"),
DefaultValue(null)]
- public virtual StringAlignment? CellVerticalAlignment
- {
+ public virtual StringAlignment? CellVerticalAlignment {
get { return this.cellVerticalAlignment; }
set { this.cellVerticalAlignment = value; }
}
@@ -352,10 +338,8 @@ namespace BrightIdeasSoftware
/// This property considers all possible sources of padding
///
[Browsable(false)]
- protected virtual Rectangle? EffectiveCellPadding
- {
- get
- {
+ protected virtual Rectangle? EffectiveCellPadding {
+ get {
if (this.cellPadding.HasValue)
return this.cellPadding.Value;
@@ -380,10 +364,8 @@ namespace BrightIdeasSoftware
/// This property considers all possible sources.
///
[Browsable(false)]
- protected virtual StringAlignment EffectiveCellVerticalAlignment
- {
- get
- {
+ protected virtual StringAlignment EffectiveCellVerticalAlignment {
+ get {
if (this.cellVerticalAlignment.HasValue)
return this.cellVerticalAlignment.Value;
@@ -409,8 +391,7 @@ namespace BrightIdeasSoftware
[Category("Appearance"),
Description("The image list from which keyed images will be fetched for drawing. If this is not given, the small ImageList from the ObjectListView will be used"),
DefaultValue(null)]
- public ImageList ImageList
- {
+ public ImageList ImageList {
get { return imageList; }
set { imageList = value; }
}
@@ -423,8 +404,7 @@ namespace BrightIdeasSoftware
[Category("Appearance"),
Description("When rendering multiple images, how many pixels should be between each image?"),
DefaultValue(1)]
- public int Spacing
- {
+ public int Spacing {
get { return spacing; }
set { spacing = value; }
}
@@ -438,10 +418,8 @@ namespace BrightIdeasSoftware
[Category("Appearance"),
Description("Should text be rendered using GDI routines?"),
DefaultValue(true)]
- public virtual bool UseGdiTextRendering
- {
- get
- {
+ public virtual bool UseGdiTextRendering {
+ get {
// Can't use GDI routines on a GDI+ printer context
return !this.IsPrinting && useGdiTextRendering;
}
@@ -458,10 +436,8 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public Object Aspect
- {
- get
- {
+ public Object Aspect {
+ get {
if (aspect == null)
aspect = column.GetValue(this.rowObject);
return aspect;
@@ -476,8 +452,7 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public Rectangle Bounds
- {
+ public Rectangle Bounds {
get { return bounds; }
set { bounds = value; }
}
@@ -489,8 +464,7 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public OLVColumn Column
- {
+ public OLVColumn Column {
get { return column; }
set { column = value; }
}
@@ -502,8 +476,7 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public DrawListViewItemEventArgs DrawItemEvent
- {
+ public DrawListViewItemEventArgs DrawItemEvent {
get { return drawItemEventArgs; }
set { drawItemEventArgs = value; }
}
@@ -515,8 +488,7 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public DrawListViewSubItemEventArgs Event
- {
+ public DrawListViewSubItemEventArgs Event {
get { return eventArgs; }
set { eventArgs = value; }
}
@@ -528,10 +500,8 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public Font Font
- {
- get
- {
+ public Font Font {
+ get {
if (this.font != null || this.ListItem == null)
return this.font;
@@ -550,8 +520,7 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public ImageList ImageListOrDefault
- {
+ public ImageList ImageListOrDefault {
get { return this.ImageList ?? this.ListView.SmallImageList; }
}
@@ -560,8 +529,7 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public bool IsDrawBackground
- {
+ public bool IsDrawBackground {
get { return !this.IsPrinting; }
}
@@ -570,8 +538,7 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public bool IsItemSelected
- {
+ public bool IsItemSelected {
get { return isItemSelected; }
set { isItemSelected = value; }
}
@@ -583,8 +550,7 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public bool IsPrinting
- {
+ public bool IsPrinting {
get { return isPrinting; }
set { isPrinting = value; }
}
@@ -596,8 +562,7 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public OLVListItem ListItem
- {
+ public OLVListItem ListItem {
get { return listItem; }
set { listItem = value; }
}
@@ -609,8 +574,7 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public ObjectListView ListView
- {
+ public ObjectListView ListView {
get { return objectListView; }
set { objectListView = value; }
}
@@ -623,8 +587,7 @@ namespace BrightIdeasSoftware
/// This returns null for column 0.
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public OLVListSubItem OLVSubItem
- {
+ public OLVListSubItem OLVSubItem {
get { return listSubItem as OLVListSubItem; }
}
@@ -633,8 +596,7 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public Object RowObject
- {
+ public Object RowObject {
get { return rowObject; }
set { rowObject = value; }
}
@@ -646,8 +608,7 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public OLVListSubItem SubItem
- {
+ public OLVListSubItem SubItem {
get { return listSubItem; }
set { listSubItem = value; }
}
@@ -659,10 +620,8 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public Brush TextBrush
- {
- get
- {
+ public Brush TextBrush {
+ get {
if (textBrush == null)
return new SolidBrush(this.GetForegroundColor());
else
@@ -674,26 +633,27 @@ namespace BrightIdeasSoftware
private Brush textBrush;
///
- /// ȾǷʹøObjectListViewеԶͼƸѡͼ
+ /// Will this renderer use the custom images from the parent ObjectListView
+ /// to draw the checkbox images.
///
///
///
- /// ΪtrueȾʹStateImageListеͼʾѡ0-δѡУ1-ѡУ2-ȷ
+ /// If this is true, the renderer will use the images from the
+ /// StateImageList to represent checkboxes. 0 - unchecked, 1 - checked, 2 - indeterminate.
///
- /// ΪFalse(Ĭֵ)Ⱦʹ.NETıCheckBoxRenender
+ /// If this is false (the default), then the renderer will use .NET's standard
+ /// CheckBoxRenderer.
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public bool UseCustomCheckboxImages
- {
+ public bool UseCustomCheckboxImages {
get { return useCustomCheckboxImages; }
set { useCustomCheckboxImages = value; }
}
private bool useCustomCheckboxImages;
- private void ClearState()
- {
+ private void ClearState() {
this.Event = null;
this.DrawItemEvent = null;
this.Aspect = null;
@@ -712,19 +672,16 @@ namespace BrightIdeasSoftware
/// The cell's bounds
/// The rectangle to be aligned within the bounds
/// An aligned rectangle
- protected virtual Rectangle AlignRectangle(Rectangle outer, Rectangle inner)
- {
+ protected virtual Rectangle AlignRectangle(Rectangle outer, Rectangle inner) {
Rectangle r = new Rectangle(outer.Location, inner.Size);
// Align horizontally depending on the column alignment
- if (inner.Width < outer.Width)
- {
+ if (inner.Width < outer.Width) {
r.X = AlignHorizontally(outer, inner);
}
// Align vertically too
- if (inner.Height < outer.Height)
- {
+ if (inner.Height < outer.Height) {
r.Y = AlignVertically(outer, inner);
}
@@ -738,11 +695,9 @@ namespace BrightIdeasSoftware
///
///
///
- protected int AlignHorizontally(Rectangle outer, Rectangle inner)
- {
+ protected int AlignHorizontally(Rectangle outer, Rectangle inner) {
HorizontalAlignment alignment = this.CellHorizontalAlignment;
- switch (alignment)
- {
+ switch (alignment) {
case HorizontalAlignment.Left:
return outer.Left + 1;
case HorizontalAlignment.Center:
@@ -762,8 +717,7 @@ namespace BrightIdeasSoftware
///
///
///
- protected int AlignVertically(Rectangle outer, Rectangle inner)
- {
+ protected int AlignVertically(Rectangle outer, Rectangle inner) {
return AlignVertically(outer, inner.Height);
}
@@ -774,10 +728,8 @@ namespace BrightIdeasSoftware
///
///
///
- protected int AlignVertically(Rectangle outer, int innerHeight)
- {
- switch (this.EffectiveCellVerticalAlignment)
- {
+ protected int AlignVertically(Rectangle outer, int innerHeight) {
+ switch (this.EffectiveCellVerticalAlignment) {
case StringAlignment.Near:
return outer.Top + 1;
case StringAlignment.Center:
@@ -796,8 +748,7 @@ namespace BrightIdeasSoftware
///
/// Pre-padded bounds of the cell
///
- protected virtual Rectangle CalculateAlignedRectangle(Graphics g, Rectangle r)
- {
+ protected virtual Rectangle CalculateAlignedRectangle(Graphics g, Rectangle r) {
if (this.Column == null)
return r;
@@ -832,13 +783,12 @@ namespace BrightIdeasSoftware
///
/// Pre-padded cell bounds
///
- protected Rectangle CalculateCheckBoxBounds(Graphics g, Rectangle cellBounds)
- {
+ protected Rectangle CalculateCheckBoxBounds(Graphics g, Rectangle cellBounds) {
Size checkBoxSize = this.CalculateCheckBoxSize(g);
return this.AlignRectangle(cellBounds, new Rectangle(0, 0, checkBoxSize.Width, checkBoxSize.Height));
}
-
-
+
+
///
/// How much space will the check box for this cell occupy?
///
@@ -861,11 +811,10 @@ namespace BrightIdeasSoftware
///
///
///
- protected virtual Size CalculatePrimaryCheckBoxSize(Graphics g)
- {
+ protected virtual Size CalculatePrimaryCheckBoxSize(Graphics g) {
if (!this.ListView.CheckBoxes || !this.ColumnIsPrimary)
return Size.Empty;
-
+
Size size = this.CalculateCheckBoxSize(g);
size.Width += 6;
return size;
@@ -962,10 +911,9 @@ namespace BrightIdeasSoftware
Size proposedSize = new Size(width, Int32.MaxValue);
return TextRenderer.MeasureText(g, txt, this.Font, proposedSize, NormalTextFormatFlags);
}
-
+
// Using GDI+ renderering
- using (StringFormat fmt = new StringFormat())
- {
+ using (StringFormat fmt = new StringFormat()) {
fmt.Trimming = StringTrimming.EllipsisCharacter;
SizeF sizeF = g.MeasureString(txt, this.Font, width, fmt);
return new Size(1 + (int)sizeF.Width, 1 + (int)sizeF.Height);
@@ -976,8 +924,7 @@ namespace BrightIdeasSoftware
/// Return the Color that is the background color for this item's cell
///
/// The background color of the subitem
- public virtual Color GetBackgroundColor()
- {
+ public virtual Color GetBackgroundColor() {
if (!this.ListView.Enabled)
return SystemColors.Control;
@@ -994,9 +941,8 @@ namespace BrightIdeasSoftware
/// Return the color of the background color when the item is selected
///
/// The background color of the subitem
- public virtual Color GetSelectedBackgroundColor()
- {
- if (this.ListView.Focused)
+ public virtual Color GetSelectedBackgroundColor() {
+ if (this.ListView.Focused)
return this.ListItem.SelectedBackColor ?? this.ListView.SelectedBackColorOrDefault;
if (!this.ListView.HideSelection)
@@ -1009,11 +955,10 @@ namespace BrightIdeasSoftware
/// Return the color to be used for text in this cell
///
/// The text color of the subitem
- public virtual Color GetForegroundColor()
- {
- if (this.IsItemSelected &&
+ public virtual Color GetForegroundColor() {
+ if (this.IsItemSelected &&
!this.ListView.UseTranslucentSelection &&
- (this.ColumnIsPrimary || this.ListView.FullRowSelect))
+ (this.ColumnIsPrimary || this.ListView.FullRowSelect))
return this.GetSelectedForegroundColor();
return this.SubItem == null || this.ListItem.UseItemStyleForSubItems ? this.ListItem.ForeColor : this.SubItem.ForeColor;
@@ -1038,8 +983,7 @@ namespace BrightIdeasSoftware
/// Return the image that should be drawn against this subitem
///
/// An Image or null if no image should be drawn.
- protected virtual Image GetImage()
- {
+ protected virtual Image GetImage() {
return this.GetImage(this.GetImageSelector());
}
@@ -1053,17 +997,14 @@ namespace BrightIdeasSoftware
///
/// The value that indicates the image to be used
/// An Image or null
- protected virtual Image GetImage(Object imageSelector)
- {
+ protected virtual Image GetImage(Object imageSelector) {
if (imageSelector == null || imageSelector == DBNull.Value)
return null;
ImageList il = this.ImageListOrDefault;
- if (il != null)
- {
- if (imageSelector is Int32)
- {
- Int32 index = (Int32)imageSelector;
+ if (il != null) {
+ if (imageSelector is Int32) {
+ Int32 index = (Int32) imageSelector;
if (index < 0 || index >= il.Images.Count)
return null;
@@ -1071,8 +1012,7 @@ namespace BrightIdeasSoftware
}
String str = imageSelector as String;
- if (str != null)
- {
+ if (str != null) {
if (il.Images.ContainsKey(str))
return il.Images[str];
@@ -1085,8 +1025,7 @@ namespace BrightIdeasSoftware
///
///
- protected virtual Object GetImageSelector()
- {
+ protected virtual Object GetImageSelector() {
return this.ColumnIsPrimary ? this.ListItem.ImageSelector : this.OLVSubItem.ImageSelector;
}
@@ -1094,8 +1033,7 @@ namespace BrightIdeasSoftware
/// Return the string that should be drawn within this
///
///
- protected virtual string GetText()
- {
+ protected virtual string GetText() {
return this.SubItem == null ? this.ListItem.Text : this.SubItem.Text;
}
@@ -1104,8 +1042,7 @@ namespace BrightIdeasSoftware
///
/// The background color of the subitem's text
[Obsolete("Use GetBackgroundColor() instead")]
- protected virtual Color GetTextBackgroundColor()
- {
+ protected virtual Color GetTextBackgroundColor() {
return Color.Red; // just so it shows up if it is used
}
@@ -1121,8 +1058,7 @@ namespace BrightIdeasSoftware
///
///
///
- public override bool RenderItem(DrawListViewItemEventArgs e, Graphics g, Rectangle itemBounds, object model)
- {
+ public override bool RenderItem(DrawListViewItemEventArgs e, Graphics g, Rectangle itemBounds, object model) {
this.ConfigureItem(e, itemBounds, model);
return this.OptionalRender(g, itemBounds);
}
@@ -1156,8 +1092,7 @@ namespace BrightIdeasSoftware
///
///
///
- public override bool RenderSubItem(DrawListViewSubItemEventArgs e, Graphics g, Rectangle cellBounds, object model)
- {
+ public override bool RenderSubItem(DrawListViewSubItemEventArgs e, Graphics g, Rectangle cellBounds, object model) {
this.ConfigureSubItem(e, cellBounds, model);
return this.OptionalRender(g, cellBounds);
}
@@ -1169,8 +1104,7 @@ namespace BrightIdeasSoftware
///
///
/// Use this if you want to chain a second renderer within a primary renderer.
- public virtual void ConfigureSubItem(DrawListViewSubItemEventArgs e, Rectangle cellBounds, object model)
- {
+ public virtual void ConfigureSubItem(DrawListViewSubItemEventArgs e, Rectangle cellBounds, object model) {
this.ClearState();
this.Event = e;
@@ -1189,8 +1123,7 @@ namespace BrightIdeasSoftware
///
///
///
- public override void HitTest(OlvListViewHitTestInfo hti, int x, int y)
- {
+ public override void HitTest(OlvListViewHitTestInfo hti, int x, int y) {
this.ClearState();
this.ListView = hti.ListView;
@@ -1204,8 +1137,7 @@ namespace BrightIdeasSoftware
else
this.Bounds = this.ListItem.GetSubItemBounds(this.Column.Index);
- using (Graphics g = this.ListView.CreateGraphics())
- {
+ using (Graphics g = this.ListView.CreateGraphics()) {
this.HandleHitTest(g, hti, x, y);
}
}
@@ -1219,11 +1151,10 @@ namespace BrightIdeasSoftware
///
///
///
- public override Rectangle GetEditRectangle(Graphics g, Rectangle cellBounds, OLVListItem item, int subItemIndex, Size preferredSize)
- {
+ public override Rectangle GetEditRectangle(Graphics g, Rectangle cellBounds, OLVListItem item, int subItemIndex, Size preferredSize) {
this.ClearState();
- this.ListView = (ObjectListView)item.ListView;
+ this.ListView = (ObjectListView) item.ListView;
this.ListItem = item;
this.SubItem = item.GetSubItem(subItemIndex);
this.Column = this.ListView.GetColumn(subItemIndex);
@@ -1251,8 +1182,7 @@ namespace BrightIdeasSoftware
/// Returns whether the rendering has already taken place.
/// If this returns false, the default processing will take over.
///
- public virtual bool OptionalRender(Graphics g, Rectangle r)
- {
+ public virtual bool OptionalRender(Graphics g, Rectangle r) {
if (this.ListView.View != View.Details)
return false;
@@ -1268,8 +1198,7 @@ namespace BrightIdeasSoftware
/// to fall back on the default processing
/// The graphics context that should be used for drawing
/// The bounds of the subitem cell
- public virtual void Render(Graphics g, Rectangle r)
- {
+ public virtual void Render(Graphics g, Rectangle r) {
this.StandardRender(g, r);
}
@@ -1280,8 +1209,7 @@ namespace BrightIdeasSoftware
///
///
///
- protected virtual void HandleHitTest(Graphics g, OlvListViewHitTestInfo hti, int x, int y)
- {
+ protected virtual void HandleHitTest(Graphics g, OlvListViewHitTestInfo hti, int x, int y) {
Rectangle r = this.CalculateAlignedRectangle(g, ApplyCellPadding(this.Bounds));
this.StandardHitTest(g, hti, r, x, y);
}
@@ -1295,8 +1223,7 @@ namespace BrightIdeasSoftware
///
///
///
- protected virtual Rectangle HandleGetEditRectangle(Graphics g, Rectangle cellBounds, OLVListItem item, int subItemIndex, Size preferredSize)
- {
+ protected virtual Rectangle HandleGetEditRectangle(Graphics g, Rectangle cellBounds, OLVListItem item, int subItemIndex, Size preferredSize) {
// MAINTAINER NOTE: This type testing is wrong (design-wise). The base class should return cell bounds,
// and a more specialized class should return StandardGetEditRectangle(). But BaseRenderer is used directly
// to draw most normal cells, as well as being directly subclassed for user implemented renderers. And this
@@ -1304,7 +1231,7 @@ namespace BrightIdeasSoftware
// BaseRenderer into an ABC -- but that would break too much existing code. And so we have this hack :(
// If we are a standard renderer, return the position of the text, otherwise, use the whole cell.
- if (this.GetType() == typeof(BaseRenderer))
+ if (this.GetType() == typeof (BaseRenderer))
return this.StandardGetEditRectangle(g, cellBounds, preferredSize);
// Center the editor vertically
@@ -1323,13 +1250,11 @@ namespace BrightIdeasSoftware
///
///
///
- protected void StandardRender(Graphics g, Rectangle r)
- {
+ protected void StandardRender(Graphics g, Rectangle r) {
this.DrawBackground(g, r);
// Adjust the first columns rectangle to match the padding used by the native mode of the ListView
- if (this.ColumnIsPrimary && this.CellHorizontalAlignment == HorizontalAlignment.Left)
- {
+ if (this.ColumnIsPrimary && this.CellHorizontalAlignment == HorizontalAlignment.Left ) {
r.X += 3;
r.Width -= 1;
}
@@ -1346,8 +1271,7 @@ namespace BrightIdeasSoftware
///
///
///
- public virtual Rectangle ApplyCellPadding(Rectangle r)
- {
+ public virtual Rectangle ApplyCellPadding(Rectangle r) {
Rectangle? padding = this.EffectiveCellPadding;
if (!padding.HasValue)
return r;
@@ -1367,28 +1291,24 @@ namespace BrightIdeasSoftware
///
///
///
- protected virtual void StandardHitTest(Graphics g, OlvListViewHitTestInfo hti, Rectangle alignedContentRectangle, int x, int y)
- {
+ protected virtual void StandardHitTest(Graphics g, OlvListViewHitTestInfo hti, Rectangle alignedContentRectangle, int x, int y) {
Rectangle r = alignedContentRectangle;
// Match tweaking from renderer
- if (this.ColumnIsPrimary && this.CellHorizontalAlignment == HorizontalAlignment.Left && !(this is TreeListView.TreeRenderer))
- {
+ if (this.ColumnIsPrimary && this.CellHorizontalAlignment == HorizontalAlignment.Left && !(this is TreeListView.TreeRenderer)) {
r.X += 3;
r.Width -= 1;
}
int width = 0;
// Did they hit a check box on the primary column?
- if (this.ColumnIsPrimary && this.ListView.CheckBoxes)
- {
+ if (this.ColumnIsPrimary && this.ListView.CheckBoxes) {
Size checkBoxSize = this.CalculateCheckBoxSize(g);
int checkBoxTop = this.AlignVertically(r, checkBoxSize.Height);
Rectangle r3 = new Rectangle(r.X, checkBoxTop, checkBoxSize.Width, checkBoxSize.Height);
width = r3.Width + 6;
// g.DrawRectangle(Pens.DarkGreen, r3);
- if (r3.Contains(x, y))
- {
+ if (r3.Contains(x, y)) {
hti.HitTestLocation = HitTestLocation.CheckBox;
return;
}
@@ -1403,8 +1323,7 @@ namespace BrightIdeasSoftware
Rectangle rTwo = r;
rTwo.Width = width;
// g.DrawRectangle(Pens.Red, rTwo);
- if (rTwo.Contains(x, y))
- {
+ if (rTwo.Contains(x, y)) {
if (this.Column != null && (this.Column.Index > 0 && this.Column.CheckBoxes))
hti.HitTestLocation = HitTestLocation.CheckBox;
else
@@ -1419,8 +1338,7 @@ namespace BrightIdeasSoftware
rTwo = r;
rTwo.Width = width;
// g.DrawRectangle(Pens.Blue, rTwo);
- if (rTwo.Contains(x, y))
- {
+ if (rTwo.Contains(x, y)) {
hti.HitTestLocation = HitTestLocation.Text;
return;
}
@@ -1438,8 +1356,7 @@ namespace BrightIdeasSoftware
///
///
///
- protected virtual Rectangle StandardGetEditRectangle(Graphics g, Rectangle cellBounds, Size preferredSize)
- {
+ protected virtual Rectangle StandardGetEditRectangle(Graphics g, Rectangle cellBounds, Size preferredSize) {
Size contentSize = this.CalculateContentSize(g, cellBounds);
int contentWidth = this.Column.CellEditUseWholeCellEffective ? cellBounds.Width : contentSize.Width;
@@ -1451,8 +1368,7 @@ namespace BrightIdeasSoftware
int width = checkBoxSize.Width + imageWidth;
// Indent the primary column by the required amount
- if (this.ListItem.IndentCount > 0)
- {
+ if (this.ListItem.IndentCount > 0) {
int indentWidth = this.ListView.SmallImageSize.Width * this.ListItem.IndentCount;
width += indentWidth;
}
@@ -1476,8 +1392,7 @@ namespace BrightIdeasSoftware
///
///
///
- protected Rectangle CalculatePaddedAlignedBounds(Graphics g, Rectangle cellBounds, Size preferredSize)
- {
+ protected Rectangle CalculatePaddedAlignedBounds(Graphics g, Rectangle cellBounds, Size preferredSize) {
Rectangle r = ApplyCellPadding(cellBounds);
r = this.AlignRectangle(r, new Rectangle(Point.Empty, preferredSize));
return r;
@@ -1497,8 +1412,7 @@ namespace BrightIdeasSoftware
/// Graphics context to use for drawing
/// Bounds of the cell
/// The image to be drawn
- protected virtual void DrawAlignedImage(Graphics g, Rectangle r, Image image)
- {
+ protected virtual void DrawAlignedImage(Graphics g, Rectangle r, Image image) {
if (image == null)
return;
@@ -1507,10 +1421,9 @@ namespace BrightIdeasSoftware
// If the image is too tall to be drawn in the space provided, proportionally scale it down.
// Too wide images are not scaled.
- if (image.Height > r.Height)
- {
- float scaleRatio = (float)r.Height / (float)image.Height;
- imageBounds.Width = (int)((float)image.Width * scaleRatio);
+ if (image.Height > r.Height) {
+ float scaleRatio = (float) r.Height / (float) image.Height;
+ imageBounds.Width = (int) ((float) image.Width * scaleRatio);
imageBounds.Height = r.Height - 1;
}
@@ -1527,8 +1440,7 @@ namespace BrightIdeasSoftware
///
/// Graphics context to use for drawing
/// Pre-padded bounds of the cell
- protected virtual void DrawAlignedImageAndText(Graphics g, Rectangle r)
- {
+ protected virtual void DrawAlignedImageAndText(Graphics g, Rectangle r) {
this.DrawImageAndText(g, this.CalculateAlignedRectangle(g, r));
}
@@ -1537,15 +1449,13 @@ namespace BrightIdeasSoftware
///
/// Graphics context to use for drawing
/// Bounds of the cell
- protected virtual void DrawBackground(Graphics g, Rectangle r)
- {
+ protected virtual void DrawBackground(Graphics g, Rectangle r) {
if (!this.IsDrawBackground)
return;
Color backgroundColor = this.GetBackgroundColor();
- using (Brush brush = new SolidBrush(backgroundColor))
- {
+ using (Brush brush = new SolidBrush(backgroundColor)) {
g.FillRectangle(brush, r.X - 1, r.Y - 1, r.Width + 2, r.Height + 2);
}
}
@@ -1555,8 +1465,7 @@ namespace BrightIdeasSoftware
///
/// Graphics context to use for drawing
/// The pre-aligned and padded target rectangle
- protected virtual int DrawCheckBox(Graphics g, Rectangle r)
- {
+ protected virtual int DrawCheckBox(Graphics g, Rectangle r) {
// The odd constants are to match checkbox placement in native mode (on XP at least)
// TODO: Unify this with CheckStateRenderer
@@ -1564,8 +1473,7 @@ namespace BrightIdeasSoftware
Size checkBoxSize = this.CalculateCheckBoxSize(g);
Point checkBoxLocation = new Point(r.X, this.AlignVertically(r, checkBoxSize.Height));
- if (this.IsPrinting || this.UseCustomCheckboxImages)
- {
+ if (this.IsPrinting || this.UseCustomCheckboxImages) {
int imageIndex = this.ListItem.StateImageIndex;
if (this.ListView.StateImageList == null || imageIndex < 0 || imageIndex >= this.ListView.StateImageList.Images.Count)
return 0;
@@ -1583,14 +1491,11 @@ namespace BrightIdeasSoftware
///
///
///
- protected virtual CheckBoxState GetCheckBoxState(CheckState checkState)
- {
+ protected virtual CheckBoxState GetCheckBoxState(CheckState checkState) {
// Should the checkbox be drawn as disabled?
- if (this.IsCheckBoxDisabled)
- {
- switch (checkState)
- {
+ if (this.IsCheckBoxDisabled) {
+ switch (checkState) {
case CheckState.Checked:
return CheckBoxState.CheckedDisabled;
case CheckState.Unchecked:
@@ -1601,10 +1506,8 @@ namespace BrightIdeasSoftware
}
// Is the cursor currently over this checkbox?
- if (this.IsCheckboxHot)
- {
- switch (checkState)
- {
+ if (this.IsCheckboxHot) {
+ switch (checkState) {
case CheckState.Checked:
return CheckBoxState.CheckedHot;
case CheckState.Unchecked:
@@ -1615,8 +1518,7 @@ namespace BrightIdeasSoftware
}
// Not hot and not disabled -- just draw it normally
- switch (checkState)
- {
+ switch (checkState) {
case CheckState.Checked:
return CheckBoxState.CheckedNormal;
case CheckState.Unchecked:
@@ -1630,10 +1532,8 @@ namespace BrightIdeasSoftware
///
/// Should this checkbox be drawn as disabled?
///
- protected virtual bool IsCheckBoxDisabled
- {
- get
- {
+ protected virtual bool IsCheckBoxDisabled {
+ get {
if (this.ListItem != null && !this.ListItem.Enabled)
return true;
@@ -1648,10 +1548,8 @@ namespace BrightIdeasSoftware
///
/// Is the current item hot (i.e. under the mouse)?
///
- protected bool IsCellHot
- {
- get
- {
+ protected bool IsCellHot {
+ get {
return this.ListView != null &&
this.ListView.HotRowIndex == this.ListItem.Index &&
this.ListView.HotColumnIndex == (this.Column == null ? 0 : this.Column.Index);
@@ -1661,10 +1559,8 @@ namespace BrightIdeasSoftware
///
/// Is the mouse over a checkbox in this cell?
///
- protected bool IsCheckboxHot
- {
- get
- {
+ protected bool IsCheckboxHot {
+ get {
return this.IsCellHot && this.ListView.HotCellHitLocation == HitTestLocation.CheckBox;
}
}
@@ -1675,26 +1571,21 @@ namespace BrightIdeasSoftware
/// Graphics context to use for drawing
/// Bounds of the cell
/// The optional image to be drawn
- protected virtual int DrawImage(Graphics g, Rectangle r, Object imageSelector)
- {
+ protected virtual int DrawImage(Graphics g, Rectangle r, Object imageSelector) {
if (imageSelector == null || imageSelector == DBNull.Value)
return 0;
// Draw from the image list (most common case)
ImageList il = this.ImageListOrDefault;
- if (il != null)
- {
+ if (il != null) {
// Try to translate our imageSelector into a valid ImageList index
int selectorAsInt = -1;
- if (imageSelector is Int32)
- {
- selectorAsInt = (Int32)imageSelector;
+ if (imageSelector is Int32) {
+ selectorAsInt = (Int32) imageSelector;
if (selectorAsInt >= il.Images.Count)
selectorAsInt = -1;
- }
- else
- {
+ } else {
String selectorAsString = imageSelector as String;
if (selectorAsString != null)
selectorAsInt = il.Images.IndexOfKey(selectorAsString);
@@ -1703,10 +1594,8 @@ namespace BrightIdeasSoftware
// If we found a valid index into the ImageList, draw it.
// We want to draw using the native DrawImageList calls, since that let's us do some nice effects
// But the native call does not work on PrinterDCs, so if we're printing we have to skip this bit.
- if (selectorAsInt >= 0)
- {
- if (!this.IsPrinting)
- {
+ if (selectorAsInt >= 0) {
+ if (!this.IsPrinting) {
if (il.ImageSize.Height < r.Height)
r.Y = this.AlignVertically(r, new Rectangle(Point.Empty, il.ImageSize));
@@ -1747,11 +1636,9 @@ namespace BrightIdeasSoftware
///
/// Graphics context to use for drawing
/// Bounds of the cell
- protected virtual void DrawImageAndText(Graphics g, Rectangle r)
- {
+ protected virtual void DrawImageAndText(Graphics g, Rectangle r) {
int offset = 0;
- if (this.ListView.CheckBoxes && this.ColumnIsPrimary)
- {
+ if (this.ListView.CheckBoxes && this.ColumnIsPrimary) {
offset = this.DrawCheckBox(g, r) + 6;
r.X += offset;
r.Width -= offset;
@@ -1770,12 +1657,10 @@ namespace BrightIdeasSoftware
///
///
///
- protected virtual int DrawImages(Graphics g, Rectangle r, ICollection imageSelectors)
- {
+ protected virtual int DrawImages(Graphics g, Rectangle r, ICollection imageSelectors) {
// Collect the non-null images
List images = new List();
- foreach (Object selector in imageSelectors)
- {
+ foreach (Object selector in imageSelectors) {
Image image = this.GetImage(selector);
if (image != null)
images.Add(image);
@@ -1784,8 +1669,7 @@ namespace BrightIdeasSoftware
// Figure out how much space they will occupy
int width = 0;
int height = 0;
- foreach (Image image in images)
- {
+ foreach (Image image in images) {
width += (image.Width + this.Spacing);
height = Math.Max(height, image.Height);
}
@@ -1796,8 +1680,7 @@ namespace BrightIdeasSoftware
// Finally, draw all the images in their correct location
Color backgroundColor = GetBackgroundColor();
Point pt = r2.Location;
- foreach (Image image in images)
- {
+ foreach (Image image in images) {
if (this.ListItem.Enabled)
g.DrawImage(image, pt);
else
@@ -1815,8 +1698,7 @@ namespace BrightIdeasSoftware
/// Graphics context to use for drawing
/// Bounds of the cell
/// The string to be drawn
- public virtual void DrawText(Graphics g, Rectangle r, String txt)
- {
+ public virtual void DrawText(Graphics g, Rectangle r, String txt) {
if (String.IsNullOrEmpty(txt))
return;
@@ -1838,8 +1720,7 @@ namespace BrightIdeasSoftware
/// This method doesn't honour the CanWrap setting on the renderer. All
/// text is single line
///
- protected virtual void DrawTextGdi(Graphics g, Rectangle r, String txt)
- {
+ protected virtual void DrawTextGdi(Graphics g, Rectangle r, String txt) {
Color backColor = Color.Transparent;
if (this.IsDrawBackground && this.IsItemSelected && ColumnIsPrimary && !this.ListView.FullRowSelect)
backColor = this.GetSelectedBackgroundColor();
@@ -1853,8 +1734,7 @@ namespace BrightIdeasSoftware
TextRenderer.DrawText(g, txt, this.Font, r, this.GetForegroundColor(), backColor, flags);
}
- private bool ColumnIsPrimary
- {
+ private bool ColumnIsPrimary {
get { return this.Column != null && this.Column.Index == 0; }
}
@@ -1862,12 +1742,9 @@ namespace BrightIdeasSoftware
/// Gets the cell's vertical alignment as a TextFormatFlag
///
///
- protected TextFormatFlags CellVerticalAlignmentAsTextFormatFlag
- {
- get
- {
- switch (this.EffectiveCellVerticalAlignment)
- {
+ protected TextFormatFlags CellVerticalAlignmentAsTextFormatFlag {
+ get {
+ switch (this.EffectiveCellVerticalAlignment) {
case StringAlignment.Near:
return TextFormatFlags.Top;
case StringAlignment.Center:
@@ -1883,10 +1760,8 @@ namespace BrightIdeasSoftware
///
/// Gets the StringFormat needed when drawing text using GDI+
///
- protected virtual StringFormat StringFormatForGdiPlus
- {
- get
- {
+ protected virtual StringFormat StringFormatForGdiPlus {
+ get {
StringFormat fmt = new StringFormat();
fmt.LineAlignment = this.EffectiveCellVerticalAlignment;
fmt.Trimming = StringTrimming.EllipsisCharacter;
@@ -1901,20 +1776,16 @@ namespace BrightIdeasSoftware
/// Print the given text in the given rectangle using normal GDI+ .NET methods
///
/// Printing to a printer dc has to be done using this method.
- protected virtual void DrawTextGdiPlus(Graphics g, Rectangle r, String txt)
- {
- using (StringFormat fmt = this.StringFormatForGdiPlus)
- {
+ protected virtual void DrawTextGdiPlus(Graphics g, Rectangle r, String txt) {
+ using (StringFormat fmt = this.StringFormatForGdiPlus) {
// Draw the background of the text as selected, if it's the primary column
// and it's selected and it's not in FullRowSelect mode.
Font f = this.Font;
- if (this.IsDrawBackground && this.IsItemSelected && this.ColumnIsPrimary && !this.ListView.FullRowSelect)
- {
+ if (this.IsDrawBackground && this.IsItemSelected && this.ColumnIsPrimary && !this.ListView.FullRowSelect) {
SizeF size = g.MeasureString(txt, f, r.Width, fmt);
Rectangle r2 = r;
- r2.Width = (int)size.Width + 1;
- using (Brush brush = new SolidBrush(this.GetSelectedBackgroundColor()))
- {
+ r2.Width = (int) size.Width + 1;
+ using (Brush brush = new SolidBrush(this.GetSelectedBackgroundColor())) {
g.FillRectangle(brush, r2);
}
}
@@ -1941,15 +1812,13 @@ namespace BrightIdeasSoftware
///
/// This renderer highlights substrings that match a given text filter.
///
- public class HighlightTextRenderer : BaseRenderer, IFilterAwareRenderer
- {
+ public class HighlightTextRenderer : BaseRenderer, IFilterAwareRenderer {
#region Life and death
///
/// Create a HighlightTextRenderer
///
- public HighlightTextRenderer()
- {
+ public HighlightTextRenderer() {
this.FramePen = Pens.DarkGreen;
this.FillBrush = Brushes.Yellow;
}
@@ -1959,8 +1828,7 @@ namespace BrightIdeasSoftware
///
///
public HighlightTextRenderer(TextMatchFilter filter)
- : this()
- {
+ : this() {
this.Filter = filter;
}
@@ -1969,7 +1837,7 @@ namespace BrightIdeasSoftware
///
///
[Obsolete("Use HighlightTextRenderer(TextMatchFilter) instead", true)]
- public HighlightTextRenderer(string text) { }
+ public HighlightTextRenderer(string text) {}
#endregion
@@ -1981,8 +1849,7 @@ namespace BrightIdeasSoftware
[Category("Appearance"),
DefaultValue(3.0f),
Description("How rounded will be the corners of the text match frame?")]
- public float CornerRoundness
- {
+ public float CornerRoundness {
get { return cornerRoundness; }
set { cornerRoundness = value; }
}
@@ -1995,8 +1862,7 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public Brush FillBrush
- {
+ public Brush FillBrush {
get { return fillBrush; }
set { fillBrush = value; }
}
@@ -2009,8 +1875,7 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public TextMatchFilter Filter
- {
+ public TextMatchFilter Filter {
get { return filter; }
set { filter = value; }
}
@@ -2026,8 +1891,7 @@ namespace BrightIdeasSoftware
set { RegisterNewFilter(value); }
}
- internal void RegisterNewFilter(IModelFilter newFilter)
- {
+ internal void RegisterNewFilter(IModelFilter newFilter) {
TextMatchFilter textFilter = newFilter as TextMatchFilter;
if (textFilter != null)
{
@@ -2043,8 +1907,8 @@ namespace BrightIdeasSoftware
return;
}
}
- Filter = null;
- }
+ Filter = null;
+ }
///
/// Gets or set the pen will be used to frame the matched substrings.
@@ -2052,8 +1916,7 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public Pen FramePen
- {
+ public Pen FramePen {
get { return framePen; }
set { framePen = value; }
}
@@ -2066,8 +1929,7 @@ namespace BrightIdeasSoftware
[Category("Appearance"),
DefaultValue(true),
Description("Will the frame around a text match will have rounded corners?")]
- public bool UseRoundedRectangle
- {
+ public bool UseRoundedRectangle {
get { return useRoundedRectangle; }
set { useRoundedRectangle = value; }
}
@@ -2083,8 +1945,7 @@ namespace BrightIdeasSoftware
///
[Obsolete("Set the Filter directly rather than just the text", true)]
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public string TextToHighlight
- {
+ public string TextToHighlight {
get { return String.Empty; }
set { }
}
@@ -2096,8 +1957,7 @@ namespace BrightIdeasSoftware
/// Use this to control if substring matches are case sensitive or insensitive.
[Obsolete("Set the Filter directly rather than just this setting", true)]
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public StringComparison StringComparison
- {
+ public StringComparison StringComparison {
get { return StringComparison.CurrentCultureIgnoreCase; }
set { }
}
@@ -2115,8 +1975,7 @@ namespace BrightIdeasSoftware
///
///
///
- protected override Rectangle HandleGetEditRectangle(Graphics g, Rectangle cellBounds, OLVListItem item, int subItemIndex, Size preferredSize)
- {
+ protected override Rectangle HandleGetEditRectangle(Graphics g, Rectangle cellBounds, OLVListItem item, int subItemIndex, Size preferredSize) {
return this.StandardGetEditRectangle(g, cellBounds, preferredSize);
}
@@ -2134,8 +1993,7 @@ namespace BrightIdeasSoftware
///
///
///
- protected override void DrawTextGdi(Graphics g, Rectangle r, string txt)
- {
+ protected override void DrawTextGdi(Graphics g, Rectangle r, string txt) {
if (this.ShouldDrawHighlighting)
this.DrawGdiTextHighlighting(g, r, txt);
@@ -2148,8 +2006,7 @@ namespace BrightIdeasSoftware
///
///
///
- protected virtual void DrawGdiTextHighlighting(Graphics g, Rectangle r, string txt)
- {
+ protected virtual void DrawGdiTextHighlighting(Graphics g, Rectangle r, string txt) {
// TextRenderer puts horizontal padding around the strings, so we need to take
// that into account when measuring strings
@@ -2158,12 +2015,10 @@ namespace BrightIdeasSoftware
// Cache the font
Font f = this.Font;
- foreach (CharacterRange range in this.Filter.FindAllMatchedRanges(txt))
- {
+ foreach (CharacterRange range in this.Filter.FindAllMatchedRanges(txt)) {
// Measure the text that comes before our substring
Size precedingTextSize = Size.Empty;
- if (range.First > 0)
- {
+ if (range.First > 0) {
string precedingText = txt.Substring(0, range.First);
precedingTextSize = TextRenderer.MeasureText(g, precedingText, f, r.Size, NormalTextFormatFlags);
precedingTextSize.Width -= paddingAdjustment;
@@ -2190,12 +2045,9 @@ namespace BrightIdeasSoftware
///
///
///
- protected virtual void DrawSubstringFrame(Graphics g, float x, float y, float width, float height)
- {
- if (this.UseRoundedRectangle)
- {
- using (GraphicsPath path = this.GetRoundedRect(x, y, width, height, 3.0f))
- {
+ protected virtual void DrawSubstringFrame(Graphics g, float x, float y, float width, float height) {
+ if (this.UseRoundedRectangle) {
+ using (GraphicsPath path = this.GetRoundedRect(x, y, width, height, 3.0f)) {
if (this.FillBrush != null)
{
if (this.IsItemSelected)
@@ -2208,9 +2060,7 @@ namespace BrightIdeasSoftware
if (this.FramePen != null)
g.DrawPath(this.FramePen, path);
}
- }
- else
- {
+ } else {
if (this.FillBrush != null)
if (this.IsItemSelected)
{ g.FillRectangle(Brushes.Red, x, y, width, height); }
@@ -2218,7 +2068,7 @@ namespace BrightIdeasSoftware
{
g.FillRectangle(this.FillBrush, x, y, width, height);
}
-
+
if (this.FramePen != null)
g.DrawRectangle(this.FramePen, x, y, width, height);
}
@@ -2230,8 +2080,7 @@ namespace BrightIdeasSoftware
///
///
///
- protected override void DrawTextGdiPlus(Graphics g, Rectangle r, string txt)
- {
+ protected override void DrawTextGdiPlus(Graphics g, Rectangle r, string txt) {
if (this.ShouldDrawHighlighting)
this.DrawGdiPlusTextHighlighting(g, r, txt);
@@ -2244,22 +2093,19 @@ namespace BrightIdeasSoftware
///
///
///
- protected virtual void DrawGdiPlusTextHighlighting(Graphics g, Rectangle r, string txt)
- {
+ protected virtual void DrawGdiPlusTextHighlighting(Graphics g, Rectangle r, string txt) {
// Find the substrings we want to highlight
List ranges = new List(this.Filter.FindAllMatchedRanges(txt));
if (ranges.Count == 0)
return;
- using (StringFormat fmt = this.StringFormatForGdiPlus)
- {
+ using (StringFormat fmt = this.StringFormatForGdiPlus) {
RectangleF rf = r;
fmt.SetMeasurableCharacterRanges(ranges.ToArray());
Region[] stringRegions = g.MeasureCharacterRanges(txt, this.Font, rf, fmt);
- foreach (Region region in stringRegions)
- {
+ foreach (Region region in stringRegions) {
RectangleF bounds = region.GetBounds(g);
this.DrawSubstringFrame(g, bounds.X - 1, bounds.Y - 1, bounds.Width + 2, bounds.Height);
}
@@ -2273,8 +2119,7 @@ namespace BrightIdeasSoftware
///
/// Gets whether the renderer should actually draw highlighting
///
- protected bool ShouldDrawHighlighting
- {
+ protected bool ShouldDrawHighlighting {
get { return this.Column == null || (this.Column.Searchable && this.Filter != null && this.Filter.HasComponents); }
}
@@ -2289,8 +2134,7 @@ namespace BrightIdeasSoftware
///
///
///
- protected GraphicsPath GetRoundedRect(float x, float y, float width, float height, float diameter)
- {
+ protected GraphicsPath GetRoundedRect(float x, float y, float width, float height, float diameter) {
return GetRoundedRect(new RectangleF(x, y, width, height), diameter);
}
@@ -2302,12 +2146,10 @@ namespace BrightIdeasSoftware
/// A round cornered rectangle path
/// If I could rely on people using C# 3.0+, this should be
/// an extension method of GraphicsPath.
- protected GraphicsPath GetRoundedRect(RectangleF rect, float diameter)
- {
+ protected GraphicsPath GetRoundedRect(RectangleF rect, float diameter) {
GraphicsPath path = new GraphicsPath();
- if (diameter > 0)
- {
+ if (diameter > 0) {
RectangleF arc = new RectangleF(rect.X, rect.Y, diameter, diameter);
path.AddArc(arc, 180, 90);
arc.X = rect.Right - diameter;
@@ -2317,9 +2159,7 @@ namespace BrightIdeasSoftware
arc.X = rect.Left;
path.AddArc(arc, 90, 90);
path.CloseFigure();
- }
- else
- {
+ } else {
path.AddRectangle(rect);
}
@@ -2333,16 +2173,14 @@ namespace BrightIdeasSoftware
/// This class maps a data value to an image that should be drawn for that value.
///
/// It is useful for drawing data that is represented as an enum or boolean.
- public class MappedImageRenderer : BaseRenderer
- {
+ public class MappedImageRenderer : BaseRenderer {
///
/// Return a renderer that draw boolean values using the given images
///
/// Draw this when our data value is true
/// Draw this when our data value is false
/// A Renderer
- public static MappedImageRenderer Boolean(Object trueImage, Object falseImage)
- {
+ public static MappedImageRenderer Boolean(Object trueImage, Object falseImage) {
return new MappedImageRenderer(true, trueImage, false, falseImage);
}
@@ -2353,16 +2191,14 @@ namespace BrightIdeasSoftware
/// Draw this when our data value is false
/// Draw this when our data value is null
/// A Renderer
- public static MappedImageRenderer TriState(Object trueImage, Object falseImage, Object nullImage)
- {
- return new MappedImageRenderer(new Object[] { true, trueImage, false, falseImage, null, nullImage });
+ public static MappedImageRenderer TriState(Object trueImage, Object falseImage, Object nullImage) {
+ return new MappedImageRenderer(new Object[] {true, trueImage, false, falseImage, null, nullImage});
}
///
/// Make a new empty renderer
///
- public MappedImageRenderer()
- {
+ public MappedImageRenderer() {
map = new System.Collections.Hashtable();
}
@@ -2372,8 +2208,7 @@ namespace BrightIdeasSoftware
/// The data value to be matched
/// The image to be shown when the key is matched
public MappedImageRenderer(Object key, Object image)
- : this()
- {
+ : this() {
this.Add(key, image);
}
@@ -2385,8 +2220,7 @@ namespace BrightIdeasSoftware
///
///
public MappedImageRenderer(Object key1, Object image1, Object key2, Object image2)
- : this()
- {
+ : this() {
this.Add(key1, image1);
this.Add(key2, image2);
}
@@ -2396,8 +2230,7 @@ namespace BrightIdeasSoftware
///
/// An array of key/image pairs
public MappedImageRenderer(Object[] keysAndImages)
- : this()
- {
+ : this() {
if ((keysAndImages.GetLength(0) % 2) != 0)
throw new ArgumentException("Array must have key/image pairs");
@@ -2410,8 +2243,7 @@ namespace BrightIdeasSoftware
///
/// Value that the Aspect must match
/// An ImageSelector -- an int, string or image
- public void Add(Object value, Object image)
- {
+ public void Add(Object value, Object image) {
if (value == null)
this.nullImage = image;
else
@@ -2423,8 +2255,7 @@ namespace BrightIdeasSoftware
///
///
///
- public override void Render(Graphics g, Rectangle r)
- {
+ public override void Render(Graphics g, Rectangle r) {
this.DrawBackground(g, r);
r = this.ApplyCellPadding(r);
@@ -2441,12 +2272,10 @@ namespace BrightIdeasSoftware
///
///
///
- protected void RenderCollection(Graphics g, Rectangle r, ICollection imageSelectors)
- {
+ protected void RenderCollection(Graphics g, Rectangle r, ICollection imageSelectors) {
ArrayList images = new ArrayList();
Image image = null;
- foreach (Object selector in imageSelectors)
- {
+ foreach (Object selector in imageSelectors) {
if (selector == null)
image = this.GetImage(this.nullImage);
else if (map.ContainsKey(selector))
@@ -2467,8 +2296,7 @@ namespace BrightIdeasSoftware
///
///
///
- protected void RenderOne(Graphics g, Rectangle r, Object selector)
- {
+ protected void RenderOne(Graphics g, Rectangle r, Object selector) {
Image image = null;
if (selector == null)
image = this.GetImage(this.nullImage);
@@ -2490,22 +2318,19 @@ namespace BrightIdeasSoftware
///
/// This renderer draws just a checkbox to match the check state of our model object.
///
- public class CheckStateRenderer : BaseRenderer
- {
+ public class CheckStateRenderer : BaseRenderer {
///
/// Draw our cell
///
///
///
- public override void Render(Graphics g, Rectangle r)
- {
+ public override void Render(Graphics g, Rectangle r) {
this.DrawBackground(g, r);
if (this.Column == null)
return;
r = this.ApplyCellPadding(r);
CheckState state = this.Column.GetCheckState(this.RowObject);
- if (this.IsPrinting)
- {
+ if (this.IsPrinting) {
// Renderers don't work onto printer DCs, so we have to draw the image ourselves
string key = ObjectListView.CHECKED_KEY;
if (state == CheckState.Unchecked)
@@ -2513,9 +2338,7 @@ namespace BrightIdeasSoftware
if (state == CheckState.Indeterminate)
key = ObjectListView.INDETERMINATE_KEY;
this.DrawAlignedImage(g, r, this.ImageListOrDefault.Images[key]);
- }
- else
- {
+ } else {
r = this.CalculateCheckBoxBounds(g, r);
CheckBoxRenderer.DrawCheckBox(g, r.Location, this.GetCheckBoxState(state));
}
@@ -2531,8 +2354,7 @@ namespace BrightIdeasSoftware
///
///
///
- protected override Rectangle HandleGetEditRectangle(Graphics g, Rectangle cellBounds, OLVListItem item, int subItemIndex, Size preferredSize)
- {
+ protected override Rectangle HandleGetEditRectangle(Graphics g, Rectangle cellBounds, OLVListItem item, int subItemIndex, Size preferredSize) {
return this.CalculatePaddedAlignedBounds(g, cellBounds, preferredSize);
}
@@ -2543,8 +2365,7 @@ namespace BrightIdeasSoftware
///
///
///
- protected override void HandleHitTest(Graphics g, OlvListViewHitTestInfo hti, int x, int y)
- {
+ protected override void HandleHitTest(Graphics g, OlvListViewHitTestInfo hti, int x, int y) {
Rectangle r = this.CalculateCheckBoxBounds(g, this.Bounds);
if (r.Contains(x, y))
hti.HitTestLocation = HitTestLocation.CheckBox;
@@ -2570,13 +2391,11 @@ namespace BrightIdeasSoftware
/// an image renderer between two animated gif columns. If you do, only the last column will be
/// animated.
///
- public class ImageRenderer : BaseRenderer
- {
+ public class ImageRenderer : BaseRenderer {
///
/// Make an empty image renderer
///
- public ImageRenderer()
- {
+ public ImageRenderer() {
this.stopwatch = new Stopwatch();
}
@@ -2584,16 +2403,14 @@ namespace BrightIdeasSoftware
/// Make an empty image renderer that begins life ready for animations
///
public ImageRenderer(bool startAnimations)
- : this()
- {
+ : this() {
this.Paused = !startAnimations;
}
///
/// Finalizer
///
- protected override void Dispose(bool disposing)
- {
+ protected override void Dispose(bool disposing) {
Paused = true;
base.Dispose(disposing);
}
@@ -2605,22 +2422,17 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public bool Paused
- {
+ public bool Paused {
get { return isPaused; }
- set
- {
+ set {
if (this.isPaused == value)
return;
this.isPaused = value;
- if (this.isPaused)
- {
+ if (this.isPaused) {
this.StopTickler();
this.stopwatch.Stop();
- }
- else
- {
+ } else {
this.Tickler.Change(1, Timeout.Infinite);
this.stopwatch.Start();
}
@@ -2629,8 +2441,7 @@ namespace BrightIdeasSoftware
private bool isPaused = true;
- private void StopTickler()
- {
+ private void StopTickler() {
if (this.tickler == null)
return;
@@ -2641,10 +2452,8 @@ namespace BrightIdeasSoftware
///
/// Gets a timer that can be used to trigger redraws on animations
///
- protected Timer Tickler
- {
- get
- {
+ protected Timer Tickler {
+ get {
if (this.tickler == null)
this.tickler = new System.Threading.Timer(new TimerCallback(this.OnTimer), null, Timeout.Infinite, Timeout.Infinite);
return this.tickler;
@@ -2658,16 +2467,14 @@ namespace BrightIdeasSoftware
///
/// Pause any animations
///
- public void Pause()
- {
+ public void Pause() {
this.Paused = true;
}
///
/// Unpause any animations
///
- public void Unpause()
- {
+ public void Unpause() {
this.Paused = false;
}
@@ -2680,20 +2487,16 @@ namespace BrightIdeasSoftware
///
///
///
- public override void Render(Graphics g, Rectangle r)
- {
+ public override void Render(Graphics g, Rectangle r) {
this.DrawBackground(g, r);
if (this.Aspect == null || this.Aspect == System.DBNull.Value)
return;
r = this.ApplyCellPadding(r);
- if (this.Aspect is System.Byte[])
- {
+ if (this.Aspect is System.Byte[]) {
this.DrawAlignedImage(g, r, this.GetImageFromAspect());
- }
- else
- {
+ } else {
ICollection imageSelectors = this.Aspect as ICollection;
if (imageSelectors == null)
this.DrawAlignedImage(g, r, this.GetImageFromAspect());
@@ -2712,13 +2515,11 @@ namespace BrightIdeasSoftware
/// we use the string as an index into our image list.
///
/// An image
- protected Image GetImageFromAspect()
- {
+ protected Image GetImageFromAspect() {
// If we've already figured out the image, don't do it again
- if (this.OLVSubItem != null && this.OLVSubItem.ImageSelector is Image)
- {
+ if (this.OLVSubItem != null && this.OLVSubItem.ImageSelector is Image) {
if (this.OLVSubItem.AnimationState == null)
- return (Image)this.OLVSubItem.ImageSelector;
+ return (Image) this.OLVSubItem.ImageSelector;
else
return this.OLVSubItem.AnimationState.image;
}
@@ -2729,51 +2530,36 @@ namespace BrightIdeasSoftware
// If it's a string, we try to find a file by that name.
// If we can't, we use the string as an index into our image list.
Image image = this.Aspect as Image;
- if (image != null)
- {
+ if (image != null) {
// Don't do anything else
- }
- else if (this.Aspect is System.Byte[])
- {
- using (MemoryStream stream = new MemoryStream((System.Byte[])this.Aspect))
- {
- try
- {
+ } else if (this.Aspect is System.Byte[]) {
+ using (MemoryStream stream = new MemoryStream((System.Byte[]) this.Aspect)) {
+ try {
image = Image.FromStream(stream);
}
- catch (ArgumentException)
- {
+ catch (ArgumentException) {
// ignore
}
}
- }
- else if (this.Aspect is Int32)
- {
+ } else if (this.Aspect is Int32) {
image = this.GetImage(this.Aspect);
- }
- else
- {
+ } else {
String str = this.Aspect as String;
- if (!String.IsNullOrEmpty(str))
- {
- try
- {
+ if (!String.IsNullOrEmpty(str)) {
+ try {
image = Image.FromFile(str);
}
- catch (FileNotFoundException)
- {
+ catch (FileNotFoundException) {
image = this.GetImage(this.Aspect);
}
- catch (OutOfMemoryException)
- {
+ catch (OutOfMemoryException) {
image = this.GetImage(this.Aspect);
}
}
}
// If this image is an animation, initialize the animation process
- if (this.OLVSubItem != null && AnimationState.IsAnimation(image))
- {
+ if (this.OLVSubItem != null && AnimationState.IsAnimation(image)) {
this.OLVSubItem.AnimationState = new AnimationState(image);
}
@@ -2792,8 +2578,7 @@ namespace BrightIdeasSoftware
/// This is the method that is invoked by the timer. It basically switches control to the listview thread.
///
/// not used
- public void OnTimer(Object state)
- {
+ public void OnTimer(Object state) {
if (this.IsListViewDead)
return;
@@ -2802,15 +2587,13 @@ namespace BrightIdeasSoftware
return;
if (this.ListView.InvokeRequired)
- this.ListView.Invoke((MethodInvoker)delegate { this.OnTimer(state); });
+ this.ListView.Invoke((MethodInvoker) delegate { this.OnTimer(state); });
else
this.OnTimerInThread();
}
- private bool IsListViewDead
- {
- get
- {
+ private bool IsListViewDead {
+ get {
// Apply a whole heap of sanity checks, which basically ensure that the ListView is still alive
return this.ListView == null ||
this.ListView.Disposing ||
@@ -2823,8 +2606,7 @@ namespace BrightIdeasSoftware
/// This is the OnTimer callback, but invoked in the same thread as the creator of the ListView.
/// This method can use all of ListViews methods without creating a CrossThread exception.
///
- protected void OnTimerInThread()
- {
+ protected void OnTimerInThread() {
// MAINTAINER NOTE: This method must renew the tickler. If it doesn't the animations will stop.
// If this listview has been destroyed, we can't do anything, so we return without
@@ -2838,8 +2620,7 @@ namespace BrightIdeasSoftware
// If we're not in Detail view or our column has been removed from the list,
// we can't do anything at the moment, but we still renew the tickler because the view may change later.
- if (this.ListView.View != System.Windows.Forms.View.Details || this.Column == null || this.Column.Index < 0)
- {
+ if (this.ListView.View != System.Windows.Forms.View.Details || this.Column == null || this.Column.Index < 0) {
this.Tickler.Change(1000, Timeout.Infinite);
return;
}
@@ -2852,8 +2633,7 @@ namespace BrightIdeasSoftware
// Run through all the subitems in the view for our column, and for each one that
// has an animation attached to it, see if the frame needs updating.
- for (int i = 0; i < this.ListView.GetItemCount(); i++)
- {
+ for (int i = 0; i < this.ListView.GetItemCount(); i++) {
OLVListItem lvi = this.ListView.GetItem(i);
// Get the animation state from the subitem. If there isn't an animation state, skip this row.
@@ -2863,8 +2643,7 @@ namespace BrightIdeasSoftware
continue;
// Has this frame of the animation expired?
- if (elapsedMilliseconds >= state.currentFrameExpiresAt)
- {
+ if (elapsedMilliseconds >= state.currentFrameExpiresAt) {
state.AdvanceFrame(elapsedMilliseconds);
// Track the area of the view that needs to be redrawn to show the changed images
@@ -2891,8 +2670,7 @@ namespace BrightIdeasSoftware
///
/// Instances of this class kept track of the animation state of a single image.
///
- internal class AnimationState
- {
+ internal class AnimationState {
private const int PropertyTagTypeShort = 3;
private const int PropertyTagTypeLong = 4;
private const int PropertyTagFrameDelay = 0x5100;
@@ -2903,8 +2681,7 @@ namespace BrightIdeasSoftware
///
/// The image to be tested
/// Is the image an animation?
- public static bool IsAnimation(Image image)
- {
+ public static bool IsAnimation(Image image) {
if (image == null)
return false;
else
@@ -2914,8 +2691,7 @@ namespace BrightIdeasSoftware
///
/// Create an AnimationState in a quiet state
///
- public AnimationState()
- {
+ public AnimationState() {
this.imageDuration = new List();
}
@@ -2925,8 +2701,7 @@ namespace BrightIdeasSoftware
///
/// The image to be rendered
public AnimationState(Image image)
- : this()
- {
+ : this() {
if (!AnimationState.IsAnimation(image))
return;
@@ -2937,12 +2712,9 @@ namespace BrightIdeasSoftware
// Find the delay between each frame.
// The delays are stored an array of 4-byte ints. Each int is the
// number of 1/100th of a second that should elapsed before the frame expires
- foreach (PropertyItem pi in this.image.PropertyItems)
- {
- if (pi.Id == PropertyTagFrameDelay)
- {
- for (int i = 0; i < pi.Len; i += 4)
- {
+ foreach (PropertyItem pi in this.image.PropertyItems) {
+ if (pi.Id == PropertyTagFrameDelay) {
+ for (int i = 0; i < pi.Len; i += 4) {
//TODO: There must be a better way to convert 4-bytes to an int
int delay = (pi.Value[i + 3] << 24) + (pi.Value[i + 2] << 16) + (pi.Value[i + 1] << 8) + pi.Value[i];
this.imageDuration.Add(delay * 10); // store delays as milliseconds
@@ -2958,16 +2730,14 @@ namespace BrightIdeasSoftware
///
/// Does this state represent a valid animation
///
- public bool IsValid
- {
+ public bool IsValid {
get { return (this.image != null && this.frameCount > 0); }
}
///
/// Advance our images current frame and calculate when it will expire
///
- public void AdvanceFrame(long millisecondsNow)
- {
+ public void AdvanceFrame(long millisecondsNow) {
this.currentFrame = (this.currentFrame + 1) % this.frameCount;
this.currentFrameExpiresAt = millisecondsNow + this.imageDuration[this.currentFrame];
this.image.SelectActiveFrame(FrameDimension.Time, this.currentFrame);
@@ -2991,22 +2761,20 @@ namespace BrightIdeasSoftware
///
/// Render our Aspect as a progress bar
///
- public class BarRenderer : BaseRenderer
- {
+ public class BarRenderer : BaseRenderer {
#region Constructors
///
/// Make a BarRenderer
///
public BarRenderer()
- : base() { }
+ : base() {}
///
/// Make a BarRenderer for the given range of data values
///
public BarRenderer(int minimum, int maximum)
- : this()
- {
+ : this() {
this.MinimumValue = minimum;
this.MaximumValue = maximum;
}
@@ -3015,8 +2783,7 @@ namespace BrightIdeasSoftware
/// Make a BarRenderer using a custom bar scheme
///
public BarRenderer(Pen pen, Brush brush)
- : this()
- {
+ : this() {
this.Pen = pen;
this.Brush = brush;
this.UseStandardBar = false;
@@ -3026,8 +2793,7 @@ namespace BrightIdeasSoftware
/// Make a BarRenderer using a custom bar scheme
///
public BarRenderer(int minimum, int maximum, Pen pen, Brush brush)
- : this(minimum, maximum)
- {
+ : this(minimum, maximum) {
this.Pen = pen;
this.Brush = brush;
this.UseStandardBar = false;
@@ -3037,8 +2803,7 @@ namespace BrightIdeasSoftware
/// Make a BarRenderer that uses a horizontal gradient
///
public BarRenderer(Pen pen, Color start, Color end)
- : this()
- {
+ : this() {
this.Pen = pen;
this.SetGradient(start, end);
}
@@ -3047,8 +2812,7 @@ namespace BrightIdeasSoftware
/// Make a BarRenderer that uses a horizontal gradient
///
public BarRenderer(int minimum, int maximum, Pen pen, Color start, Color end)
- : this(minimum, maximum)
- {
+ : this(minimum, maximum) {
this.Pen = pen;
this.SetGradient(start, end);
}
@@ -3063,8 +2827,7 @@ namespace BrightIdeasSoftware
[Category("ObjectListView"),
Description("Should this bar be drawn in the system style?"),
DefaultValue(true)]
- public bool UseStandardBar
- {
+ public bool UseStandardBar {
get { return useStandardBar; }
set { useStandardBar = value; }
}
@@ -3077,8 +2840,7 @@ namespace BrightIdeasSoftware
[Category("ObjectListView"),
Description("How many pixels in from our cell border will this bar be drawn"),
DefaultValue(2)]
- public int Padding
- {
+ public int Padding {
get { return padding; }
set { padding = value; }
}
@@ -3091,9 +2853,8 @@ namespace BrightIdeasSoftware
///
[Category("ObjectListView"),
Description("The color of the interior of the bar"),
- DefaultValue(typeof(Color), "AliceBlue")]
- public Color BackgroundColor
- {
+ DefaultValue(typeof (Color), "AliceBlue")]
+ public Color BackgroundColor {
get { return backgroundColor; }
set { backgroundColor = value; }
}
@@ -3105,9 +2866,8 @@ namespace BrightIdeasSoftware
///
[Category("ObjectListView"),
Description("What color should the frame of the progress bar be"),
- DefaultValue(typeof(Color), "Black")]
- public Color FrameColor
- {
+ DefaultValue(typeof (Color), "Black")]
+ public Color FrameColor {
get { return frameColor; }
set { frameColor = value; }
}
@@ -3120,8 +2880,7 @@ namespace BrightIdeasSoftware
[Category("ObjectListView"),
Description("How many pixels wide should the frame of the progress bar be"),
DefaultValue(1.0f)]
- public float FrameWidth
- {
+ public float FrameWidth {
get { return frameWidth; }
set { frameWidth = value; }
}
@@ -3134,9 +2893,8 @@ namespace BrightIdeasSoftware
/// This is only used if GradientStartColor is Color.Empty
[Category("ObjectListView"),
Description("What color should the 'filled in' part of the progress bar be"),
- DefaultValue(typeof(Color), "BlueViolet")]
- public Color FillColor
- {
+ DefaultValue(typeof (Color), "BlueViolet")]
+ public Color FillColor {
get { return fillColor; }
set { fillColor = value; }
}
@@ -3148,9 +2906,8 @@ namespace BrightIdeasSoftware
///
[Category("ObjectListView"),
Description("Use a gradient to fill the progress bar starting with this color"),
- DefaultValue(typeof(Color), "CornflowerBlue")]
- public Color GradientStartColor
- {
+ DefaultValue(typeof (Color), "CornflowerBlue")]
+ public Color GradientStartColor {
get { return startColor; }
set { startColor = value; }
}
@@ -3162,9 +2919,8 @@ namespace BrightIdeasSoftware
///
[Category("ObjectListView"),
Description("Use a gradient to fill the progress bar ending with this color"),
- DefaultValue(typeof(Color), "DarkBlue")]
- public Color GradientEndColor
- {
+ DefaultValue(typeof (Color), "DarkBlue")]
+ public Color GradientEndColor {
get { return endColor; }
set { endColor = value; }
}
@@ -3177,8 +2933,7 @@ namespace BrightIdeasSoftware
[Category("Behavior"),
Description("The progress bar will never be wider than this"),
DefaultValue(100)]
- public int MaximumWidth
- {
+ public int MaximumWidth {
get { return maximumWidth; }
set { maximumWidth = value; }
}
@@ -3191,8 +2946,7 @@ namespace BrightIdeasSoftware
[Category("Behavior"),
Description("The progress bar will never be taller than this"),
DefaultValue(16)]
- public int MaximumHeight
- {
+ public int MaximumHeight {
get { return maximumHeight; }
set { maximumHeight = value; }
}
@@ -3205,8 +2959,7 @@ namespace BrightIdeasSoftware
[Category("Behavior"),
Description("The minimum data value expected. Values less than this will given an empty bar"),
DefaultValue(0.0)]
- public double MinimumValue
- {
+ public double MinimumValue {
get { return minimumValue; }
set { minimumValue = value; }
}
@@ -3219,8 +2972,7 @@ namespace BrightIdeasSoftware
[Category("Behavior"),
Description("The maximum value for the range. Values greater than this will give a full bar"),
DefaultValue(100.0)]
- public double MaximumValue
- {
+ public double MaximumValue {
get { return maximumValue; }
set { maximumValue = value; }
}
@@ -3236,10 +2988,8 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public Pen Pen
- {
- get
- {
+ public Pen Pen {
+ get {
if (this.pen == null && !this.FrameColor.IsEmpty)
return new Pen(this.FrameColor, this.FrameWidth);
else
@@ -3255,10 +3005,8 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public Brush Brush
- {
- get
- {
+ public Brush Brush {
+ get {
if (this.brush == null && !this.FillColor.IsEmpty)
return new SolidBrush(this.FillColor);
else
@@ -3274,10 +3022,8 @@ namespace BrightIdeasSoftware
///
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public Brush BackgroundBrush
- {
- get
- {
+ public Brush BackgroundBrush {
+ get {
if (this.backgroundBrush == null && !this.BackgroundColor.IsEmpty)
return new SolidBrush(this.BackgroundColor);
else
@@ -3295,8 +3041,7 @@ namespace BrightIdeasSoftware
///
///
///
- public void SetGradient(Color start, Color end)
- {
+ public void SetGradient(Color start, Color end) {
this.GradientStartColor = start;
this.GradientEndColor = end;
}
@@ -3306,8 +3051,7 @@ namespace BrightIdeasSoftware
///
///
///
- public override void Render(Graphics g, Rectangle r)
- {
+ public override void Render(Graphics g, Rectangle r) {
this.DrawBackground(g, r);
r = this.ApplyCellPadding(r);
@@ -3327,28 +3071,22 @@ namespace BrightIdeasSoftware
if (aspectValue <= this.MinimumValue)
fillRect.Width = 0;
else if (aspectValue < this.MaximumValue)
- fillRect.Width = (int)(fillRect.Width * (aspectValue - this.MinimumValue) / this.MaximumValue);
+ fillRect.Width = (int) (fillRect.Width * (aspectValue - this.MinimumValue) / this.MaximumValue);
// MS-themed progress bars don't work when printing
- if (this.UseStandardBar && ProgressBarRenderer.IsSupported && !this.IsPrinting)
- {
+ if (this.UseStandardBar && ProgressBarRenderer.IsSupported && !this.IsPrinting) {
ProgressBarRenderer.DrawHorizontalBar(g, frameRect);
ProgressBarRenderer.DrawHorizontalChunks(g, fillRect);
- }
- else
- {
+ } else {
g.FillRectangle(this.BackgroundBrush, frameRect);
- if (fillRect.Width > 0)
- {
+ if (fillRect.Width > 0) {
// FillRectangle fills inside the given rectangle, so expand it a little
fillRect.Width++;
fillRect.Height++;
if (this.GradientStartColor == Color.Empty)
g.FillRectangle(this.Brush, fillRect);
- else
- {
- using (LinearGradientBrush gradient = new LinearGradientBrush(frameRect, this.GradientStartColor, this.GradientEndColor, LinearGradientMode.Horizontal))
- {
+ else {
+ using (LinearGradientBrush gradient = new LinearGradientBrush(frameRect, this.GradientStartColor, this.GradientEndColor, LinearGradientMode.Horizontal)) {
g.FillRectangle(gradient, fillRect);
}
}
@@ -3366,8 +3104,7 @@ namespace BrightIdeasSoftware
///
///
///
- protected override Rectangle HandleGetEditRectangle(Graphics g, Rectangle cellBounds, OLVListItem item, int subItemIndex, Size preferredSize)
- {
+ protected override Rectangle HandleGetEditRectangle(Graphics g, Rectangle cellBounds, OLVListItem item, int subItemIndex, Size preferredSize) {
return this.CalculatePaddedAlignedBounds(g, cellBounds, preferredSize);
}
}
@@ -3381,30 +3118,28 @@ namespace BrightIdeasSoftware
/// empty shell, solely for backwards compatibility.
///
[ToolboxItem(false)]
- public class ImagesRenderer : ImageRenderer { }
+ public class ImagesRenderer : ImageRenderer {}
///
/// A MultiImageRenderer draws the same image a number of times based on our data value
///
/// The stars in the Rating column of iTunes is a good example of this type of renderer.
- public class MultiImageRenderer : BaseRenderer
- {
+ public class MultiImageRenderer : BaseRenderer {
///
/// Make a quiet renderer
///
public MultiImageRenderer()
- : base() { }
+ : base() {}
///
- /// һͼȾͼȾԻָͼmaxImages
+ /// Make an image renderer that will draw the indicated image, at most maxImages times.
///
///
///
///
///
public MultiImageRenderer(Object imageSelector, int maxImages, int minValue, int maxValue)
- : this()
- {
+ : this() {
this.ImageSelector = imageSelector;
this.MaxNumberImages = maxImages;
this.MinimumValue = minValue;
@@ -3414,17 +3149,15 @@ namespace BrightIdeasSoftware
#region Configuration Properties
///
- /// ӦƵͼ
+ /// The index of the image that should be drawn
///
[Category("Behavior"),
- Description("ӦƵͼ"),
+ Description("The index of the image that should be drawn"),
DefaultValue(-1)]
- public int ImageIndex
- {
- get
- {
+ public int ImageIndex {
+ get {
if (imageSelector is Int32)
- return (Int32)imageSelector;
+ return (Int32) imageSelector;
else
return -1;
}
@@ -3432,13 +3165,12 @@ namespace BrightIdeasSoftware
}
///
- /// ӦƵͼ
+ /// The name of the image that should be drawn
///
[Category("Behavior"),
- Description("ӦƵͼ"),
+ Description("The index of the image that should be drawn"),
DefaultValue(null)]
- public string ImageName
- {
+ public string ImageName {
get { return imageSelector as String; }
set { imageSelector = value; }
}
@@ -3449,8 +3181,7 @@ namespace BrightIdeasSoftware
/// Like all image selectors, this can be an int, string or Image
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public Object ImageSelector
- {
+ public Object ImageSelector {
get { return imageSelector; }
set { imageSelector = value; }
}
@@ -3458,13 +3189,12 @@ namespace BrightIdeasSoftware
private Object imageSelector;
///
- /// ȾӦƵͼ
+ /// What is the maximum number of images that this renderer should draw?
///
[Category("Behavior"),
- Description("ȾӦƵͼ"),
+ Description("The maximum number of images that this renderer should draw"),
DefaultValue(10)]
- public int MaxNumberImages
- {
+ public int MaxNumberImages {
get { return maxNumberImages; }
set { maxNumberImages = value; }
}
@@ -3472,13 +3202,12 @@ namespace BrightIdeasSoftware
private int maxNumberImages = 10;
///
- /// Сڻڴֵֵͼ
+ /// Values less than or equal to this will have 0 images drawn
///
[Category("Behavior"),
- Description("Сڻڴֵֵͼ"),
+ Description("Values less than or equal to this will have 0 images drawn"),
DefaultValue(0)]
- public int MinimumValue
- {
+ public int MinimumValue {
get { return minimumValue; }
set { minimumValue = value; }
}
@@ -3486,13 +3215,12 @@ namespace BrightIdeasSoftware
private int minimumValue = 0;
///
- /// ڻڸֵֵMaxNumberImagesͼ
+ /// Values greater than or equal to this will have MaxNumberImages images drawn
///
[Category("Behavior"),
- Description("ڻڸֵֵMaxNumberImagesͼ"),
+ Description("Values greater than or equal to this will have MaxNumberImages images drawn"),
DefaultValue(100)]
- public int MaximumValue
- {
+ public int MaximumValue {
get { return maximumValue; }
set { maximumValue = value; }
}
@@ -3506,8 +3234,7 @@ namespace BrightIdeasSoftware
///
///
///
- public override void Render(Graphics g, Rectangle r)
- {
+ public override void Render(Graphics g, Rectangle r) {
this.DrawBackground(g, r);
r = this.ApplyCellPadding(r);
@@ -3526,16 +3253,15 @@ namespace BrightIdeasSoftware
if (aspectValue <= this.MinimumValue)
numberOfImages = 0;
else if (aspectValue < this.MaximumValue)
- numberOfImages = 1 + (int)(this.MaxNumberImages * (aspectValue - this.MinimumValue) / this.MaximumValue);
+ numberOfImages = 1 + (int) (this.MaxNumberImages * (aspectValue - this.MinimumValue) / this.MaximumValue);
else
numberOfImages = this.MaxNumberImages;
// If we need to shrink the image, what will its on-screen dimensions be?
int imageScaledWidth = image.Width;
int imageScaledHeight = image.Height;
- if (r.Height < image.Height)
- {
- imageScaledWidth = (int)((float)image.Width * (float)r.Height / (float)image.Height);
+ if (r.Height < image.Height) {
+ imageScaledWidth = (int) ((float) image.Width * (float) r.Height / (float) image.Height);
imageScaledHeight = r.Height;
}
// Calculate where the images should be drawn
@@ -3547,13 +3273,10 @@ namespace BrightIdeasSoftware
// Finally, draw the images
Rectangle singleImageRect = new Rectangle(imageBounds.X, imageBounds.Y, imageScaledWidth, imageScaledHeight);
Color backgroundColor = GetBackgroundColor();
- for (int i = 0; i < numberOfImages; i++)
- {
- if (this.ListItem.Enabled)
- {
+ for (int i = 0; i < numberOfImages; i++) {
+ if (this.ListItem.Enabled) {
this.DrawImage(g, singleImageRect, this.ImageSelector);
- }
- else
+ } else
ControlPaint.DrawImageDisabled(g, image, singleImageRect.X, singleImageRect.Y, backgroundColor);
singleImageRect.X += (imageScaledWidth + this.Spacing);
}
@@ -3564,16 +3287,14 @@ namespace BrightIdeasSoftware
///
/// A class to render a value that contains a bitwise-OR'ed collection of values.
///
- public class FlagRenderer : BaseRenderer
- {
+ public class FlagRenderer : BaseRenderer {
///
/// Register the given image to the given value
///
/// When this flag is present...
/// ...draw this image
- public void Add(Object key, Object imageSelector)
- {
- Int32 k2 = ((IConvertible)key).ToInt32(NumberFormatInfo.InvariantInfo);
+ public void Add(Object key, Object imageSelector) {
+ Int32 k2 = ((IConvertible) key).ToInt32(NumberFormatInfo.InvariantInfo);
this.imageMap[k2] = imageSelector;
this.keysInOrder.Remove(k2);
@@ -3585,8 +3306,7 @@ namespace BrightIdeasSoftware
///
///
///
- public override void Render(Graphics g, Rectangle r)
- {
+ public override void Render(Graphics g, Rectangle r) {
this.DrawBackground(g, r);
IConvertible convertable = this.Aspect as IConvertible;
@@ -3597,10 +3317,8 @@ namespace BrightIdeasSoftware
Int32 v2 = convertable.ToInt32(NumberFormatInfo.InvariantInfo);
ArrayList images = new ArrayList();
- foreach (Int32 key in this.keysInOrder)
- {
- if ((v2 & key) == key)
- {
+ foreach (Int32 key in this.keysInOrder) {
+ if ((v2 & key) == key) {
Image image = this.GetImage(this.imageMap[key]);
if (image != null)
images.Add(image);
@@ -3617,8 +3335,7 @@ namespace BrightIdeasSoftware
///
///
///
- protected override void HandleHitTest(Graphics g, OlvListViewHitTestInfo hti, int x, int y)
- {
+ protected override void HandleHitTest(Graphics g, OlvListViewHitTestInfo hti, int x, int y) {
IConvertible convertable = this.Aspect as IConvertible;
if (convertable == null)
return;
@@ -3626,16 +3343,12 @@ namespace BrightIdeasSoftware
Int32 v2 = convertable.ToInt32(NumberFormatInfo.InvariantInfo);
Point pt = this.Bounds.Location;
- foreach (Int32 key in this.keysInOrder)
- {
- if ((v2 & key) == key)
- {
+ foreach (Int32 key in this.keysInOrder) {
+ if ((v2 & key) == key) {
Image image = this.GetImage(this.imageMap[key]);
- if (image != null)
- {
+ if (image != null) {
Rectangle imageRect = new Rectangle(pt, image.Size);
- if (imageRect.Contains(x, y))
- {
+ if (imageRect.Contains(x, y)) {
hti.UserData = key;
return;
}
@@ -3668,8 +3381,7 @@ namespace BrightIdeasSoftware
///
/// Create a DescribedTaskRenderer
///
- public DescribedTaskRenderer()
- {
+ public DescribedTaskRenderer() {
this.noWrapStringFormat = new StringFormat(StringFormatFlags.NoWrap);
this.noWrapStringFormat.Trimming = StringTrimming.EllipsisCharacter;
this.noWrapStringFormat.Alignment = StringAlignment.Near;
@@ -3680,7 +3392,8 @@ namespace BrightIdeasSoftware
#region Configuration properties
///
- ///ıǷӦʹGDI̳֣ʹıбͼؼ
+ /// Should text be rendered using GDI routines? This makes the text look more
+ /// like a native List view control.
///
public override bool UseGdiTextRendering
{
@@ -3693,39 +3406,35 @@ namespace BrightIdeasSoftware
}
///
- /// ȡñ
+ /// Gets or set the font that will be used to draw the title of the task
///
/// If this is null, the ListView's font will be used
[Category("ObjectListView"),
- Description(""),
+ Description("The font that will be used to draw the title of the task"),
DefaultValue(null)]
- public Font TitleFont
- {
+ public Font TitleFont {
get { return titleFont; }
set { titleFont = value; }
}
-
private Font titleFont;
///
- /// ΪõĬֵ
+ /// Return a font that has been set for the title or a reasonable default
///
[Browsable(false)]
- public Font TitleFontOrDefault
- {
+ public Font TitleFontOrDefault {
get { return this.TitleFont ?? this.ListView.Font; }
}
///
- /// ȡ(Title)ɫ
+ /// Gets or set the color of the title of the task
///
- /// δѡлбͼаѡʱʹôɫ
- ///
+ /// This color is used when the task is not selected or when the listview
+ /// has a translucent selection mechanism.
[Category("ObjectListView"),
- Description("Titleɫ"),
- DefaultValue(typeof(Color), "")]
- public Color TitleColor
- {
+ Description("The color of the title"),
+ DefaultValue(typeof (Color), "")]
+ public Color TitleColor {
get { return titleColor; }
set { titleColor = value; }
}
@@ -3733,31 +3442,28 @@ namespace BrightIdeasSoftware
private Color titleColor;
///
- /// ɫĬֵ
+ /// Return the color of the title of the task or a reasonable default
///
[Browsable(false)]
- public Color TitleColorOrDefault
- {
- get
- {
+ public Color TitleColorOrDefault {
+ get {
if (!this.ListItem.Enabled)
return this.SubItem.ForeColor;
if (this.IsItemSelected || this.TitleColor.IsEmpty)
return this.GetForegroundColor();
-
+
return this.TitleColor;
}
}
///
- /// ȡ(Description)
+ /// Gets or set the font that will be used to draw the description of the task
///
- /// Ϊnullʹlistview
+ /// If this is null, the ListView's font will be used
[Category("ObjectListView"),
- Description("Description"),
+ Description("The font that will be used to draw the description of the task"),
DefaultValue(null)]
- public Font DescriptionFont
- {
+ public Font DescriptionFont {
get { return descriptionFont; }
set { descriptionFont = value; }
}
@@ -3765,38 +3471,33 @@ namespace BrightIdeasSoftware
private Font descriptionFont;
///
- ///ΪDescriptionõĬֵ
+ /// Return a font that has been set for the title or a reasonable default
///
[Browsable(false)]
- public Font DescriptionFontOrDefault
- {
+ public Font DescriptionFontOrDefault {
get { return this.DescriptionFont ?? this.ListView.Font; }
}
///
- ///ȡ(Description)ɫ
+ /// Gets or set the color of the description of the task
///
- ///
- /// δѡлбͼаѡʱʹôɫ
- ///
+ /// This color is used when the task is not selected or when the listview
+ /// has a translucent selection mechanism.
[Category("ObjectListView"),
- Description("Descriptionɫ"),
- DefaultValue(typeof(Color), "")]
- public Color DescriptionColor
- {
+ Description("The color of the description"),
+ DefaultValue(typeof (Color), "")]
+ public Color DescriptionColor {
get { return descriptionColor; }
set { descriptionColor = value; }
}
private Color descriptionColor = Color.Empty;
///
- /// (Description)ɫĬֵ
+ /// Return the color of the description of the task or a reasonable default
///
[Browsable(false)]
- public Color DescriptionColorOrDefault
- {
- get
- {
+ public Color DescriptionColorOrDefault {
+ get {
if (!this.ListItem.Enabled)
return this.SubItem.ForeColor;
if (this.IsItemSelected && !this.ListView.UseTranslucentSelection)
@@ -3807,10 +3508,10 @@ namespace BrightIdeasSoftware
private static Color defaultDescriptionColor = Color.FromArgb(45, 46, 49);
///
- /// ȡͼƬ֮ľ
+ /// Gets or sets the number of pixels that will be left between the image and the text
///
[Category("ObjectListView"),
- Description("ȡͼƬ֮ľ"),
+ Description("The number of pixels that that will be left between the image and the text"),
DefaultValue(4)]
public int ImageTextSpace
{
@@ -3831,10 +3532,10 @@ namespace BrightIdeasSoftware
}
private int topSpace = 4;
///
- ///ȡñ(Title)(Description)֮ľ(λ:)
+ /// Gets or sets the number of pixels that will be left between the title and the description
///
[Category("ObjectListView"),
- Description("ȡñ(Title)(Description)֮ľ(λ:)"),
+ Description("The number of pixels that that will be left between the title and the description"),
DefaultValue(2)]
public int TitleDescriptionSpace
{
@@ -3844,13 +3545,12 @@ namespace BrightIdeasSoftware
private int titleDescriptionSpace = 2;
///
- ///ȡøDescriptionҹģͶ
- ///
+ /// Gets or sets the name of the aspect of the model object that contains the task description
+ ///
[Category("ObjectListView"),
- Description("DescriptionҹģͶ"),
+ Description("The name of the aspect of the model object that contains the task description"),
DefaultValue(null)]
- public string DescriptionAspectName
- {
+ public string DescriptionAspectName {
get { return descriptionAspectName; }
set { descriptionAspectName = value; }
}
@@ -3875,8 +3575,7 @@ namespace BrightIdeasSoftware
///
/// When a filter changes, keep track of the text matching filters
///
- IModelFilter IFilterAwareRenderer.Filter
- {
+ IModelFilter IFilterAwareRenderer.Filter {
get { return this.Filter; }
set { this.highlightTextRenderer.RegisterNewFilter(value); }
}
@@ -3890,8 +3589,7 @@ namespace BrightIdeasSoftware
///
///
///
- public virtual string GetDescription(object model)
- {
+ public virtual string GetDescription(object model) {
if (String.IsNullOrEmpty(this.DescriptionAspectName))
return String.Empty;
@@ -3911,8 +3609,7 @@ namespace BrightIdeasSoftware
///
///
///
- public override void ConfigureSubItem(DrawListViewSubItemEventArgs e, Rectangle cellBounds, object model)
- {
+ public override void ConfigureSubItem(DrawListViewSubItemEventArgs e, Rectangle cellBounds, object model) {
base.ConfigureSubItem(e, cellBounds, model);
this.highlightTextRenderer.ConfigureSubItem(e, cellBounds, model);
}
@@ -3922,8 +3619,7 @@ namespace BrightIdeasSoftware
///
///
///
- public override void Render(Graphics g, Rectangle r)
- {
+ public override void Render(Graphics g, Rectangle r) {
this.DrawBackground(g, r);
r = this.ApplyCellPadding(r);
this.DrawDescribedTask(g, r, this.GetText(), this.GetDescription(this.RowObject), this.GetImageSelector());
@@ -3937,15 +3633,13 @@ namespace BrightIdeasSoftware
///
///
///
- protected virtual void DrawDescribedTask(Graphics g, Rectangle r, string title, string description, object imageSelector)
- {
+ protected virtual void DrawDescribedTask(Graphics g, Rectangle r, string title, string description, object imageSelector) {
//Debug.WriteLine(String.Format("DrawDescribedTask({0}, {1}, {2}, {3})", r, title, description, imageSelector));
// Draw the image if one's been given
Rectangle textBounds = r;
- if (imageSelector != null)
- {
+ if (imageSelector != null) {
int imageWidth = this.DrawImage(g, r, imageSelector);
int gapToText = imageWidth + this.ImageTextSpace;
textBounds.Y += TopSpace;
@@ -3954,10 +3648,8 @@ namespace BrightIdeasSoftware
}
// Draw the title
- if (!String.IsNullOrEmpty(title))
- {
- using (SolidBrush b = new SolidBrush(this.TitleColorOrDefault))
- {
+ if (!String.IsNullOrEmpty(title)) {
+ using (SolidBrush b = new SolidBrush(this.TitleColorOrDefault)) {
this.highlightTextRenderer.CanWrap = false;
this.highlightTextRenderer.Font = this.TitleFontOrDefault;
this.highlightTextRenderer.TextBrush = b;
@@ -3972,14 +3664,12 @@ namespace BrightIdeasSoftware
}
// Draw the description
- if (!String.IsNullOrEmpty(description))
- {
- using (SolidBrush b = new SolidBrush(this.DescriptionColorOrDefault))
- {
+ if (!String.IsNullOrEmpty(description)) {
+ using (SolidBrush b = new SolidBrush(this.DescriptionColorOrDefault)) {
this.highlightTextRenderer.CanWrap = true;
this.highlightTextRenderer.Font = this.DescriptionFontOrDefault;
this.highlightTextRenderer.TextBrush = b;
- this.highlightTextRenderer.DrawText(g, textBounds, description);
+ this.highlightTextRenderer.DrawText(g, textBounds, description);
}
}
@@ -3997,8 +3687,7 @@ namespace BrightIdeasSoftware
///
///
///
- protected override void HandleHitTest(Graphics g, OlvListViewHitTestInfo hti, int x, int y)
- {
+ protected override void HandleHitTest(Graphics g, OlvListViewHitTestInfo hti, int x, int y) {
if (this.Bounds.Contains(x, y))
hti.HitTestLocation = HitTestLocation.Text;
}
@@ -4007,18 +3696,17 @@ namespace BrightIdeasSoftware
}
///
- /// Ⱦ䵥Ԫлһܰť
+ /// This renderer draws a functioning button in its cell
///
- public class ColumnButtonRenderer : BaseRenderer
- {
+ public class ColumnButtonRenderer : BaseRenderer {
#region Properties
///
- /// ȡðťĴСģʽ
+ /// Gets or sets how each button will be sized
///
[Category("ObjectListView"),
- Description(" ȡðťĴСģʽ"),
+ Description("How each button will be sized"),
DefaultValue(OLVColumn.ButtonSizingMode.TextBounds)]
public OLVColumn.ButtonSizingMode SizingMode
{
@@ -4028,11 +3716,11 @@ namespace BrightIdeasSoftware
private OLVColumn.ButtonSizingMode sizingMode = OLVColumn.ButtonSizingMode.TextBounds;
///
- /// ȡSizingModeΪFixedBoundʱťĴС
+ /// Gets or sets the size of the button when the SizingMode is FixedBounds
///
- /// δãʹõԪı߽
+ /// If this is not set, the bounds of the cell will be used
[Category("ObjectListView"),
- Description("ȡSizingModeΪFixedBoundʱťĴС"),
+ Description("The size of the button when the SizingMode is FixedBounds"),
DefaultValue(null)]
public Size? ButtonSize
{
@@ -4042,10 +3730,10 @@ namespace BrightIdeasSoftware
private Size? buttonSize;
///
- ///ȡõSizingModeΪTextBoundʱԪΧĶռ
+ /// Gets or sets the extra space that surrounds the cell when the SizingMode is TextBounds
///
[Category("ObjectListView"),
- Description("ȡõSizingModeΪTextBoundʱԪΧĶռ")]
+ Description("The extra space that surrounds the cell when the SizingMode is TextBounds")]
public Size? ButtonPadding
{
get { return this.buttonPadding; }
@@ -4053,18 +3741,17 @@ namespace BrightIdeasSoftware
}
private Size? buttonPadding = new Size(10, 10);
- private Size ButtonPaddingOrDefault
- {
+ private Size ButtonPaddingOrDefault {
get { return this.ButtonPadding ?? new Size(10, 10); }
}
///
- /// ȡðťռõ
- /// -1 ʾƿ
+ /// Gets or sets the maximum width that a button can occupy.
+ /// -1 means there is no maximum width.
///
- /// SizingModeΪTextBoundʱŻЧ
+ /// This is only considered when the SizingMode is TextBounds
[Category("ObjectListView"),
- Description("SizingModeΪTextBoundʱťԴﵽ"),
+ Description("The maximum width that a button can occupy when the SizingMode is TextBounds"),
DefaultValue(-1)]
public int MaxButtonWidth
{
@@ -4074,32 +3761,79 @@ namespace BrightIdeasSoftware
private int maxButtonWidth = -1;
///
- /// ȡðťռõСȡ
- /// -1 ʾƿ
+ /// Gets or sets the minimum width that a button can occupy.
+ /// -1 means there is no minimum width.
///
- /// SizingModeΪTextBoundʱŻЧ
+ /// This is only considered when the SizingMode is TextBounds
[Category("ObjectListView"),
- Description("SizingModeΪTextBoundʱťԴﵽСȡ"),
+ Description("The minimum width that a button can be when the SizingMode is TextBounds"),
DefaultValue(-1)]
- public int MinButtonWidth
- {
+ public int MinButtonWidth {
get { return this.minButtonWidth; }
set { this.minButtonWidth = value; }
}
private int minButtonWidth = -1;
-
+ ///
+ ///ȡôаťɫ(аťĻ)
+ ///
+ [Category("ObjectListView"),
+ Description("ȡôаťɫ(аťĻ)")]
+ public Color ButtonForeColor
+ {
+ get;
+ set;
+ } = Color.White;
+ ///
+ ///ȡôаťıɫ(аťĻ)
+ ///
+ [Category("ObjectListView"),
+ Description("ȡôаťıɫ(аťĻ)")]
+ public Color ButtonBaseColor
+ {
+ get;
+ set;
+ } = Color.Green;
+ ///
+ ///ȡôаťı߿ɫ(аťĻ)
+ ///
+ [Category("ObjectListView"),
+ Description("ȡôаťı߿ɫ(аťĻ)")]
+ public Color ButtonBorderColor
+ {
+ get;
+ set;
+ } = Color.Gray;
+ ///
+ ///ȡôаťڱ߿ɫ(аťĻ)
+ ///
+ [Category("ObjectListView"),
+ Description("ȡôаťڱ߿ɫ(аťĻ)")]
+ public Color ButtonInnerBorderColor
+ {
+ get;
+ set;
+ } = Color.Gray;
+ ///
+ ///ȡôаťǷ߿(аťĻ)
+ ///
+ [Category("ObjectListView"),
+ Description("ȡôаťǷ߿(аťĻ)")]
+ public bool ButtonDrawBorder
+ {
+ get;
+ set;
+ } =true;
+
#endregion
-
#region Rendering
///
- /// ݵĴС
+ /// Calculate the size of the contents
///
///
///
///
- protected override Size CalculateContentSize(Graphics g, Rectangle r)
- {
+ protected override Size CalculateContentSize(Graphics g, Rectangle r) {
if (this.SizingMode == OLVColumn.ButtonSizingMode.CellBounds)
return r.Size;
@@ -4121,12 +3855,11 @@ namespace BrightIdeasSoftware
}
///
- /// ť
+ /// Draw the button
///
///
///
- protected override void DrawImageAndText(Graphics g, Rectangle r)
- {
+ protected override void DrawImageAndText(Graphics g, Rectangle r) {
TextFormatFlags textFormatFlags = TextFormatFlags.HorizontalCenter |
TextFormatFlags.VerticalCenter |
TextFormatFlags.EndEllipsis |
@@ -4137,8 +3870,31 @@ namespace BrightIdeasSoftware
textFormatFlags |= TextFormatFlags.RightToLeft;
string buttonText = GetText();
+ //g.DrawString(buttonText, this.Font,Brushes.Black,new PointF(r.X,r.Y));
if (!String.IsNullOrEmpty(buttonText))
- ButtonRenderer.DrawButton(g, r, buttonText, this.Font, textFormatFlags, false, CalculatePushButtonState());
+ {
+ var button_state = CalculatePushButtonState();
+ var baseColor = ButtonBaseColor;
+ if (button_state == PushButtonState.Normal)
+ {
+ baseColor = ButtonBaseColor;
+ }
+ else if (button_state == PushButtonState.Hot)
+ {
+ baseColor = Rendering.Util_GDI.GetColor(ButtonBaseColor, 0, -35, -24, -30);
+ }
+ else if (button_state == PushButtonState.Pressed)
+ {
+ baseColor = Rendering.Util_GDI.GetColor(ButtonBaseColor, 0, -35, -24, -9);
+ }
+ else if (button_state == PushButtonState.Disabled)
+ {
+ baseColor = SystemColors.ControlDark;
+ }
+ Rendering.Util_GDI.DrawButtonX(buttonText, g, r, this.ButtonForeColor, baseColor, ButtonBorderColor, ButtonInnerBorderColor, ryControls.RoundStyle.All, 5, ButtonDrawBorder);
+ //Rendering.Util_GDI.DrawRoundButton(buttonText, g, r, Rendering.buttonStyle.ButtonNormal);
+ //ButtonRenderer.DrawButton(g, r, buttonText, this.Font, textFormatFlags, false, CalculatePushButtonState());
+ }
}
///
@@ -4149,19 +3905,17 @@ namespace BrightIdeasSoftware
///
///
///
- protected override void StandardHitTest(Graphics g, OlvListViewHitTestInfo hti, Rectangle bounds, int x, int y)
- {
+ protected override void StandardHitTest(Graphics g, OlvListViewHitTestInfo hti, Rectangle bounds, int x, int y) {
Rectangle r = ApplyCellPadding(bounds);
if (r.Contains(x, y))
hti.HitTestLocation = HitTestLocation.Button;
}
///
- /// ť״̬
+ /// What is the state of the button?
///
///
- protected PushButtonState CalculatePushButtonState()
- {
+ protected PushButtonState CalculatePushButtonState() {
if (!this.ListItem.Enabled && !this.Column.EnableButtonWhenItemIsDisabled)
return PushButtonState.Disabled;
@@ -4172,12 +3926,10 @@ namespace BrightIdeasSoftware
}
///
- /// Ƿڰť
+ /// Is the mouse over the button?
///
- protected bool IsButtonHot
- {
- get
- {
+ protected bool IsButtonHot {
+ get {
return this.IsCellHot && this.ListView.HotCellHitLocation == HitTestLocation.Button;
}
}
diff --git a/Source/ryControls/ObjectListView/Rendering/Util_GDI.cs b/Source/ryControls/ObjectListView/Rendering/Util_GDI.cs
new file mode 100644
index 0000000..b3f0e0b
--- /dev/null
+++ b/Source/ryControls/ObjectListView/Rendering/Util_GDI.cs
@@ -0,0 +1,238 @@
+using ryControls;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Text;
+
+namespace BrightIdeasSoftware.Rendering
+{
+
+ enum buttonStyle
+ {
+ ///
+ /// 正常为选中按钮
+ ///
+ ButtonNormal,
+ ///
+ /// 获得焦点的按钮
+ ///
+ ButtonFocuse,
+ ///
+ /// 鼠标经过样式
+ ///
+ ButtonMouseOver,
+ ///
+ /// 获得焦点并鼠标经过
+ ///
+ ButtonFocuseAndMouseOver
+ }
+ ///
+ /// 自定义GDI工具,绘制按钮
+ ///
+ class Util_GDI
+ {
+
+ ///
+ /// 绘制圆形按钮(用法同矩形按钮)
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static void DrawCircleButton(string text, Graphics g, Point Location, int r, buttonStyle btnStyle)
+ {
+ Graphics Gcircle = g;
+ Rectangle rect = new Rectangle(Location.X, Location.Y, r, r);
+ Pen p = new Pen(new SolidBrush(Color.Black));
+ Gcircle.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
+ Gcircle.DrawEllipse(p, rect);
+ if (btnStyle == buttonStyle.ButtonFocuse)
+ {
+ Gcircle.FillEllipse(new SolidBrush(ColorTranslator.FromHtml("#338FCC")), rect);
+ }
+ else if (btnStyle == buttonStyle.ButtonMouseOver)
+ {
+ Gcircle.FillEllipse(new SolidBrush(ColorTranslator.FromHtml("#EAC100")), rect);
+ }
+ else if (btnStyle == buttonStyle.ButtonFocuseAndMouseOver)
+ {
+ Gcircle.FillEllipse(new SolidBrush(ColorTranslator.FromHtml("#EAC100")), rect);
+ }
+
+ p.DashStyle = DashStyle.Dash;
+ if (btnStyle != buttonStyle.ButtonNormal)
+ {
+
+ Gcircle.DrawEllipse(p, new Rectangle(rect.X + 2, rect.Y + 2, rect.Width - 4, rect.Height - 4));//虚线框
+ }
+ Gcircle.FillEllipse(new SolidBrush(Color.WhiteSmoke), new Rectangle(rect.X + 3, rect.Y + 3, rect.Width - 6, rect.Height - 6));
+ StringFormat sf = new StringFormat();
+ sf.Alignment = StringAlignment.Center;
+ sf.LineAlignment = StringAlignment.Center;
+ Gcircle.DrawString(text, new Font(new FontFamily("宋体"), 10), new SolidBrush(Color.Black), rect, sf);
+ p.Dispose();
+ }
+ public static Color GetColor(Color colorBase, int a, int r, int g, int b)
+ {
+ int a0 = colorBase.A;
+ int r0 = colorBase.R;
+ int g0 = colorBase.G;
+ int b0 = colorBase.B;
+ if (a + a0 > 255) { a = 255; } else { a = Math.Max(a + a0, 0); }
+ if (r + r0 > 255) { r = 255; } else { r = Math.Max(r + r0, 0); }
+ if (g + g0 > 255) { g = 255; } else { g = Math.Max(g + g0, 0); }
+ if (b + b0 > 255) { b = 255; } else { b = Math.Max(b + b0, 0); }
+
+ return Color.FromArgb(a, r, g, b);
+ }
+ public static void DrawButtonX(string Text, Graphics g,
+ Rectangle rect,
+ Color ForeColor,
+ Color baseColor,
+ Color borderColor,
+ Color innerBorderColor,
+ RoundStyle style,
+ int roundWidth, bool drawBorder)
+ {
+ RenderBackgroundInternal(g, rect, baseColor, borderColor, innerBorderColor, style, roundWidth, 0.35f, drawBorder, false, LinearGradientMode.Vertical);
+ StringFormat sf = new StringFormat();
+ sf.Alignment = StringAlignment.Center;
+ sf.LineAlignment = StringAlignment.Center;
+ g.DrawString(Text, new Font("宋体", 10), new SolidBrush(ForeColor), rect, sf);
+ }
+ private static void RenderBackgroundInternal(
+ Graphics g,
+ Rectangle rect,
+ Color baseColor,
+ Color borderColor,
+ Color innerBorderColor,
+ RoundStyle style,
+ int roundWidth,//圆角半径
+ float basePosition,
+ bool drawBorder,
+ bool drawGlass,
+ LinearGradientMode mode)
+ {
+ if (drawBorder)//是否画边框
+ {
+ rect.Width--;
+ rect.Height--;
+ }
+
+ using (LinearGradientBrush brush = new LinearGradientBrush(rect, Color.Transparent, Color.Transparent, mode))
+ {
+ Color[] colors = new Color[4];
+ colors[0] = GetColor(baseColor, 0, 35, 24, 9);
+ colors[1] = GetColor(baseColor, 0, 0, 0, 0);
+ colors[2] = baseColor;
+ colors[3] = GetColor(baseColor, 0, 0, 0, 0);
+
+ ColorBlend blend = new ColorBlend();
+ blend.Positions = new float[] { 0.0f, basePosition, basePosition, 1.0f };
+ blend.Colors = colors;
+ brush.InterpolationColors = blend;
+ if (style != RoundStyle.None)
+ {
+ using (GraphicsPath path =
+ ryControls.Drawing.CreatePath(rect, roundWidth, style, false))
+ {
+ g.FillPath(brush, path);
+ }
+
+ if (baseColor.A > 80)
+ {
+ Rectangle rectTop = rect;
+
+ if (mode == LinearGradientMode.Vertical)
+ {
+ // rectTop.Height = (int)(rectTop.Height * basePosition);
+ }
+ else
+ {
+ // rectTop.Width = (int)(rect.Width * basePosition);
+ }
+ using (GraphicsPath pathTop = ryControls.Drawing.CreatePath(
+ rectTop, roundWidth, RoundStyle.Top, false))
+ {
+ using (SolidBrush brushAlpha =
+ new SolidBrush(Color.FromArgb(80, 255, 255, 255)))
+ {
+ g.FillPath(brushAlpha, pathTop);
+ }
+ }
+ }
+ }
+ }
+ }
+ ///
+ /// 绘制圆角按钮
+ ///
+ /// 要绘制的文字
+ /// Graphics 对象
+ /// 要填充的矩形
+ ///
+ public static void DrawRoundButton(string Text, Graphics g, Rectangle rect, buttonStyle btnStyle)
+ {
+ //g.Clear(Color.White);
+ g.SmoothingMode = SmoothingMode.AntiAlias;//消除锯齿
+ Rectangle rectangle = rect;
+ Brush b = b = new SolidBrush(Color.Gray);
+ if (btnStyle == buttonStyle.ButtonFocuse)
+ {
+ b = new SolidBrush(ColorTranslator.FromHtml("#338FCC"));
+ }
+ else if (btnStyle == buttonStyle.ButtonMouseOver)
+ {
+ b = new SolidBrush(ColorTranslator.FromHtml("#C6A300"));
+ }
+ else if (btnStyle == buttonStyle.ButtonFocuseAndMouseOver)
+ {
+ b = new SolidBrush(ColorTranslator.FromHtml("#C6A300"));
+ }
+ g.DrawPath(new Pen(b), GetRoundRectangle(rectangle, 2));
+ rectangle = new Rectangle(rect.X + 2, rect.Y + 2, rect.Width - 4, rect.Height - 4);
+ Pen p = new Pen(Color.Gray, 0.5f);
+ p.DashStyle = DashStyle.Dash;
+ if (btnStyle == buttonStyle.ButtonFocuse || btnStyle == buttonStyle.ButtonFocuseAndMouseOver)
+ {
+ g.DrawRectangle(p, rectangle);//虚线框
+ }
+ g.FillRectangle(new SolidBrush(Color.Green), rectangle);//白色背景
+ StringFormat sf = new StringFormat();
+ sf.Alignment = StringAlignment.Center;
+ sf.LineAlignment = StringAlignment.Center;
+ g.DrawString(Text, new Font("宋体", 10), new SolidBrush(Color.White), rectangle, sf);
+ p.Dispose();
+ b.Dispose();
+ g.SmoothingMode = SmoothingMode.Default;
+ }
+
+ ///
+ /// 根据普通矩形得到圆角矩形的路径
+ ///
+ /// 原始矩形
+ /// 半径
+ /// 图形路径
+ private static GraphicsPath GetRoundRectangle(Rectangle rectangle, int r)
+ {
+ int l = 2 * r;
+ // 把圆角矩形分成八段直线、弧的组合,依次加到路径中
+ GraphicsPath gp = new GraphicsPath();
+ gp.AddLine(new Point(rectangle.X + r, rectangle.Y), new Point(rectangle.Right - r, rectangle.Y));
+ gp.AddArc(new Rectangle(rectangle.Right - l, rectangle.Y, l, l), 270F, 90F);
+
+ gp.AddLine(new Point(rectangle.Right, rectangle.Y + r), new Point(rectangle.Right, rectangle.Bottom - r));
+ gp.AddArc(new Rectangle(rectangle.Right - l, rectangle.Bottom - l, l, l), 0F, 90F);
+
+ gp.AddLine(new Point(rectangle.Right - r, rectangle.Bottom), new Point(rectangle.X + r, rectangle.Bottom));
+ gp.AddArc(new Rectangle(rectangle.X, rectangle.Bottom - l, l, l), 90F, 90F);
+
+ gp.AddLine(new Point(rectangle.X, rectangle.Bottom - r), new Point(rectangle.X, rectangle.Y + r));
+ gp.AddArc(new Rectangle(rectangle.X, rectangle.Y, l, l), 180F, 90F);
+ return gp;
+ }
+
+ }
+}
diff --git a/Source/ryControls/bin/x86/Debug/MyDb.dll b/Source/ryControls/bin/x86/Debug/MyDb.dll
index a867a7b..11202e9 100644
Binary files a/Source/ryControls/bin/x86/Debug/MyDb.dll and b/Source/ryControls/bin/x86/Debug/MyDb.dll differ
diff --git a/Source/ryControls/bin/x86/Debug/ryControls.dll b/Source/ryControls/bin/x86/Debug/ryControls.dll
index 61027ca..46a6cd4 100644
Binary files a/Source/ryControls/bin/x86/Debug/ryControls.dll and b/Source/ryControls/bin/x86/Debug/ryControls.dll differ
diff --git a/Source/ryControls/bin/x86/Release/MyDb.dll b/Source/ryControls/bin/x86/Release/MyDb.dll
index 4594bfc..06bbe29 100644
Binary files a/Source/ryControls/bin/x86/Release/MyDb.dll and b/Source/ryControls/bin/x86/Release/MyDb.dll differ
diff --git a/Source/ryControls/bin/x86/Release/ryControls.dll b/Source/ryControls/bin/x86/Release/ryControls.dll
index 1df6a98..a6b1468 100644
Binary files a/Source/ryControls/bin/x86/Release/ryControls.dll and b/Source/ryControls/bin/x86/Release/ryControls.dll differ
diff --git a/Source/ryControls/ryControlsV4.csproj b/Source/ryControls/ryControlsV4.csproj
index 5908e87..82fcfdf 100644
--- a/Source/ryControls/ryControlsV4.csproj
+++ b/Source/ryControls/ryControlsV4.csproj
@@ -321,6 +321,7 @@
Component
+
Form
diff --git a/Source/ryUpdate/Properties/Resources.Designer.cs b/Source/ryUpdate/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..b06e61f
--- /dev/null
+++ b/Source/ryUpdate/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+//
+// 此代码由工具生成。
+// 运行时版本:4.0.30319.42000
+//
+// 对此文件的更改可能会导致不正确的行为,并且如果
+// 重新生成代码,这些更改将会丢失。
+//
+//------------------------------------------------------------------------------
+
+namespace ryUpdate.Properties {
+ using System;
+
+
+ ///
+ /// 一个强类型的资源类,用于查找本地化的字符串等。
+ ///
+ // 此类是由 StronglyTypedResourceBuilder
+ // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+ // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+ // (以 /str 作为命令选项),或重新生成 VS 项目。
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// 返回此类使用的缓存的 ResourceManager 实例。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ryUpdate.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// 重写当前线程的 CurrentUICulture 属性,对
+ /// 使用此强类型资源类的所有资源查找执行重写。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Source/ryUpdate/Properties/Resources.resx b/Source/ryUpdate/Properties/Resources.resx
new file mode 100644
index 0000000..29dcb1b
--- /dev/null
+++ b/Source/ryUpdate/Properties/Resources.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Source/ryUpdate/myUpdate/frmStartUpdate.Designer.cs b/Source/ryUpdate/myUpdate/frmStartUpdate.Designer.cs
index d010564..c7ae51b 100644
--- a/Source/ryUpdate/myUpdate/frmStartUpdate.Designer.cs
+++ b/Source/ryUpdate/myUpdate/frmStartUpdate.Designer.cs
@@ -28,93 +28,94 @@
///
private void InitializeComponent()
{
- this.components = new System.ComponentModel.Container();
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmStartUpdate));
- this.label1 = new System.Windows.Forms.Label();
- this.progressBar1 = new System.Windows.Forms.ProgressBar();
- this.label2 = new System.Windows.Forms.Label();
- this.BtnOK = new ryControls.ButtonEx();
- this.pictureBox1 = new System.Windows.Forms.PictureBox();
- this.Timer1 = new System.Windows.Forms.Timer(this.components);
- ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
- this.SuspendLayout();
- //
- // label1
- //
- this.label1.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
- this.label1.Location = new System.Drawing.Point(149, 9);
- this.label1.Name = "label1";
- this.label1.Size = new System.Drawing.Size(323, 58);
- this.label1.TabIndex = 1;
- this.label1.Text = "软件正在下载升级文件,请稍后。。。。";
- //
- // progressBar1
- //
- this.progressBar1.Location = new System.Drawing.Point(152, 94);
- this.progressBar1.Name = "progressBar1";
- this.progressBar1.Size = new System.Drawing.Size(320, 23);
- this.progressBar1.TabIndex = 2;
- //
- // label2
- //
- this.label2.AutoSize = true;
- this.label2.Location = new System.Drawing.Point(150, 79);
- this.label2.Name = "label2";
- this.label2.Size = new System.Drawing.Size(53, 12);
- this.label2.TabIndex = 3;
- this.label2.Text = "文件信息";
- //
- // BtnOK
- //
- this.BtnOK.BaseColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(76)))), ((int)(((byte)(95)))));
- this.BtnOK.Enabled = false;
- this.BtnOK.Location = new System.Drawing.Point(397, 249);
- this.BtnOK.Name = "BtnOK";
- this.BtnOK.Size = new System.Drawing.Size(75, 26);
- this.BtnOK.TabIndex = 4;
- this.BtnOK.Text = "完成更新";
- this.BtnOK.UseVisualStyleBackColor = true;
- this.BtnOK.Click += new System.EventHandler(this.BtnOK_Click);
- //
- // pictureBox1
- //
- this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
- this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
- this.pictureBox1.Location = new System.Drawing.Point(-1, -1);
- this.pictureBox1.Name = "pictureBox1";
- this.pictureBox1.Size = new System.Drawing.Size(144, 287);
- this.pictureBox1.TabIndex = 0;
- this.pictureBox1.TabStop = false;
- //
- // Timer1
- //
- this.Timer1.Interval = 3000;
- this.Timer1.Tick += new System.EventHandler(this.Timer1_Tick);
- //
- // frmStartUpdate
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(484, 285);
- this.Controls.Add(this.BtnOK);
- this.Controls.Add(this.label2);
- this.Controls.Add(this.progressBar1);
- this.Controls.Add(this.label1);
- this.Controls.Add(this.pictureBox1);
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
- this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
- this.MaximizeBox = false;
- this.Name = "frmStartUpdate";
- this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
- this.Text = "在线更新";
- this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmStartUpdate_FormClosing);
- this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FrmStartUpdate_FormClosed);
- this.Load += new System.EventHandler(this.FrmStartUpdate_Load);
- this.Shown += new System.EventHandler(this.FrmStartUpdate_Shown);
- ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
- this.ResumeLayout(false);
- this.PerformLayout();
-
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmStartUpdate));
+ this.label1 = new System.Windows.Forms.Label();
+ this.progressBar1 = new System.Windows.Forms.ProgressBar();
+ this.label2 = new System.Windows.Forms.Label();
+ this.BtnOK = new ryControls.ButtonEx();
+ this.pictureBox1 = new System.Windows.Forms.PictureBox();
+ this.Timer1 = new System.Windows.Forms.Timer(this.components);
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
+ this.label1.Location = new System.Drawing.Point(149, 9);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(323, 58);
+ this.label1.TabIndex = 1;
+ this.label1.Text = "软件正在下载升级文件,请稍后。。。。";
+ //
+ // progressBar1
+ //
+ this.progressBar1.Location = new System.Drawing.Point(152, 94);
+ this.progressBar1.Name = "progressBar1";
+ this.progressBar1.Size = new System.Drawing.Size(320, 23);
+ this.progressBar1.TabIndex = 2;
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(150, 79);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(53, 12);
+ this.label2.TabIndex = 3;
+ this.label2.Text = "文件信息";
+ //
+ // BtnOK
+ //
+ this.BtnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.BtnOK.BaseColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(76)))), ((int)(((byte)(95)))));
+ this.BtnOK.Enabled = false;
+ this.BtnOK.Location = new System.Drawing.Point(397, 249);
+ this.BtnOK.Name = "BtnOK";
+ this.BtnOK.Size = new System.Drawing.Size(75, 26);
+ this.BtnOK.TabIndex = 4;
+ this.BtnOK.Text = "完成更新";
+ this.BtnOK.UseVisualStyleBackColor = true;
+ this.BtnOK.Click += new System.EventHandler(this.BtnOK_Click);
+ //
+ // pictureBox1
+ //
+ this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
+ this.pictureBox1.Location = new System.Drawing.Point(-1, -1);
+ this.pictureBox1.Name = "pictureBox1";
+ this.pictureBox1.Size = new System.Drawing.Size(144, 164);
+ this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
+ this.pictureBox1.TabIndex = 0;
+ this.pictureBox1.TabStop = false;
+ //
+ // Timer1
+ //
+ this.Timer1.Interval = 3000;
+ this.Timer1.Tick += new System.EventHandler(this.Timer1_Tick);
+ //
+ // frmStartUpdate
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(483, 282);
+ this.Controls.Add(this.BtnOK);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.progressBar1);
+ this.Controls.Add(this.label1);
+ this.Controls.Add(this.pictureBox1);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.Name = "frmStartUpdate";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "在线更新";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmStartUpdate_FormClosing);
+ this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FrmStartUpdate_FormClosed);
+ this.Load += new System.EventHandler(this.FrmStartUpdate_Load);
+ this.Shown += new System.EventHandler(this.FrmStartUpdate_Shown);
+ ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
}
#endregion
diff --git a/Source/ryUpdate/myUpdate/frmStartUpdate.resx b/Source/ryUpdate/myUpdate/frmStartUpdate.resx
index 0780013..fa734a9 100644
--- a/Source/ryUpdate/myUpdate/frmStartUpdate.resx
+++ b/Source/ryUpdate/myUpdate/frmStartUpdate.resx
@@ -1,549 +1,725 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
-
- 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
- /P8+OmXzcxjRswAAAABJRU5ErkJggg==
-
-
-
- 17, 17
-
-
-
- AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAABILAAASCwAAAAAAAAAA
- AABSUlIAUlJSAFJSUgBSUlIAUlJSABgYGAAYGBgAGBgYABkZGQA0NDQAHh4aABgYGAAfHx8AKioqADc1
- NwBDQUMAQkBCADUzNQAoKCgAHBwcABgYGAAqKioAMTExABkZGQAZGRkAGBgYABgYGABHR0cAR0dHAEZG
- RgBGRkYARkZGAFJSUgBSUlIAUlJSAFJSUgBSUlIAGBgYABgYGAAYGBgAGRkZADQ0NAAeHhoAGBgYAB4e
- HgAqKioANzU3AENBQwBCQEIANTM1ACgoKAAcHBwAGBgYACoqKgAwMDAAGRkZABkZGQAYGBgAGBgYAEdH
- RwBHR0cARkZGAEZGRgBGRkYAUlJSAFJSUgBSUlIAUlJSAAsLCwALCwsADw8PABAQEAAREREAJSUlAAUF
- BhcPDw9CGRkZZyUlJYIwLTCTODU4mDc0N5kuKy6QIyMjfRYWFl8LCws2BQUFDBsbGwAREREAERERAA8P
- DwALCwsADAwMAEZGRgBGRkYARkZGAEZGRgBSUlIAUlJSAFJSUgBQUFAACwsLAAsLCwAPDw8REBAQHBER
- ES4lJSWeX11e/5WRlP/Ix8r/1NTU/9bW1v/Y2Nj/19fX/9fX1//X1tb/x8TH/5GOkP9bV1r9GxsbbxER
- ESoREREkDw8PGAsLCwUMDAwARkZGAEZGRgBGRkYARkZGADw8PAA8PDwAPDw8ADw8PAAQEBAAEBAQBRQU
- FCQUFBQ2Dg4OOXVxc9vl5OT/urm4/3RwdP9PT1L/OTc6/zc1OP85Njn/PDg7/1ZTVv9+foH/3dzc/+zr
- 7f9HREmcDw8PPxQUFDwUFBQrEBAQEBEREQA6OjoAOjo6ADo6OgA7OzsAOzs7ADs7OwA8PDwAPDw8ABAQ
- EAAQEBAAFBQUABQUFAAODg4AdXFzAGFeX03d3Nutubm45YKChf8vLC//MzE0/zIwM/8xLjH/jImM/8jH
- ytvp5+ibSEVKM0dESQAPDw8AFBQUABQUFAAQEBAAERERADo6OgA6OjoAOjo6ADs7OwDT09IA09PSANPT
- 0gDT09IA1tbVAOrp6QD6+vkA+vn5APn5+AD5+PgAYV5fAN3c2wC5uLgAfXp9TAYGBv8FBQX/BQUF/wkJ
- Cf+IiIs4yMfKAOnn6ABIRUkA7u3tAO3s7ADk4+YA2NfYAMrHyQDBv8AAw8HCAMPBwgDDwcIAw8HCANPT
- 0gDT09IA09PSANPT0gCTkJG5n5yc1aCentSgnp/VoJ6e1aCen9Wgnp7Vn5yc1Z6cnNOVkpPffnx9/398
- ff9/fH3/fnp8/5SSktuem5zVnpuc15+cndegnZ3XoJ2d156cnNedmprXmpeY05OQkbnDwcIAw8HCAMPB
- wgDDwcIAy8rKAMvKygDLysoAy8rKAJiVlsjg4OD/8fLz/9ja3f/y9PX/6uzu/+nq7P/k5un/7u/x//T1
- 9v/s7e//8PLz/+nr7P/r7O7/5OXp/9zd3//h4uX/4OHl/9na3f/W2Nr/0dPY/83M0P++vL7/k5CRubq5
- uQC6ubkAurm5ALq5uQDNzc4Azc3OAM3NzgDNzc4Al5WVx97e3f/t49n/6t7S//Hl2f/v5Nj/7+TY/+/j
- 1//w5dn/8OXZ/+/j2P/w5dn/7uPX/+3i1v/s4dT/7ODU/+vf0//m28//5dnN/+TYzP/h08b/0MbB/7y7
- vv+TkJG5ubi6ALm4ugC5uLoAubi6ANHS0gDR0tIA0dLSANHS0gCYlZbH1dTU/7hqJf/AYAv/wmcR/8Vs
- F//JcRr/z3Ug/9B3I//SeiX/1X0o/9Z/Kv/YgSv/2IQs/9qELP/ahCv/2YMq/9iCKv/Xfij/1Xom/9R2
- Hf+5g1L/uLzD/5OQkbm3ub0At7m9ALe5vQC3ub0A1NTVANTU1QDU1NUA1NTVAJiVlsfW1dX/r14Z/7pY
- Bf+6WAT/u1oE/79eB//CYgv/xGYO/8ZrEP/HbRL/ym8U/81wFf/NcRb/znEW/81xFf/NcBb/zG4T/8ps
- Ef/IahD/yGIF/7B2RP+7v8b/k5CRubm7wAC5u8AAubvAALm8wADW1tcA1tbXANbW1wDW1tcAmZWWx9jW
- 1v+uXxz/uVoL/7pdD/+6Wgn/uVgD/7xbBv++Xwn/wGEL/8JjDf/DZQ//xGcQ/8VoEP/GaBH/xWkQ/8Vn
- EP/EZQ7/w2IN/8FhC//AWgP/rnNB/77CyP+TkJG5vL7CALy+wgC8vsIAvL7CANnZ2gDZ2doA2dnaANnZ
- 2gCZlpbH2tbY/69hH/+7XRD/uV4S/7peE/+5Wwv/tFQC/7hVA/+6WQX/u1sF/71cB/++XQf/vl4H/75e
- B/++Xgj/vV0I/7xcBv+7WgX/uVgE/7hRAf+qbj3/wMTL/5OQkbm+wMUAvsDFAL7AxQC+wMUA29vcANvb
- 3ADb29wA29vcAJmWlsfa19n/sGIj/71iGP+7Yhn/u2EX/7thFv+5XRD/sU8C/7BLAf+0TgH/uVIC/7pV
- A/+5VAP/t1UD/7dVA/+3VAP/tlMC/7VRAv+zTgH/skYA/6RqOf/Dx87/k5CRucDDxwDBw8cAwMPHAMDD
- xwDb2dsA29nbANvZ2wDb2dsAmZaWx9rW2P+xZCX/v2cg/75nIP+9Zh7/vWUc/7xkHP+7Yhf/sk8D/7BK
- Af9scgf/XnMH/6VYB/+zSAD/r0kB/69JAf+uSQH/sEgA/7BIAP+xRAD/pGc5/8XJ0P+TkJG5wsXJAMLF
- yQDCxckAwsXJANfW2ADX1tgA19bYANfW2ACZlZbH19PU/7FmKP/CbCj/wGwo/8BrJ/+/aST/vmgi/79m
- If/DaSH/eoEd/wZrD/8BZgr/U3kW/6VWB/+xRgD/rkgA/69IAP+vSAD/r0gA/7FEAP+kaDj/x8vS/5OQ
- kbnEx8wAxMfMAMTHzADEx8wA0tLUANLS1ADS0tQA0tLUAJiVlsfTz9H/smcq/8VxMP/DcDD/wm8u/8Ju
- Lf/Cayn/xHQs/3+UNP8OcBb/AFwD/wBnA/8DehD/UHoW/6RYB/+yRgD/r0gA/69IAP+vSAD/sUQA/6Rm
- N//JzdP/k5CRucbKzQDGyc0AxsnNAMbKzQDRz9EA0c/RANHP0QDRz9EAmJWWx87Lzf+yaS7/x3g3/8V4
- Nv/EdzX/xXEz/8d4M/+Aljn/EXIa/wFoBv8AfAP/AJED/wGdB/8EkRb/UHcW/6VWB/+yRgD/r0gA/69I
- AP+xRAD/o2Y1/8vO1f+TkJG5yMvQAMjL0ADIy9AAyMvQAM3NzgDNzc4Azc3OAMzMzgCXlZXHzMfJ/7Jq
- Mf/Kfj7/x3w9/8h6O//KfTv/hJo+/x96J/8bgyf/D5cc/wWlFP8DsRD/BrkY/wzAIP8Lmx//T3YV/6VW
- B/+yRgD/r0gA/7FDAP+jZjX/zdDW/5OQkbnKzdEAys3RAMrN0QDKzdEAycnKAMnJygDJycoAycnKAJeU
- lcfGxMX/s2wz/8yDRv/Lf0P/zYJD/4yfQ/8sgzP/QphM/zmrQv8wvD3/LMQ6/xnHK/8g0TL/Jdc3/ync
- Pf8RoiX/T3QU/6VWB/+zRQD/sUMA/6NmNf/O0tj/k5CRuczP0wDMz9MAzM/TAMzP0wDGxscAxsbHAMbG
- xwDGxscAl5SVx8LAwP+zbTX/z4dP/82KTv+Qo0r/N4k8/2elbv9humn/Wshi/1jTYP9U2l7/M91B/zjn
- Sv9A7lH/RfFT/0HxU/8Wpin/UHUU/6NYB/+yQQD/omU0/9DT2/+TkJG5ztDWAM7Q1gDO0NUAztDVAMPD
- xADDw8QAw8PEAMPDxACXlJXIvry7/7RvN//VjVf/lKJS/zWNQP9/sor/gcKK/3vSh/9+34f/euKD/3Pq
- e/9I7lf/Tvpg/1z9b/9b/3P/Vf9u/0f8Y/8Omiv/Ynob/7RBAP+iZDT/0tXd/5OQkbnQ0tgA0NLYANDS
- 2ADQ0tgAwMDBAMDAwQDAwMEAwMDBAJeUlMi6tLX/tXE7/9mVYf9ogzz/QHsv/0R7L/9FfS//SIAx/1ef
- Vv+W75z/ifaT/1r7a/9z/oP/PJg9/0WCMP9GgzD/RIMv/z16Kf9sWxf/tkYA/6FjMv/W19//k5CRudLU
- 2QDS1NkA0tTZANLU2QC9u70Avbu9AL27vQC9u70Al5OUyLawsf+nYSv/xn9G/8V7Q//FekH/wng//8N2
- Pf/Ddjn/R4Ey/6T1rf+c+qL/cf9+/5r9qf9EgS//vG4v/8NqMf/CaTD/xG4y/8NwM/+yVgv/llsv/9fZ
- 4P+TkJG51NbbANTW2wDU1tsA1NbbALm2tgC5trYAuba2ALm2tgCWk5PIwLy//7ahl/+6ppb/vaiZ/7+q
- m//BrZ7/xK+j/8uxp/8ygDL/q/Sy/6T7qv+B/4//rvu7/zKBNv/OvKz/z7qs/8+6rP/Pu6z/z7us/8m2
- p//Ctq3/3dvf/5OQkbnZ2NoA2djaANnY2gDZ2NoAtLGxALSxsQC0sbEAtLGxAJWSksLHw8X64OHl9+Pl
- 6fbk5ur25ujs9ufq7vby7Pb23PDi9S+ONv+s9K7/pvur/3//jv+p+rL/MY06/+T96/r9+//2/Pz9+fz+
- //n8///5+Pr8+e/t8v3b2dzak5CRudfW2ADX1tgA19bYANfW2AC0sbEAtLGxALSxsQC0sbEAk5CRuZOQ
- kbmTkJG5k5CRuZOQkbmTkJG5k5CRuZOQkbmTkJG5II8n9azwr/+g+aX/cv5+/4z6m/8gjSv/k5CRuZOQ
- kbmTkJG5k5CRuZOQkbmTkJG5k5CRuZOQkbmTkJG519bYANfW2ADX1tgA19bYALSxsQC0sbEAtLGxALSx
- sQC0r7EAx8PEAODh5QDj5egA5ObqAObo7ADn6u0A8uz2AFjdYwAkkCr3n+qj/4/ymP9h+nD/Zfp3/yGN
- LP8zp0IA/fv/APz8/QD8/v8A/P//APj6/ADu7fIA2tncANfW2ADX1tgA19bYANfW2ADX1tgAtLGxALSx
- sQC0sbEAtLGxALSvsQDHw8QA4OHlAOPl6ADk5ukA5ujsAOfq7QBN2VsATdlbAB+OJ/aG4I7/e+aC/1Hr
- Xv9Q62D/HYwp/y6mPQAupj0A/Pz9APz+/wD8//8A+Pr8AO7t8gDa2dwA19bYANfW2ADX1tgA19bYANfW
- 2AC0sbEAtLGxALSxsQC0sbEAtK+xAMfDxADg4eUA4+XoAOTm6QDm6OsAQNJOAEDSTgBA0k4AGIgf6mbS
- bP9Z1mP/N9hH/z3aT/8Zjif1KKo7ACiqOwAoqjsA/P7/APz//wD4+vwA7u3yANrZ3ADX1tgA19bYANfW
- 2ADX1tgAlZSUALSxsQC0sbEAtLGxALSxsQC0rrEAx8PEAODg5QDj5egA5ObpADHCPwAxwj8AMcJAADHC
- QAAxw0B1QrpL0i+6O8gYvCjIJ8k90SewOYsosDoAKLA6ACiwOgAosDoA/P//APj6/ADu7fEA2tncANfW
- 2ADX1tgA19bYANfW2ACVlJQA////////////wAP//AAAH/gAAB//wAP///gf//AAAA/wAAAP8AAAD/AA
- AA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AA
- AA/wAAAP8AAAD//4H///+B////gf///4H/8=
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ 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
+
+
+
+ 17, 17
+
+
+
+ AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAABILAAASCwAAAAAAAAAA
+ AABSUlIAUlJSAFJSUgBSUlIAUlJSABgYGAAYGBgAGBgYABkZGQA0NDQAHh4aABgYGAAfHx8AKioqADc1
+ NwBDQUMAQkBCADUzNQAoKCgAHBwcABgYGAAqKioAMTExABkZGQAZGRkAGBgYABgYGABHR0cAR0dHAEZG
+ RgBGRkYARkZGAFJSUgBSUlIAUlJSAFJSUgBSUlIAGBgYABgYGAAYGBgAGRkZADQ0NAAeHhoAGBgYAB4e
+ HgAqKioANzU3AENBQwBCQEIANTM1ACgoKAAcHBwAGBgYACoqKgAwMDAAGRkZABkZGQAYGBgAGBgYAEdH
+ RwBHR0cARkZGAEZGRgBGRkYAUlJSAFJSUgBSUlIAUlJSAAsLCwALCwsADw8PABAQEAAREREAJSUlAAUF
+ BhcPDw9CGRkZZyUlJYIwLTCTODU4mDc0N5kuKy6QIyMjfRYWFl8LCws2BQUFDBsbGwAREREAERERAA8P
+ DwALCwsADAwMAEZGRgBGRkYARkZGAEZGRgBSUlIAUlJSAFJSUgBQUFAACwsLAAsLCwAPDw8REBAQHBER
+ ES4lJSWeX11e/5WRlP/Ix8r/1NTU/9bW1v/Y2Nj/19fX/9fX1//X1tb/x8TH/5GOkP9bV1r9GxsbbxER
+ ESoREREkDw8PGAsLCwUMDAwARkZGAEZGRgBGRkYARkZGADw8PAA8PDwAPDw8ADw8PAAQEBAAEBAQBRQU
+ FCQUFBQ2Dg4OOXVxc9vl5OT/urm4/3RwdP9PT1L/OTc6/zc1OP85Njn/PDg7/1ZTVv9+foH/3dzc/+zr
+ 7f9HREmcDw8PPxQUFDwUFBQrEBAQEBEREQA6OjoAOjo6ADo6OgA7OzsAOzs7ADs7OwA8PDwAPDw8ABAQ
+ EAAQEBAAFBQUABQUFAAODg4AdXFzAGFeX03d3Nutubm45YKChf8vLC//MzE0/zIwM/8xLjH/jImM/8jH
+ ytvp5+ibSEVKM0dESQAPDw8AFBQUABQUFAAQEBAAERERADo6OgA6OjoAOjo6ADs7OwDT09IA09PSANPT
+ 0gDT09IA1tbVAOrp6QD6+vkA+vn5APn5+AD5+PgAYV5fAN3c2wC5uLgAfXp9TAYGBv8FBQX/BQUF/wkJ
+ Cf+IiIs4yMfKAOnn6ABIRUkA7u3tAO3s7ADk4+YA2NfYAMrHyQDBv8AAw8HCAMPBwgDDwcIAw8HCANPT
+ 0gDT09IA09PSANPT0gCTkJG5n5yc1aCentSgnp/VoJ6e1aCen9Wgnp7Vn5yc1Z6cnNOVkpPffnx9/398
+ ff9/fH3/fnp8/5SSktuem5zVnpuc15+cndegnZ3XoJ2d156cnNedmprXmpeY05OQkbnDwcIAw8HCAMPB
+ wgDDwcIAy8rKAMvKygDLysoAy8rKAJiVlsjg4OD/8fLz/9ja3f/y9PX/6uzu/+nq7P/k5un/7u/x//T1
+ 9v/s7e//8PLz/+nr7P/r7O7/5OXp/9zd3//h4uX/4OHl/9na3f/W2Nr/0dPY/83M0P++vL7/k5CRubq5
+ uQC6ubkAurm5ALq5uQDNzc4Azc3OAM3NzgDNzc4Al5WVx97e3f/t49n/6t7S//Hl2f/v5Nj/7+TY/+/j
+ 1//w5dn/8OXZ/+/j2P/w5dn/7uPX/+3i1v/s4dT/7ODU/+vf0//m28//5dnN/+TYzP/h08b/0MbB/7y7
+ vv+TkJG5ubi6ALm4ugC5uLoAubi6ANHS0gDR0tIA0dLSANHS0gCYlZbH1dTU/7hqJf/AYAv/wmcR/8Vs
+ F//JcRr/z3Ug/9B3I//SeiX/1X0o/9Z/Kv/YgSv/2IQs/9qELP/ahCv/2YMq/9iCKv/Xfij/1Xom/9R2
+ Hf+5g1L/uLzD/5OQkbm3ub0At7m9ALe5vQC3ub0A1NTVANTU1QDU1NUA1NTVAJiVlsfW1dX/r14Z/7pY
+ Bf+6WAT/u1oE/79eB//CYgv/xGYO/8ZrEP/HbRL/ym8U/81wFf/NcRb/znEW/81xFf/NcBb/zG4T/8ps
+ Ef/IahD/yGIF/7B2RP+7v8b/k5CRubm7wAC5u8AAubvAALm8wADW1tcA1tbXANbW1wDW1tcAmZWWx9jW
+ 1v+uXxz/uVoL/7pdD/+6Wgn/uVgD/7xbBv++Xwn/wGEL/8JjDf/DZQ//xGcQ/8VoEP/GaBH/xWkQ/8Vn
+ EP/EZQ7/w2IN/8FhC//AWgP/rnNB/77CyP+TkJG5vL7CALy+wgC8vsIAvL7CANnZ2gDZ2doA2dnaANnZ
+ 2gCZlpbH2tbY/69hH/+7XRD/uV4S/7peE/+5Wwv/tFQC/7hVA/+6WQX/u1sF/71cB/++XQf/vl4H/75e
+ B/++Xgj/vV0I/7xcBv+7WgX/uVgE/7hRAf+qbj3/wMTL/5OQkbm+wMUAvsDFAL7AxQC+wMUA29vcANvb
+ 3ADb29wA29vcAJmWlsfa19n/sGIj/71iGP+7Yhn/u2EX/7thFv+5XRD/sU8C/7BLAf+0TgH/uVIC/7pV
+ A/+5VAP/t1UD/7dVA/+3VAP/tlMC/7VRAv+zTgH/skYA/6RqOf/Dx87/k5CRucDDxwDBw8cAwMPHAMDD
+ xwDb2dsA29nbANvZ2wDb2dsAmZaWx9rW2P+xZCX/v2cg/75nIP+9Zh7/vWUc/7xkHP+7Yhf/sk8D/7BK
+ Af9scgf/XnMH/6VYB/+zSAD/r0kB/69JAf+uSQH/sEgA/7BIAP+xRAD/pGc5/8XJ0P+TkJG5wsXJAMLF
+ yQDCxckAwsXJANfW2ADX1tgA19bYANfW2ACZlZbH19PU/7FmKP/CbCj/wGwo/8BrJ/+/aST/vmgi/79m
+ If/DaSH/eoEd/wZrD/8BZgr/U3kW/6VWB/+xRgD/rkgA/69IAP+vSAD/r0gA/7FEAP+kaDj/x8vS/5OQ
+ kbnEx8wAxMfMAMTHzADEx8wA0tLUANLS1ADS0tQA0tLUAJiVlsfTz9H/smcq/8VxMP/DcDD/wm8u/8Ju
+ Lf/Cayn/xHQs/3+UNP8OcBb/AFwD/wBnA/8DehD/UHoW/6RYB/+yRgD/r0gA/69IAP+vSAD/sUQA/6Rm
+ N//JzdP/k5CRucbKzQDGyc0AxsnNAMbKzQDRz9EA0c/RANHP0QDRz9EAmJWWx87Lzf+yaS7/x3g3/8V4
+ Nv/EdzX/xXEz/8d4M/+Aljn/EXIa/wFoBv8AfAP/AJED/wGdB/8EkRb/UHcW/6VWB/+yRgD/r0gA/69I
+ AP+xRAD/o2Y1/8vO1f+TkJG5yMvQAMjL0ADIy9AAyMvQAM3NzgDNzc4Azc3OAMzMzgCXlZXHzMfJ/7Jq
+ Mf/Kfj7/x3w9/8h6O//KfTv/hJo+/x96J/8bgyf/D5cc/wWlFP8DsRD/BrkY/wzAIP8Lmx//T3YV/6VW
+ B/+yRgD/r0gA/7FDAP+jZjX/zdDW/5OQkbnKzdEAys3RAMrN0QDKzdEAycnKAMnJygDJycoAycnKAJeU
+ lcfGxMX/s2wz/8yDRv/Lf0P/zYJD/4yfQ/8sgzP/QphM/zmrQv8wvD3/LMQ6/xnHK/8g0TL/Jdc3/ync
+ Pf8RoiX/T3QU/6VWB/+zRQD/sUMA/6NmNf/O0tj/k5CRuczP0wDMz9MAzM/TAMzP0wDGxscAxsbHAMbG
+ xwDGxscAl5SVx8LAwP+zbTX/z4dP/82KTv+Qo0r/N4k8/2elbv9humn/Wshi/1jTYP9U2l7/M91B/zjn
+ Sv9A7lH/RfFT/0HxU/8Wpin/UHUU/6NYB/+yQQD/omU0/9DT2/+TkJG5ztDWAM7Q1gDO0NUAztDVAMPD
+ xADDw8QAw8PEAMPDxACXlJXIvry7/7RvN//VjVf/lKJS/zWNQP9/sor/gcKK/3vSh/9+34f/euKD/3Pq
+ e/9I7lf/Tvpg/1z9b/9b/3P/Vf9u/0f8Y/8Omiv/Ynob/7RBAP+iZDT/0tXd/5OQkbnQ0tgA0NLYANDS
+ 2ADQ0tgAwMDBAMDAwQDAwMEAwMDBAJeUlMi6tLX/tXE7/9mVYf9ogzz/QHsv/0R7L/9FfS//SIAx/1ef
+ Vv+W75z/ifaT/1r7a/9z/oP/PJg9/0WCMP9GgzD/RIMv/z16Kf9sWxf/tkYA/6FjMv/W19//k5CRudLU
+ 2QDS1NkA0tTZANLU2QC9u70Avbu9AL27vQC9u70Al5OUyLawsf+nYSv/xn9G/8V7Q//FekH/wng//8N2
+ Pf/Ddjn/R4Ey/6T1rf+c+qL/cf9+/5r9qf9EgS//vG4v/8NqMf/CaTD/xG4y/8NwM/+yVgv/llsv/9fZ
+ 4P+TkJG51NbbANTW2wDU1tsA1NbbALm2tgC5trYAuba2ALm2tgCWk5PIwLy//7ahl/+6ppb/vaiZ/7+q
+ m//BrZ7/xK+j/8uxp/8ygDL/q/Sy/6T7qv+B/4//rvu7/zKBNv/OvKz/z7qs/8+6rP/Pu6z/z7us/8m2
+ p//Ctq3/3dvf/5OQkbnZ2NoA2djaANnY2gDZ2NoAtLGxALSxsQC0sbEAtLGxAJWSksLHw8X64OHl9+Pl
+ 6fbk5ur25ujs9ufq7vby7Pb23PDi9S+ONv+s9K7/pvur/3//jv+p+rL/MY06/+T96/r9+//2/Pz9+fz+
+ //n8///5+Pr8+e/t8v3b2dzak5CRudfW2ADX1tgA19bYANfW2AC0sbEAtLGxALSxsQC0sbEAk5CRuZOQ
+ kbmTkJG5k5CRuZOQkbmTkJG5k5CRuZOQkbmTkJG5II8n9azwr/+g+aX/cv5+/4z6m/8gjSv/k5CRuZOQ
+ kbmTkJG5k5CRuZOQkbmTkJG5k5CRuZOQkbmTkJG519bYANfW2ADX1tgA19bYALSxsQC0sbEAtLGxALSx
+ sQC0r7EAx8PEAODh5QDj5egA5ObqAObo7ADn6u0A8uz2AFjdYwAkkCr3n+qj/4/ymP9h+nD/Zfp3/yGN
+ LP8zp0IA/fv/APz8/QD8/v8A/P//APj6/ADu7fIA2tncANfW2ADX1tgA19bYANfW2ADX1tgAtLGxALSx
+ sQC0sbEAtLGxALSvsQDHw8QA4OHlAOPl6ADk5ukA5ujsAOfq7QBN2VsATdlbAB+OJ/aG4I7/e+aC/1Hr
+ Xv9Q62D/HYwp/y6mPQAupj0A/Pz9APz+/wD8//8A+Pr8AO7t8gDa2dwA19bYANfW2ADX1tgA19bYANfW
+ 2AC0sbEAtLGxALSxsQC0sbEAtK+xAMfDxADg4eUA4+XoAOTm6QDm6OsAQNJOAEDSTgBA0k4AGIgf6mbS
+ bP9Z1mP/N9hH/z3aT/8Zjif1KKo7ACiqOwAoqjsA/P7/APz//wD4+vwA7u3yANrZ3ADX1tgA19bYANfW
+ 2ADX1tgAlZSUALSxsQC0sbEAtLGxALSxsQC0rrEAx8PEAODg5QDj5egA5ObpADHCPwAxwj8AMcJAADHC
+ QAAxw0B1QrpL0i+6O8gYvCjIJ8k90SewOYsosDoAKLA6ACiwOgAosDoA/P//APj6/ADu7fEA2tncANfW
+ 2ADX1tgA19bYANfW2ACVlJQA////////////wAP//AAAH/gAAB//wAP///gf//AAAA/wAAAP8AAAD/AA
+ AA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AA
+ AA/wAAAP8AAAD//4H///+B////gf///4H/8=
+
+
\ No newline at end of file
diff --git a/Source/ryUpdate/ryUpdateV4.csproj b/Source/ryUpdate/ryUpdateV4.csproj
index d87abf7..ed6edc7 100644
--- a/Source/ryUpdate/ryUpdateV4.csproj
+++ b/Source/ryUpdate/ryUpdateV4.csproj
@@ -61,6 +61,11 @@
+
+ True
+ True
+ Resources.resx
+
@@ -69,6 +74,10 @@
frmUpdate.cs
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+