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 +