diff --git a/Bin/Debug/CommonControls/.NET4/OnLineUpgradeConfig.exe b/Bin/Debug/CommonControls/.NET4/OnLineUpgradeConfig.exe index 770e48e..1474057 100644 Binary files a/Bin/Debug/CommonControls/.NET4/OnLineUpgradeConfig.exe and b/Bin/Debug/CommonControls/.NET4/OnLineUpgradeConfig.exe differ diff --git a/Bin/Debug/CommonControls/.NET4/RaUI.dll b/Bin/Debug/CommonControls/.NET4/RaUI.dll index a688604..94d66d6 100644 Binary files a/Bin/Debug/CommonControls/.NET4/RaUI.dll and b/Bin/Debug/CommonControls/.NET4/RaUI.dll differ diff --git a/Bin/Debug/CommonControls/.NET4/RaUI.xml b/Bin/Debug/CommonControls/.NET4/RaUI.xml index e9e3ae2..56da64a 100644 --- a/Bin/Debug/CommonControls/.NET4/RaUI.xml +++ b/Bin/Debug/CommonControls/.NET4/RaUI.xml @@ -1251,11 +1251,16 @@ 取消事件 + + + 是否跳过相同文件,默认不跳过(根据文件大小和修改时间来判断) + + 大文件按流复制文件,支持自动创建目标文件夹。 true:复制成功 false:复制失败 - 原始文件路径 + 原始文件路径 复制目标文件路径 携带的参数(可选) @@ -2039,6 +2044,25 @@ 目标文件夹 返回复制操作是否成功的标识,成功返回0,负数表示复制失败的文件数量。1表示源文件夹不存在 + + + 复制或剪切文件列表到剪切板 + + + + + + + 复制文件列表到剪切板 + + + + + + 剪切文件列表到剪切板 + + + 重命名一个文件为新名称,建议您使用更方便的Microsoft.VisualBasic.FileSystem.ReName();替换该方法 @@ -13834,6 +13858,11 @@ + + + 是否将时间类型转为时间戳 + + 输出多条件搜索。 @@ -13848,6 +13877,12 @@ + + + 根据输入的内容,生成Json数据 + + + 获取插入SQL语句 @@ -15902,27 +15937,44 @@ - - Shell - + + 获得桌面 Shell + + + + + 获得桌面 Shell + + + + + 获取路径 + + + + + 获取显示名称 + + + + + 根据 PIDL 获取显示名称 + + + + + 获取特殊文件夹的路径 + 根据路径获取 IShellFolder 和 PIDL - + - + 根据路径获取 IShellFolder - - - - - - - - @@ -16736,6 +16788,14 @@ + + + + + + + + 注册热键 @@ -18082,6 +18142,11 @@ 版本 + + + 版本类型 + + 更新日期 @@ -20148,10 +20213,11 @@ 鼠标移上时,显示提示 - + - 字体 + + @@ -20265,6 +20331,16 @@ 值1 + + + int值1 + + + + + long值1 + + Tag @@ -20897,6 +20973,52 @@ 热键文本框 + + + 清除按钮位置 + + + + + 热键文本位置 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -24633,6 +24755,11 @@ Chrome风格的多标签控件 + + + 获取或设置调整控件的选项卡大小的方式。 + + @@ -30255,12 +30382,12 @@ - Automatically sets the size of the label by content size + 根据内容大小自动设置标签的大小 - Automatically sets the height of the label by content height (width is not effected). + 根据内容高度自动设置标签的高度(宽度不受影响)。 @@ -54175,7 +54302,7 @@ Bounds of the cell The string to be drawn - 笔刷 + @@ -54198,6 +54325,37 @@ + + + Draw the given text and optional image in the "normal" fashion + + Graphics context to use for drawing + Bounds of the cell + + The string to be drawn + 笔刷 + + + + Draw the given text and optional image in the "normal" fashion + + Graphics context to use for drawing + Bounds of the cell + + The string to be drawn + + + + + + + 这里的r + + + + + + @@ -58222,6 +58380,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wrapper over the control like TextBox. @@ -70106,79 +70337,6 @@ A visual indicator is displayed in the number margin. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A class for the Batch lexer. diff --git a/Bin/Debug/CommonControls/.NET4/rycUpdate.exe b/Bin/Debug/CommonControls/.NET4/rycUpdate.exe index 2c43f85..e8d2718 100644 Binary files a/Bin/Debug/CommonControls/.NET4/rycUpdate.exe and b/Bin/Debug/CommonControls/.NET4/rycUpdate.exe differ diff --git a/Bin/Release/CommonControls/.NET4/RaUI.dll b/Bin/Release/CommonControls/.NET4/RaUI.dll index 04abfac..e191e31 100644 Binary files a/Bin/Release/CommonControls/.NET4/RaUI.dll and b/Bin/Release/CommonControls/.NET4/RaUI.dll differ diff --git a/Bin/Release/CommonControls/.NET4/RaUI.xml b/Bin/Release/CommonControls/.NET4/RaUI.xml index 07c9e12..7197df0 100644 --- a/Bin/Release/CommonControls/.NET4/RaUI.xml +++ b/Bin/Release/CommonControls/.NET4/RaUI.xml @@ -1251,11 +1251,16 @@ 取消事件 + + + 是否跳过相同文件,默认不跳过(根据文件大小和修改时间来判断) + + 大文件按流复制文件,支持自动创建目标文件夹。 true:复制成功 false:复制失败 - 原始文件路径 + 原始文件路径 复制目标文件路径 携带的参数(可选) @@ -2039,6 +2044,25 @@ 目标文件夹 返回复制操作是否成功的标识,成功返回0,负数表示复制失败的文件数量。1表示源文件夹不存在 + + + 复制或剪切文件列表到剪切板 + + + + + + + 复制文件列表到剪切板 + + + + + + 剪切文件列表到剪切板 + + + 重命名一个文件为新名称,建议您使用更方便的Microsoft.VisualBasic.FileSystem.ReName();替换该方法 @@ -13834,6 +13858,11 @@ + + + 是否将时间类型转为时间戳 + + 输出多条件搜索。 @@ -13848,6 +13877,12 @@ + + + 根据输入的内容,生成Json数据 + + + 获取插入SQL语句 @@ -15902,27 +15937,44 @@ - - Shell - + + 获得桌面 Shell + + + + + 获得桌面 Shell + + + + + 获取路径 + + + + + 获取显示名称 + + + + + 根据 PIDL 获取显示名称 + + + + + 获取特殊文件夹的路径 + 根据路径获取 IShellFolder 和 PIDL - + - + 根据路径获取 IShellFolder - - - - - - - - @@ -16736,6 +16788,14 @@ + + + + + + + + 注册热键 @@ -18082,6 +18142,11 @@ 版本 + + + 版本类型 + + 更新日期 @@ -20148,10 +20213,11 @@ 鼠标移上时,显示提示 - + - 字体 + + @@ -20265,6 +20331,16 @@ 值1 + + + int值1 + + + + + long值1 + + Tag @@ -20897,6 +20973,52 @@ 热键文本框 + + + 清除按钮位置 + + + + + 热键文本位置 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -24633,6 +24755,11 @@ Chrome风格的多标签控件 + + + 获取或设置调整控件的选项卡大小的方式。 + + @@ -30255,12 +30382,12 @@ - Automatically sets the size of the label by content size + 根据内容大小自动设置标签的大小 - Automatically sets the height of the label by content height (width is not effected). + 根据内容高度自动设置标签的高度(宽度不受影响)。 @@ -54175,7 +54302,7 @@ Bounds of the cell The string to be drawn - 笔刷 + @@ -54198,6 +54325,37 @@ + + + Draw the given text and optional image in the "normal" fashion + + Graphics context to use for drawing + Bounds of the cell + + The string to be drawn + 笔刷 + + + + Draw the given text and optional image in the "normal" fashion + + Graphics context to use for drawing + Bounds of the cell + + The string to be drawn + + + + + + + 这里的r + + + + + + @@ -58222,6 +58380,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wrapper over the control like TextBox. @@ -70094,79 +70325,6 @@ A visual indicator is displayed in the number margin. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A class for the Batch lexer. diff --git a/CHANGELOG.md b/CHANGELOG.md index f7d5e4e..6b9e236 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,23 @@ -## :date:2025-06-27 星期五更新 +## :date:2025-08-16 星期六更新 + +### rycUpdate V1.0.2506.0401 +- :lady_beetle:[修复]修复文件替换失败,不会失败提示的BUG。 + +### RaUI V4.0.2508.1601 +- :cactus:[新增]ChromeTabControl控件支持设置SizeMode属性。 +- :cactus:[新增]HotkeyTextBox新增支持传入热键文本进行自动转换。 +- :cactus:[新增]ryQuickSQL类新增GetJsonData方法。 +- :cactus:[新增]ryQuickSQL类新增DateToTimeStamp属性,导出时自动将时间类型转为时间戳。 +- :cactus:[新增]自动更新模块新增支持版本类型,区分正式版和测试版。 +- :100:[改进]HotkeyTextBox控件渲染方式改成全画布渲染。 +- :100:[改进]TextBoxEx2开启多行模式后,空文本改成在第一行显示。 +- :lady_beetle:[修复]修复截图功能某些情况下会报错的BUG。 +- :lady_beetle:[修复]修复HotkeyValue类处理多功能键文本时转换错误的BUG。 +- :lady_beetle:[修复]修复RyComboBox控件在某些情况下边框会丢失的BUG。 +- :lady_beetle:[修复]修复Hosts类针对删除hosts规则处理出错的BUG。 +- :lady_beetle:[修复]修复当升级文件Url无法访问时,升级模块会无限期等待的BUG。 + +## :date:2025-06-27 星期五更新 ### RaUI V4.0.2506.2701 - :cactus:[新增]RediskCheck类新增支持对.NET3.5和.NET6-.NET9安装状态的判断。 diff --git a/Source/Itrycn_Project2/Config/Init.cs b/Source/Itrycn_Project2/Config/Init.cs index 9971c34..7ea0e95 100644 --- a/Source/Itrycn_Project2/Config/Init.cs +++ b/Source/Itrycn_Project2/Config/Init.cs @@ -21,6 +21,7 @@ namespace Itrycn_Project2.Config } else { + Public_Config.LoadSetting(); Application.Run(new FrmStart(args)); //Application.Run(new FrmTest2()); //Application.Run(new WindowsFormsApp2.Form1()); diff --git a/Source/Itrycn_Project2/Config/Public_Config.cs b/Source/Itrycn_Project2/Config/Public_Config.cs index 18c128f..7a78f11 100644 --- a/Source/Itrycn_Project2/Config/Public_Config.cs +++ b/Source/Itrycn_Project2/Config/Public_Config.cs @@ -17,7 +17,7 @@ namespace Itrycn_Project2 public static void LoadSetting() { ryCommon.Storage Stor = new ryCommon.Storage(); - Stor.LoadFromFile(Soft_ConstInfo.UserDataFolder+"\\Setting.dat"); + Stor.LoadFromFile(Soft_ConstInfo.UserDataFolder+"\\Setting.xml"); Stor.SelectNodeBySet(); HideByCloseBtn = Stor.GetAttrValue("HideByCloseBtn", false); //low_count = Stor.GetAttrValue("LowCount", 10); diff --git a/Source/Itrycn_Project2/FrmStart.Designer.cs b/Source/Itrycn_Project2/FrmStart.Designer.cs index 19a654c..1a4b5e0 100644 --- a/Source/Itrycn_Project2/FrmStart.Designer.cs +++ b/Source/Itrycn_Project2/FrmStart.Designer.cs @@ -44,19 +44,18 @@ this.捐助ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.chromeTabControl1 = new ryControls.ChromeTabControl(); this.tabPage1 = new System.Windows.Forms.TabPage(); + this.textBoxEx21 = new ryControls.TextBoxEx2(); + this.buttonEx1 = new ryControls.ButtonEx(); + this.hotkeyTextBox1 = new ryControls.HotkeyTextBox(); this.rySearch1 = new ryControls.rySearch(); this.doubleText1 = new ryControls.DoubleText(); this.ryComboBox1 = new ryControls.ComboBoxEx2(); - this.textBoxEx21 = new ryControls.TextBoxEx2(); this.textBoxEx1 = new ryControls.TextBoxEx(); - this.button3 = new System.Windows.Forms.Button(); this.richTextBox21 = new ryControls.Controls.RichTextBox2(); - this.button2 = new System.Windows.Forms.Button(); this.htmlPanel1 = new TheArtOfDev.HtmlRenderer.WinForms.HtmlPanel(); this.pictureBox2 = new System.Windows.Forms.PictureBox(); this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.TabLogs = new System.Windows.Forms.TabPage(); - this.button1 = new System.Windows.Forms.Button(); this.LvLogs = new BrightIdeasSoftware.ObjectListView(); this.OlvLogTime = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); this.OlvLogText = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); @@ -159,6 +158,7 @@ this.chromeTabControl1.Controls.Add(this.tabPage1); this.chromeTabControl1.Controls.Add(this.TabLogs); this.chromeTabControl1.Cursor = System.Windows.Forms.Cursors.Default; + this.chromeTabControl1.DrawTabBorder = true; this.chromeTabControl1.ItemSize = new System.Drawing.Size(100, 25); this.chromeTabControl1.Location = new System.Drawing.Point(1, 55); this.chromeTabControl1.Name = "chromeTabControl1"; @@ -166,7 +166,6 @@ this.chromeTabControl1.ShowAddButton = false; this.chromeTabControl1.ShowCloseButton = false; this.chromeTabControl1.Size = new System.Drawing.Size(1005, 664); - this.chromeTabControl1.SizeMode = System.Windows.Forms.TabSizeMode.Fixed; this.chromeTabControl1.TabContextMenuStrip = null; this.chromeTabControl1.TabIndex = 0; this.chromeTabControl1.TabMaxWidth = 100; @@ -174,14 +173,14 @@ // tabPage1 // this.tabPage1.AutoScroll = true; + this.tabPage1.Controls.Add(this.textBoxEx21); + this.tabPage1.Controls.Add(this.buttonEx1); + this.tabPage1.Controls.Add(this.hotkeyTextBox1); this.tabPage1.Controls.Add(this.rySearch1); this.tabPage1.Controls.Add(this.doubleText1); this.tabPage1.Controls.Add(this.ryComboBox1); - this.tabPage1.Controls.Add(this.textBoxEx21); this.tabPage1.Controls.Add(this.textBoxEx1); - this.tabPage1.Controls.Add(this.button3); this.tabPage1.Controls.Add(this.richTextBox21); - this.tabPage1.Controls.Add(this.button2); this.tabPage1.Controls.Add(this.htmlPanel1); this.tabPage1.Controls.Add(this.pictureBox2); this.tabPage1.Controls.Add(this.pictureBox1); @@ -193,6 +192,52 @@ this.tabPage1.Text = "首页"; this.tabPage1.UseVisualStyleBackColor = true; // + // textBoxEx21 + // + this.textBoxEx21.BackColor = System.Drawing.Color.White; + this.textBoxEx21.EmptyText = "fggzgftgg "; + this.textBoxEx21.Location = new System.Drawing.Point(161, 30); + this.textBoxEx21.LongTime = 2000; + this.textBoxEx21.MaxLength = 999999999; + this.textBoxEx21.MaxUndoRedoSteps = 50; + this.textBoxEx21.Multiline = true; + this.textBoxEx21.Name = "textBoxEx21"; + this.textBoxEx21.OnlyNumeric = false; + this.textBoxEx21.PasswordChar = '\0'; + this.textBoxEx21.ReadOnly = false; + this.textBoxEx21.SelectedText = ""; + this.textBoxEx21.SelectionLength = 0; + this.textBoxEx21.SelectionStart = 0; + this.textBoxEx21.Size = new System.Drawing.Size(339, 179); + this.textBoxEx21.TabIndex = 31; + this.textBoxEx21.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; + this.textBoxEx21.ToolTip = ""; + this.textBoxEx21.WordWrap = true; + // + // buttonEx1 + // + this.buttonEx1.BackColor = System.Drawing.Color.Gray; + this.buttonEx1.BaseColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(76)))), ((int)(((byte)(95))))); + this.buttonEx1.ImageTextSpace = 0; + this.buttonEx1.ImageWidth = 12; + this.buttonEx1.Location = new System.Drawing.Point(180, 153); + this.buttonEx1.Name = "buttonEx1"; + this.buttonEx1.Size = new System.Drawing.Size(61, 27); + this.buttonEx1.TabIndex = 30; + this.buttonEx1.Text = "测试"; + this.buttonEx1.UseVisualStyleBackColor = false; + // + // hotkeyTextBox1 + // + this.hotkeyTextBox1.BackColor = System.Drawing.Color.White; + this.hotkeyTextBox1.HotKey = "0+0"; + this.hotkeyTextBox1.Location = new System.Drawing.Point(161, 215); + this.hotkeyTextBox1.Name = "hotkeyTextBox1"; + this.hotkeyTextBox1.Size = new System.Drawing.Size(220, 27); + this.hotkeyTextBox1.T_Key = System.Windows.Forms.Keys.None; + this.hotkeyTextBox1.T_Modifiers = 0; + this.hotkeyTextBox1.TabIndex = 29; + // // rySearch1 // this.rySearch1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(236)))), ((int)(((byte)(239)))), ((int)(((byte)(244))))); @@ -209,7 +254,7 @@ this.doubleText1.Location = new System.Drawing.Point(141, 265); this.doubleText1.Name = "doubleText1"; this.doubleText1.SelectName = ""; - this.doubleText1.Size = new System.Drawing.Size(240, 39); + this.doubleText1.Size = new System.Drawing.Size(240, 27); this.doubleText1.TabIndex = 26; // // ryComboBox1 @@ -225,33 +270,11 @@ this.ryComboBox1.MaxPopupHeight = 0; this.ryComboBox1.MaxPopupWidth = 0; this.ryComboBox1.Name = "ryComboBox1"; + this.ryComboBox1.SelectedIndex = -1; + this.ryComboBox1.SelectedItem = null; this.ryComboBox1.Size = new System.Drawing.Size(238, 36); this.ryComboBox1.TabIndex = 25; - // - // textBoxEx21 - // - this.textBoxEx21.BackColor = System.Drawing.Color.White; - this.textBoxEx21.EmptyText = "ddd对对对"; - this.textBoxEx21.Location = new System.Drawing.Point(149, 170); - this.textBoxEx21.LongTime = 2000; - this.textBoxEx21.MaxLength = 999999999; - this.textBoxEx21.MaxUndoRedoSteps = 50; - this.textBoxEx21.Multiline = false; - this.textBoxEx21.Name = "textBoxEx21"; - this.textBoxEx21.OnlyNumeric = false; - this.textBoxEx21.PasswordChar = '\0'; - this.textBoxEx21.ReadOnly = false; - this.textBoxEx21.SelectedText = ""; - this.textBoxEx21.SelectionLength = 0; - this.textBoxEx21.SelectionStart = 0; - this.textBoxEx21.Size = new System.Drawing.Size(233, 33); - this.textBoxEx21.TabIndex = 24; - this.textBoxEx21.Text = "textBoxEx21"; - this.textBoxEx21.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; - this.textBoxEx21.ToolTip = ""; - this.textBoxEx21.WordWrap = true; - this.textBoxEx21.LongTimeNoChanged += new System.EventHandler(this.textBoxEx21_LongTimeNoChanged); - this.textBoxEx21.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBoxEx21_KeyDown); + this.ryComboBox1.ToolTipText = ""; // // textBoxEx1 // @@ -264,19 +287,8 @@ this.textBoxEx1.Size = new System.Drawing.Size(202, 21); this.textBoxEx1.TabIndex = 23; // - // button3 - // - this.button3.Location = new System.Drawing.Point(254, 105); - this.button3.Name = "button3"; - this.button3.Size = new System.Drawing.Size(143, 37); - this.button3.TabIndex = 22; - this.button3.Text = "button3"; - this.button3.UseVisualStyleBackColor = true; - this.button3.Click += new System.EventHandler(this.button3_Click); - // // richTextBox21 // - this.richTextBox21.DetectUrls = false; this.richTextBox21.EmptyText = ""; this.richTextBox21.Font = new System.Drawing.Font("Courier New", 10F); this.richTextBox21.Location = new System.Drawing.Point(417, 26); @@ -288,18 +300,6 @@ "赢得道具和奖励,培养她的感情,解锁不同的结局。这款游戏将带给你与怪兽公主共度时光的乐趣与刺激。"; this.richTextBox21.WordWrap = true; // - // button2 - // - this.button2.Location = new System.Drawing.Point(854, 46); - this.button2.MaximumSize = new System.Drawing.Size(143, 37); - this.button2.MinimumSize = new System.Drawing.Size(143, 37); - this.button2.Name = "button2"; - this.button2.Size = new System.Drawing.Size(143, 37); - this.button2.TabIndex = 20; - this.button2.Text = "button2"; - this.button2.UseVisualStyleBackColor = true; - this.button2.Click += new System.EventHandler(this.button2_Click); - // // htmlPanel1 // this.htmlPanel1.AutoScroll = true; @@ -331,7 +331,6 @@ // // TabLogs // - this.TabLogs.Controls.Add(this.button1); this.TabLogs.Controls.Add(this.LvLogs); this.TabLogs.Location = new System.Drawing.Point(1, 29); this.TabLogs.Name = "TabLogs"; @@ -341,16 +340,6 @@ this.TabLogs.Text = "日志"; this.TabLogs.UseVisualStyleBackColor = true; // - // button1 - // - this.button1.Location = new System.Drawing.Point(275, 64); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(125, 29); - this.button1.TabIndex = 15; - this.button1.Text = "button1"; - this.button1.UseVisualStyleBackColor = true; - this.button1.Click += new System.EventHandler(this.Button1_Click); - // // LvLogs // this.LvLogs.AllColumns.Add(this.OlvLogTime); @@ -431,17 +420,16 @@ private BrightIdeasSoftware.ObjectListView LvLogs; private BrightIdeasSoftware.OLVColumn OlvLogTime; private BrightIdeasSoftware.OLVColumn OlvLogText; - private System.Windows.Forms.Button button1; private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.PictureBox pictureBox2; private TheArtOfDev.HtmlRenderer.WinForms.HtmlPanel htmlPanel1; private ryControls.Controls.RichTextBox2 richTextBox21; - private System.Windows.Forms.Button button3; private ryControls.TextBoxEx textBoxEx1; - private ryControls.TextBoxEx2 textBoxEx21; private ryControls.ComboBoxEx2 ryComboBox1; - private System.Windows.Forms.Button button2; private ryControls.DoubleText doubleText1; private ryControls.rySearch rySearch1; + private ryControls.HotkeyTextBox hotkeyTextBox1; + private ryControls.ButtonEx buttonEx1; + private ryControls.TextBoxEx2 textBoxEx21; } } \ No newline at end of file diff --git a/Source/Itrycn_Project2/FrmStart.cs b/Source/Itrycn_Project2/FrmStart.cs index 0903594..8481d2e 100644 --- a/Source/Itrycn_Project2/FrmStart.cs +++ b/Source/Itrycn_Project2/FrmStart.cs @@ -16,7 +16,6 @@ using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; -using static System.Net.Mime.MediaTypeNames; using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace Itrycn_Project2 @@ -161,6 +160,7 @@ namespace Itrycn_Project2 } LvLogs.InsertObjects(0, new LogInfo[] { new LogInfo() { LogTime = DateTime.Now, LogText = log,LogTag=tag, Color = color } }); OlvLogTime.Text = "时间(" + LvLogs.GetItemCount() + ")"; + TabLogs.Text = "日志(" + LvLogs.GetItemCount() + ")"; ; })); } catch { } @@ -265,11 +265,13 @@ namespace Itrycn_Project2 private void FrmStart_Load(object sender, EventArgs e) { - ryComboBox1.SelectedIndex=0; + //SaveBase64ImageAsFile("data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/4QMraHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjM4MjUzRUI0MTYxQzExRUVCMEZBRjAxODQ2NjA5Q0YxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjM4MjUzRUI1MTYxQzExRUVCMEZBRjAxODQ2NjA5Q0YxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MzgyNTNFQjIxNjFDMTFFRUIwRkFGMDE4NDY2MDlDRjEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzgyNTNFQjMxNjFDMTFFRUIwRkFGMDE4NDY2MDlDRjEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAGBAQEBQQGBQUGCQYFBgkLCAYG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", Application.StartupPath + "\\1111.jpg"); + //hotkeyTextBox1.LoadHotKey("Ctrl+Shift+A"); + //ryComboBox1.SelectedIndex=0; //var process = Process.GetProcessesByName("bds"); //System.Net.ServicePointManager.DefaultConnectionLimit = 50; - QuickWeb web = new QuickWeb(); - var http = web.UrlEncode("猫咪——安安"); + //QuickWeb web = new QuickWeb(); + //var http = web.UrlEncode("猫咪——安安"); //web.Referer = "http://k73dx12.tengapk.com/android/dreamhouse.mod.apk"; //var kk = web.GetSize("http://42.248.92.71:2080/k73dx12.tengapk.com/android/dreamhouse.mod.apk?wsiphost=ipdbme&wsrid_tag=66b17fe7_PS-HYN-01IIQ27_63791-5797-s1t1722908647649&ip_type=0"); //IDbInterface db = new MySqlDataProvider(); @@ -278,13 +280,13 @@ namespace Itrycn_Project2 //var size= web.GetSize("https://oss-admin.blazingcats.com/Product/Package/100_llfz_101_llfzgw_1656930048.apk"); //size = web.GetSize("https://oss-admin.blazingcats.com/Product/Package/100_llfz_101_llfzgw_1656930048.apk"); //textBox2.Text = web.Get("https://apkpure.com/cn/animation-throwdown-epic-ccg/com.kongregate.mobile.throwdown.google/download").Html; - ryCommon.ApkOp apkOp = new ApkOp(); - apkOp.AAPT_Path = "E:\\My Datas\\My Codes\\毕方项目\\CSharp\\ryProcessManager\\Bin\\Debug\\SysDb\\Tools\\ApkLook\\aapt.exe"; - var kk = apkOp.Read_Apk("C:\\Users\\zilin\\Desktop\\Measure X.apk"); + //ryCommon.ApkOp apkOp = new ApkOp(); + //apkOp.AAPT_Path = "E:\\My Datas\\My Codes\\毕方项目\\CSharp\\ryProcessManager\\Bin\\Debug\\SysDb\\Tools\\ApkLook\\aapt.exe"; + //var kk = apkOp.Read_Apk("C:\\Users\\zilin\\Desktop\\com.lhdn.apk"); // objectListView1.InsertObjects(0, new LogInfo[] { new LogInfo() }); //var en= ryCommon.TxtFileEncoder.GetEncoding(@"E:\My Datas\毕方项目\CSharp\ryProcessManager\Bin\Debug\SysDb\applist.lst"); - //var hosts = ryCommon.RyFiles.ReadAllText(@"E:\My Datas\毕方项目\CSharp\ryProcessManager\Bin\Debug\UserDb\Hosts.txt"); - //var result = ryCommon.Hosts.AddHosts(hosts); + var hosts = ryCommon.RyFiles.ReadAllText(@"E:\My Datas\My Codes\毕方项目\CSharp\ryProcessManager\Bin\Debug\UserDb\Hosts.txt"); + var result = ryCommon.Hosts.AddHosts(hosts); //var kk= ryCommon.ProcessExt.GetPath(24348); //var img = RyImage.LoadPic(@"C:\Users\zilin\Desktop\1.jpg"); //var watermark =new Bitmap(RyImage.LoadPic(@"C:\Users\zilin\Desktop\water.png")); @@ -356,78 +358,5 @@ namespace Itrycn_Project2 /// public Color Color { get; set; } = Color.Black; } - - private void Button1_Click(object sender, EventArgs e) - { - LvLogs.ClearObjects(); - AddLog("测试测试"); - } - - private void textBox1_TextChanged(object sender, EventArgs e) - { - //var text = ""; - //try - //{ - // HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); - // htmlDoc.LoadHtml(textBox2.Text); - // HtmlNodeCollection anchors = htmlDoc.DocumentNode.SelectNodes(textBox1.Text); - // if (anchors != null) - // { - // for (int i = 0; i < anchors.Count; i++) - // { - // if (text != "") { text += "

"; } - // if (i % 2 == 0) - // { - // text += "" + System.Web.HttpUtility.HtmlEncode(anchors[i].OuterHtml) + ""; - // } - // else - // { - // text += "" + System.Web.HttpUtility.HtmlEncode(anchors[i].OuterHtml) + ""; - // } - // } - // } - //} - //catch (Exception ex){ - // text = "" + System.Web.HttpUtility.HtmlEncode(ex.Message) + ""; - //} - //htmlPanel1.Text = System.Web.HttpUtility.HtmlEncode(textBox1.Text); - } - ILayeredForm subForm = null; - private void button2_Click(object sender, EventArgs e) - { - subForm = new FormTest(); - subForm.Layered(button2); - subForm.Disposed += (a, b) => - { - subForm = null; - }; - subForm.Show(); - } - - private void button3_Click(object sender, EventArgs e) - { - Form form=(Form)Activator.CreateInstance(typeof(FrmTest2)); ; - ShowInCenter(form, this); - ryCommon.RyForm.BringToTop(form.Handle); - ryCommon.RyForm.SetActiveWindow(form.Handle); - try - { - if (!form.IsDisposed) form.Show(); - } - catch { } - } - - private void textBoxEx21_KeyDown(object sender, KeyEventArgs e) - { - if (e.KeyCode == Keys.Enter) - { - MessageBox.Show("111"); - } - } - - private void textBoxEx21_LongTimeNoChanged(object sender, EventArgs e) - { - MessageBox.Show("222"); - } } } diff --git a/Source/Itrycn_Project2/FrmStart.resx b/Source/Itrycn_Project2/FrmStart.resx index 4beb845..98fac57 100644 --- a/Source/Itrycn_Project2/FrmStart.resx +++ b/Source/Itrycn_Project2/FrmStart.resx @@ -126,62 +126,8 @@ 246, 17 - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - - True - - 54 + 25 diff --git a/Source/OnLineUpgradeConfig/frmUpdateFile.Designer.cs b/Source/OnLineUpgradeConfig/frmUpdateFile.Designer.cs index 4966916..7c8ffdc 100644 --- a/Source/OnLineUpgradeConfig/frmUpdateFile.Designer.cs +++ b/Source/OnLineUpgradeConfig/frmUpdateFile.Designer.cs @@ -35,7 +35,7 @@ namespace LiveUpdate this.BtnOK = new System.Windows.Forms.Button(); this.tabControl1 = new System.Windows.Forms.TabControl(); this.tabPage1 = new System.Windows.Forms.TabPage(); - this.cmbNewVer = new ryControls.TextBoxEx2(); + this.label10 = new System.Windows.Forms.Label(); this.checkBox2 = new System.Windows.Forms.CheckBox(); this.checkBox1 = new System.Windows.Forms.CheckBox(); this.linkLabel8 = new System.Windows.Forms.LinkLabel(); @@ -49,37 +49,27 @@ namespace LiveUpdate this.linkLabel1 = new System.Windows.Forms.LinkLabel(); this.label12 = new System.Windows.Forms.Label(); this.BtnOneKeyUpdate = new System.Windows.Forms.Button(); - this.txtDbUpdateDes = new ryControls.TextBoxEx2(); - this.txtUpdateDes = new ryControls.TextBoxEx2(); this.label8 = new System.Windows.Forms.Label(); this.label7 = new System.Windows.Forms.Label(); - this.cmbDbUpdateUrl = new ryControls.RyComboBox(); this.label6 = new System.Windows.Forms.Label(); - this.cmbProcUpdateUrl = new ryControls.RyComboBox(); this.label5 = new System.Windows.Forms.Label(); this.dtNewDataDate = new System.Windows.Forms.DateTimePicker(); this.label4 = new System.Windows.Forms.Label(); this.dtNewProcDate = new System.Windows.Forms.DateTimePicker(); this.label3 = new System.Windows.Forms.Label(); - this.cmbNewDbVer = new ryControls.RyComboBox(); this.label2 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label(); this.tabPage2 = new System.Windows.Forms.TabPage(); - this.txtDelFileList = new ryControls.Controls.RichTextBox2(); - this.txtKillProcList = new ryControls.Controls.RichTextBox2(); this.btnSelectUser = new System.Windows.Forms.Button(); this.label16 = new System.Windows.Forms.Label(); this.label15 = new System.Windows.Forms.Label(); this.label14 = new System.Windows.Forms.Label(); this.label11 = new System.Windows.Forms.Label(); this.label9 = new System.Windows.Forms.Label(); - this.txtMainProcPram = new ryControls.TextBoxEx2(); - this.txtMainProcName = new ryControls.TextBoxEx2(); - this.txtUserList = new ryControls.RyComboBox(); this.tabPage3 = new System.Windows.Forms.TabPage(); + this.BtnDefUpdateLog = new System.Windows.Forms.Button(); this.BtnPasteFromMD = new System.Windows.Forms.Button(); this.ChkUseHtml = new System.Windows.Forms.CheckBox(); - this.TxtUpdateDes_Html = new ryControls.Controls.RichTextBox2(); this.tabPage4 = new System.Windows.Forms.TabPage(); this.LblState = new System.Windows.Forms.Label(); this.BtnCopyToNormal = new System.Windows.Forms.Button(); @@ -89,6 +79,19 @@ namespace LiveUpdate this.BtnUsersView = new System.Windows.Forms.Button(); this.LvUpdateFiles = new BrightIdeasSoftware.ObjectListView(); this.OlvFileName = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); + this.CbbVersionType = new ryControls.RyComboBox(); + this.cmbNewVer = new ryControls.TextBoxEx2(); + this.txtDbUpdateDes = new ryControls.TextBoxEx2(); + this.txtUpdateDes = new ryControls.TextBoxEx2(); + this.cmbDbUpdateUrl = new ryControls.RyComboBox(); + this.cmbProcUpdateUrl = new ryControls.RyComboBox(); + this.cmbNewDbVer = new ryControls.RyComboBox(); + this.txtDelFileList = new ryControls.Controls.RichTextBox2(); + this.txtKillProcList = new ryControls.Controls.RichTextBox2(); + this.txtMainProcPram = new ryControls.TextBoxEx2(); + this.txtMainProcName = new ryControls.TextBoxEx2(); + this.txtUserList = new ryControls.RyComboBox(); + this.TxtUpdateDes_Html = new ryControls.Controls.RichTextBox2(); this.tabControl1.SuspendLayout(); this.tabPage1.SuspendLayout(); this.tabPage2.SuspendLayout(); @@ -137,6 +140,8 @@ namespace LiveUpdate // tabPage1 // this.tabPage1.BackColor = System.Drawing.Color.White; + this.tabPage1.Controls.Add(this.CbbVersionType); + this.tabPage1.Controls.Add(this.label10); this.tabPage1.Controls.Add(this.cmbNewVer); this.tabPage1.Controls.Add(this.checkBox2); this.tabPage1.Controls.Add(this.checkBox1); @@ -173,29 +178,14 @@ namespace LiveUpdate this.tabPage1.TabIndex = 0; this.tabPage1.Text = "基本设置"; // - // cmbNewVer + // label10 // - this.cmbNewVer.BackColor = System.Drawing.Color.White; - this.cmbNewVer.EmptyText = ""; - this.cmbNewVer.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.cmbNewVer.Location = new System.Drawing.Point(9, 23); - this.cmbNewVer.LongTime = 2000; - this.cmbNewVer.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); - this.cmbNewVer.MaxLength = 999999999; - this.cmbNewVer.MaxUndoRedoSteps = 50; - this.cmbNewVer.Multiline = false; - this.cmbNewVer.Name = "cmbNewVer"; - this.cmbNewVer.OnlyNumeric = false; - this.cmbNewVer.PasswordChar = '\0'; - this.cmbNewVer.ReadOnly = false; - this.cmbNewVer.SelectedText = ""; - this.cmbNewVer.SelectionLength = 0; - this.cmbNewVer.SelectionStart = 0; - this.cmbNewVer.Size = new System.Drawing.Size(223, 31); - this.cmbNewVer.TabIndex = 47; - this.cmbNewVer.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; - this.cmbNewVer.ToolTip = ""; - this.cmbNewVer.WordWrap = true; + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(317, 8); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(53, 12); + this.label10.TabIndex = 48; + this.label10.Text = "版本类型"; // // checkBox2 // @@ -353,56 +343,6 @@ namespace LiveUpdate this.BtnOneKeyUpdate.UseVisualStyleBackColor = true; this.BtnOneKeyUpdate.Click += new System.EventHandler(this.BtnOneKeyUpdate_Click); // - // txtDbUpdateDes - // - this.txtDbUpdateDes.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtDbUpdateDes.BackColor = System.Drawing.Color.White; - this.txtDbUpdateDes.EmptyText = ""; - this.txtDbUpdateDes.Enabled = false; - this.txtDbUpdateDes.Location = new System.Drawing.Point(10, 380); - this.txtDbUpdateDes.LongTime = 2000; - this.txtDbUpdateDes.MaxLength = 999999999; - this.txtDbUpdateDes.MaxUndoRedoSteps = 50; - this.txtDbUpdateDes.Multiline = true; - this.txtDbUpdateDes.Name = "txtDbUpdateDes"; - this.txtDbUpdateDes.OnlyNumeric = false; - this.txtDbUpdateDes.PasswordChar = '\0'; - this.txtDbUpdateDes.ReadOnly = false; - this.txtDbUpdateDes.SelectedText = ""; - this.txtDbUpdateDes.SelectionLength = 0; - this.txtDbUpdateDes.SelectionStart = 0; - this.txtDbUpdateDes.Size = new System.Drawing.Size(657, 133); - this.txtDbUpdateDes.TabIndex = 31; - this.txtDbUpdateDes.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; - this.txtDbUpdateDes.ToolTip = ""; - this.txtDbUpdateDes.WordWrap = true; - // - // txtUpdateDes - // - this.txtUpdateDes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtUpdateDes.BackColor = System.Drawing.Color.White; - this.txtUpdateDes.EmptyText = ""; - this.txtUpdateDes.Location = new System.Drawing.Point(10, 195); - this.txtUpdateDes.LongTime = 2000; - this.txtUpdateDes.MaxLength = 999999999; - this.txtUpdateDes.MaxUndoRedoSteps = 50; - this.txtUpdateDes.Multiline = true; - this.txtUpdateDes.Name = "txtUpdateDes"; - this.txtUpdateDes.OnlyNumeric = false; - this.txtUpdateDes.PasswordChar = '\0'; - this.txtUpdateDes.ReadOnly = false; - this.txtUpdateDes.SelectedText = ""; - this.txtUpdateDes.SelectionLength = 0; - this.txtUpdateDes.SelectionStart = 0; - this.txtUpdateDes.Size = new System.Drawing.Size(657, 164); - this.txtUpdateDes.TabIndex = 30; - this.txtUpdateDes.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; - this.txtUpdateDes.ToolTip = ""; - this.txtUpdateDes.WordWrap = true; - // // label8 // this.label8.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); @@ -422,20 +362,6 @@ namespace LiveUpdate this.label7.TabIndex = 28; this.label7.Text = "软件更新描述:"; // - // cmbDbUpdateUrl - // - this.cmbDbUpdateUrl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.cmbDbUpdateUrl.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; - this.cmbDbUpdateUrl.Enabled = false; - this.cmbDbUpdateUrl.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.cmbDbUpdateUrl.FormattingEnabled = true; - this.cmbDbUpdateUrl.Location = new System.Drawing.Point(9, 155); - this.cmbDbUpdateUrl.MaxUndoRedoSteps = 50; - this.cmbDbUpdateUrl.Name = "cmbDbUpdateUrl"; - this.cmbDbUpdateUrl.Size = new System.Drawing.Size(658, 22); - this.cmbDbUpdateUrl.TabIndex = 27; - // // label6 // this.label6.AutoSize = true; @@ -445,19 +371,6 @@ namespace LiveUpdate this.label6.TabIndex = 26; this.label6.Text = "数据库更新地址:"; // - // cmbProcUpdateUrl - // - this.cmbProcUpdateUrl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.cmbProcUpdateUrl.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; - this.cmbProcUpdateUrl.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.cmbProcUpdateUrl.FormattingEnabled = true; - this.cmbProcUpdateUrl.Location = new System.Drawing.Point(9, 117); - this.cmbProcUpdateUrl.MaxUndoRedoSteps = 50; - this.cmbProcUpdateUrl.Name = "cmbProcUpdateUrl"; - this.cmbProcUpdateUrl.Size = new System.Drawing.Size(658, 22); - this.cmbProcUpdateUrl.TabIndex = 25; - // // label5 // this.label5.AutoSize = true; @@ -473,7 +386,7 @@ namespace LiveUpdate this.dtNewDataDate.Enabled = false; this.dtNewDataDate.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.dtNewDataDate.Format = System.Windows.Forms.DateTimePickerFormat.Custom; - this.dtNewDataDate.Location = new System.Drawing.Point(326, 72); + this.dtNewDataDate.Location = new System.Drawing.Point(447, 71); this.dtNewDataDate.Name = "dtNewDataDate"; this.dtNewDataDate.Size = new System.Drawing.Size(201, 26); this.dtNewDataDate.TabIndex = 23; @@ -481,7 +394,7 @@ namespace LiveUpdate // label4 // this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(324, 57); + this.label4.Location = new System.Drawing.Point(445, 56); this.label4.Name = "label4"; this.label4.Size = new System.Drawing.Size(95, 12); this.label4.TabIndex = 22; @@ -509,23 +422,10 @@ namespace LiveUpdate this.label3.TabIndex = 20; this.label3.Text = "最新软件日期:"; // - // cmbNewDbVer - // - this.cmbNewDbVer.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; - this.cmbNewDbVer.Enabled = false; - this.cmbNewDbVer.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.cmbNewDbVer.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.cmbNewDbVer.FormattingEnabled = true; - this.cmbNewDbVer.Location = new System.Drawing.Point(326, 25); - this.cmbNewDbVer.MaxUndoRedoSteps = 50; - this.cmbNewDbVer.Name = "cmbNewDbVer"; - this.cmbNewDbVer.Size = new System.Drawing.Size(122, 27); - this.cmbNewDbVer.TabIndex = 19; - // // label2 // this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(324, 8); + this.label2.Location = new System.Drawing.Point(445, 7); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(95, 12); this.label2.TabIndex = 18; @@ -563,35 +463,6 @@ namespace LiveUpdate this.tabPage2.TabIndex = 1; this.tabPage2.Text = "升级前后"; // - // txtDelFileList - // - this.txtDelFileList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtDelFileList.EmptyText = ""; - this.txtDelFileList.Font = new System.Drawing.Font("Courier New", 10F); - this.txtDelFileList.Location = new System.Drawing.Point(10, 198); - this.txtDelFileList.Name = "txtDelFileList"; - this.txtDelFileList.OnlyInputText = false; - this.txtDelFileList.Size = new System.Drawing.Size(660, 233); - this.txtDelFileList.TabIndex = 37; - this.txtDelFileList.Text = ""; - this.txtDelFileList.WordWrap = true; - // - // txtKillProcList - // - this.txtKillProcList.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtKillProcList.EmptyText = ""; - this.txtKillProcList.Font = new System.Drawing.Font("Courier New", 10F); - this.txtKillProcList.Location = new System.Drawing.Point(10, 22); - this.txtKillProcList.Name = "txtKillProcList"; - this.txtKillProcList.OnlyInputText = false; - this.txtKillProcList.Size = new System.Drawing.Size(660, 158); - this.txtKillProcList.TabIndex = 36; - this.txtKillProcList.Text = ""; - this.txtKillProcList.WordWrap = true; - // // btnSelectUser // this.btnSelectUser.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); @@ -651,73 +522,13 @@ namespace LiveUpdate this.label9.AutoSize = true; this.label9.Location = new System.Drawing.Point(8, 7); this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(149, 12); + this.label9.Size = new System.Drawing.Size(467, 12); this.label9.TabIndex = 0; - this.label9.Text = "升级前需要结束的进程列表"; - // - // txtMainProcPram - // - this.txtMainProcPram.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.txtMainProcPram.BackColor = System.Drawing.Color.White; - this.txtMainProcPram.EmptyText = ""; - this.txtMainProcPram.Location = new System.Drawing.Point(577, 450); - this.txtMainProcPram.LongTime = 2000; - this.txtMainProcPram.MaxLength = 999999999; - this.txtMainProcPram.MaxUndoRedoSteps = 50; - this.txtMainProcPram.Multiline = false; - this.txtMainProcPram.Name = "txtMainProcPram"; - this.txtMainProcPram.OnlyNumeric = false; - this.txtMainProcPram.PasswordChar = '\0'; - this.txtMainProcPram.ReadOnly = false; - this.txtMainProcPram.SelectedText = ""; - this.txtMainProcPram.SelectionLength = 0; - this.txtMainProcPram.SelectionStart = 0; - this.txtMainProcPram.Size = new System.Drawing.Size(92, 21); - this.txtMainProcPram.TabIndex = 9; - this.txtMainProcPram.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; - this.txtMainProcPram.ToolTip = ""; - this.txtMainProcPram.WordWrap = true; - // - // txtMainProcName - // - this.txtMainProcName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtMainProcName.BackColor = System.Drawing.Color.White; - this.txtMainProcName.EmptyText = ""; - this.txtMainProcName.Location = new System.Drawing.Point(10, 450); - this.txtMainProcName.LongTime = 2000; - this.txtMainProcName.MaxLength = 999999999; - this.txtMainProcName.MaxUndoRedoSteps = 50; - this.txtMainProcName.Multiline = false; - this.txtMainProcName.Name = "txtMainProcName"; - this.txtMainProcName.OnlyNumeric = false; - this.txtMainProcName.PasswordChar = '\0'; - this.txtMainProcName.ReadOnly = false; - this.txtMainProcName.SelectedText = ""; - this.txtMainProcName.SelectionLength = 0; - this.txtMainProcName.SelectionStart = 0; - this.txtMainProcName.Size = new System.Drawing.Size(561, 21); - this.txtMainProcName.TabIndex = 3; - this.txtMainProcName.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; - this.txtMainProcName.ToolTip = ""; - this.txtMainProcName.WordWrap = true; - // - // txtUserList - // - this.txtUserList.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.txtUserList.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; - this.txtUserList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.txtUserList.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.txtUserList.FormattingEnabled = true; - this.txtUserList.Location = new System.Drawing.Point(9, 489); - this.txtUserList.MaxUndoRedoSteps = 50; - this.txtUserList.Name = "txtUserList"; - this.txtUserList.Size = new System.Drawing.Size(599, 24); - this.txtUserList.TabIndex = 10; + this.label9.Text = "升级前需要结束的进程列表(默认情况下,填不填写都会结束升级程序所在目录下的进程)"; // // tabPage3 // + this.tabPage3.Controls.Add(this.BtnDefUpdateLog); this.tabPage3.Controls.Add(this.BtnPasteFromMD); this.tabPage3.Controls.Add(this.ChkUseHtml); this.tabPage3.Controls.Add(this.TxtUpdateDes_Html); @@ -729,6 +540,17 @@ namespace LiveUpdate this.tabPage3.Text = "更新日志源码"; this.tabPage3.UseVisualStyleBackColor = true; // + // BtnDefUpdateLog + // + this.BtnDefUpdateLog.Location = new System.Drawing.Point(217, 3); + this.BtnDefUpdateLog.Name = "BtnDefUpdateLog"; + this.BtnDefUpdateLog.Size = new System.Drawing.Size(76, 30); + this.BtnDefUpdateLog.TabIndex = 36; + this.BtnDefUpdateLog.Text = "默认日志"; + this.toolTip1.SetToolTip(this.BtnDefUpdateLog, "只更新版本号和日期"); + this.BtnDefUpdateLog.UseVisualStyleBackColor = true; + this.BtnDefUpdateLog.Click += new System.EventHandler(this.BtnDefUpdateLog_Click); + // // BtnPasteFromMD // this.BtnPasteFromMD.Location = new System.Drawing.Point(135, 3); @@ -750,21 +572,6 @@ namespace LiveUpdate this.ChkUseHtml.Text = "采用Html更新日志"; this.ChkUseHtml.UseVisualStyleBackColor = true; // - // TxtUpdateDes_Html - // - this.TxtUpdateDes_Html.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TxtUpdateDes_Html.EmptyText = ""; - this.TxtUpdateDes_Html.Font = new System.Drawing.Font("Courier New", 10F); - this.TxtUpdateDes_Html.Location = new System.Drawing.Point(9, 35); - this.TxtUpdateDes_Html.Name = "TxtUpdateDes_Html"; - this.TxtUpdateDes_Html.OnlyInputText = false; - this.TxtUpdateDes_Html.Size = new System.Drawing.Size(660, 481); - this.TxtUpdateDes_Html.TabIndex = 33; - this.TxtUpdateDes_Html.Text = ""; - this.TxtUpdateDes_Html.WordWrap = true; - // // tabPage4 // this.tabPage4.Controls.Add(this.LblState); @@ -862,6 +669,243 @@ namespace LiveUpdate this.OlvFileName.Text = "文件名"; this.OlvFileName.Width = 150; // + // CbbVersionType + // + this.CbbVersionType.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; + this.CbbVersionType.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.CbbVersionType.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.CbbVersionType.FormattingEnabled = true; + this.CbbVersionType.Items.AddRange(new object[] { + "正式版", + "测试版", + "内测版", + "公测版"}); + this.CbbVersionType.Location = new System.Drawing.Point(319, 24); + this.CbbVersionType.MaxUndoRedoSteps = 50; + this.CbbVersionType.Name = "CbbVersionType"; + this.CbbVersionType.Size = new System.Drawing.Size(122, 27); + this.CbbVersionType.TabIndex = 49; + // + // cmbNewVer + // + this.cmbNewVer.BackColor = System.Drawing.Color.White; + this.cmbNewVer.EmptyText = ""; + this.cmbNewVer.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.cmbNewVer.Location = new System.Drawing.Point(9, 23); + this.cmbNewVer.LongTime = 2000; + this.cmbNewVer.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.cmbNewVer.MaxLength = 999999999; + this.cmbNewVer.MaxUndoRedoSteps = 50; + this.cmbNewVer.Multiline = false; + this.cmbNewVer.Name = "cmbNewVer"; + this.cmbNewVer.OnlyNumeric = false; + this.cmbNewVer.PasswordChar = '\0'; + this.cmbNewVer.ReadOnly = false; + this.cmbNewVer.SelectedText = ""; + this.cmbNewVer.SelectionLength = 0; + this.cmbNewVer.SelectionStart = 0; + this.cmbNewVer.Size = new System.Drawing.Size(223, 31); + this.cmbNewVer.TabIndex = 47; + this.cmbNewVer.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; + this.cmbNewVer.ToolTip = ""; + this.cmbNewVer.WordWrap = true; + // + // txtDbUpdateDes + // + this.txtDbUpdateDes.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtDbUpdateDes.BackColor = System.Drawing.Color.White; + this.txtDbUpdateDes.EmptyText = ""; + this.txtDbUpdateDes.Enabled = false; + this.txtDbUpdateDes.Location = new System.Drawing.Point(10, 380); + this.txtDbUpdateDes.LongTime = 2000; + this.txtDbUpdateDes.MaxLength = 999999999; + this.txtDbUpdateDes.MaxUndoRedoSteps = 50; + this.txtDbUpdateDes.Multiline = true; + this.txtDbUpdateDes.Name = "txtDbUpdateDes"; + this.txtDbUpdateDes.OnlyNumeric = false; + this.txtDbUpdateDes.PasswordChar = '\0'; + this.txtDbUpdateDes.ReadOnly = false; + this.txtDbUpdateDes.SelectedText = ""; + this.txtDbUpdateDes.SelectionLength = 0; + this.txtDbUpdateDes.SelectionStart = 0; + this.txtDbUpdateDes.Size = new System.Drawing.Size(657, 133); + this.txtDbUpdateDes.TabIndex = 31; + this.txtDbUpdateDes.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; + this.txtDbUpdateDes.ToolTip = ""; + this.txtDbUpdateDes.WordWrap = true; + // + // txtUpdateDes + // + this.txtUpdateDes.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtUpdateDes.BackColor = System.Drawing.Color.White; + this.txtUpdateDes.EmptyText = ""; + this.txtUpdateDes.Location = new System.Drawing.Point(10, 195); + this.txtUpdateDes.LongTime = 2000; + this.txtUpdateDes.MaxLength = 999999999; + this.txtUpdateDes.MaxUndoRedoSteps = 50; + this.txtUpdateDes.Multiline = true; + this.txtUpdateDes.Name = "txtUpdateDes"; + this.txtUpdateDes.OnlyNumeric = false; + this.txtUpdateDes.PasswordChar = '\0'; + this.txtUpdateDes.ReadOnly = false; + this.txtUpdateDes.SelectedText = ""; + this.txtUpdateDes.SelectionLength = 0; + this.txtUpdateDes.SelectionStart = 0; + this.txtUpdateDes.Size = new System.Drawing.Size(657, 164); + this.txtUpdateDes.TabIndex = 30; + this.txtUpdateDes.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; + this.txtUpdateDes.ToolTip = ""; + this.txtUpdateDes.WordWrap = true; + // + // cmbDbUpdateUrl + // + this.cmbDbUpdateUrl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cmbDbUpdateUrl.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; + this.cmbDbUpdateUrl.Enabled = false; + this.cmbDbUpdateUrl.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.cmbDbUpdateUrl.FormattingEnabled = true; + this.cmbDbUpdateUrl.Location = new System.Drawing.Point(9, 155); + this.cmbDbUpdateUrl.MaxUndoRedoSteps = 50; + this.cmbDbUpdateUrl.Name = "cmbDbUpdateUrl"; + this.cmbDbUpdateUrl.Size = new System.Drawing.Size(658, 22); + this.cmbDbUpdateUrl.TabIndex = 27; + // + // cmbProcUpdateUrl + // + this.cmbProcUpdateUrl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cmbProcUpdateUrl.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; + this.cmbProcUpdateUrl.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.cmbProcUpdateUrl.FormattingEnabled = true; + this.cmbProcUpdateUrl.Location = new System.Drawing.Point(9, 117); + this.cmbProcUpdateUrl.MaxUndoRedoSteps = 50; + this.cmbProcUpdateUrl.Name = "cmbProcUpdateUrl"; + this.cmbProcUpdateUrl.Size = new System.Drawing.Size(658, 22); + this.cmbProcUpdateUrl.TabIndex = 25; + // + // cmbNewDbVer + // + this.cmbNewDbVer.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; + this.cmbNewDbVer.Enabled = false; + this.cmbNewDbVer.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.cmbNewDbVer.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.cmbNewDbVer.FormattingEnabled = true; + this.cmbNewDbVer.Location = new System.Drawing.Point(447, 24); + this.cmbNewDbVer.MaxUndoRedoSteps = 50; + this.cmbNewDbVer.Name = "cmbNewDbVer"; + this.cmbNewDbVer.Size = new System.Drawing.Size(122, 27); + this.cmbNewDbVer.TabIndex = 19; + // + // txtDelFileList + // + this.txtDelFileList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtDelFileList.EmptyText = ""; + this.txtDelFileList.Font = new System.Drawing.Font("Courier New", 10F); + this.txtDelFileList.Location = new System.Drawing.Point(10, 198); + this.txtDelFileList.Name = "txtDelFileList"; + this.txtDelFileList.OnlyInputText = false; + this.txtDelFileList.Size = new System.Drawing.Size(660, 233); + this.txtDelFileList.TabIndex = 37; + this.txtDelFileList.Text = ""; + this.txtDelFileList.WordWrap = true; + // + // txtKillProcList + // + this.txtKillProcList.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtKillProcList.EmptyText = ""; + this.txtKillProcList.Font = new System.Drawing.Font("Courier New", 10F); + this.txtKillProcList.Location = new System.Drawing.Point(10, 25); + this.txtKillProcList.Name = "txtKillProcList"; + this.txtKillProcList.OnlyInputText = false; + this.txtKillProcList.Size = new System.Drawing.Size(660, 155); + this.txtKillProcList.TabIndex = 36; + this.txtKillProcList.Text = ""; + this.txtKillProcList.WordWrap = true; + // + // txtMainProcPram + // + this.txtMainProcPram.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.txtMainProcPram.BackColor = System.Drawing.Color.White; + this.txtMainProcPram.EmptyText = ""; + this.txtMainProcPram.Location = new System.Drawing.Point(577, 450); + this.txtMainProcPram.LongTime = 2000; + this.txtMainProcPram.MaxLength = 999999999; + this.txtMainProcPram.MaxUndoRedoSteps = 50; + this.txtMainProcPram.Multiline = false; + this.txtMainProcPram.Name = "txtMainProcPram"; + this.txtMainProcPram.OnlyNumeric = false; + this.txtMainProcPram.PasswordChar = '\0'; + this.txtMainProcPram.ReadOnly = false; + this.txtMainProcPram.SelectedText = ""; + this.txtMainProcPram.SelectionLength = 0; + this.txtMainProcPram.SelectionStart = 0; + this.txtMainProcPram.Size = new System.Drawing.Size(92, 21); + this.txtMainProcPram.TabIndex = 9; + this.txtMainProcPram.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; + this.txtMainProcPram.ToolTip = ""; + this.txtMainProcPram.WordWrap = true; + // + // txtMainProcName + // + this.txtMainProcName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtMainProcName.BackColor = System.Drawing.Color.White; + this.txtMainProcName.EmptyText = ""; + this.txtMainProcName.Location = new System.Drawing.Point(10, 450); + this.txtMainProcName.LongTime = 2000; + this.txtMainProcName.MaxLength = 999999999; + this.txtMainProcName.MaxUndoRedoSteps = 50; + this.txtMainProcName.Multiline = false; + this.txtMainProcName.Name = "txtMainProcName"; + this.txtMainProcName.OnlyNumeric = false; + this.txtMainProcName.PasswordChar = '\0'; + this.txtMainProcName.ReadOnly = false; + this.txtMainProcName.SelectedText = ""; + this.txtMainProcName.SelectionLength = 0; + this.txtMainProcName.SelectionStart = 0; + this.txtMainProcName.Size = new System.Drawing.Size(561, 21); + this.txtMainProcName.TabIndex = 3; + this.txtMainProcName.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; + this.txtMainProcName.ToolTip = ""; + this.txtMainProcName.WordWrap = true; + // + // txtUserList + // + this.txtUserList.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtUserList.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; + this.txtUserList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.txtUserList.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.txtUserList.Font = new System.Drawing.Font("Courier New", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtUserList.FormattingEnabled = true; + this.txtUserList.Location = new System.Drawing.Point(9, 489); + this.txtUserList.MaxUndoRedoSteps = 50; + this.txtUserList.Name = "txtUserList"; + this.txtUserList.Size = new System.Drawing.Size(599, 24); + this.txtUserList.TabIndex = 10; + // + // TxtUpdateDes_Html + // + this.TxtUpdateDes_Html.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.TxtUpdateDes_Html.EmptyText = ""; + this.TxtUpdateDes_Html.Font = new System.Drawing.Font("Courier New", 10F); + this.TxtUpdateDes_Html.Location = new System.Drawing.Point(9, 35); + this.TxtUpdateDes_Html.Name = "TxtUpdateDes_Html"; + this.TxtUpdateDes_Html.OnlyInputText = false; + this.TxtUpdateDes_Html.Size = new System.Drawing.Size(660, 481); + this.TxtUpdateDes_Html.TabIndex = 33; + this.TxtUpdateDes_Html.Text = ""; + this.TxtUpdateDes_Html.WordWrap = true; + // // frmUpdateFile // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); @@ -953,5 +997,8 @@ namespace LiveUpdate private ryControls.Controls.RichTextBox2 txtDelFileList; private ryControls.TextBoxEx2 cmbNewVer; private System.Windows.Forms.Button BtnPasteFromMD; + private ryControls.RyComboBox CbbVersionType; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Button BtnDefUpdateLog; } } \ No newline at end of file diff --git a/Source/OnLineUpgradeConfig/frmUpdateFile.cs b/Source/OnLineUpgradeConfig/frmUpdateFile.cs index 1a62b2d..4520489 100644 --- a/Source/OnLineUpgradeConfig/frmUpdateFile.cs +++ b/Source/OnLineUpgradeConfig/frmUpdateFile.cs @@ -18,6 +18,7 @@ using WinAPI; using RyWeb; using System.IO.Compression; using static System.Windows.Forms.VisualStyles.VisualStyleElement; +using System.Diagnostics; namespace LiveUpdate { @@ -96,6 +97,7 @@ namespace LiveUpdate var updatelogs_folder = UpdateFilesDir + "\\WebUpdateLogs"; Json json= new Json(RyFiles.ReadAllText(filePath)); cmbNewVer.Text = json.GetJsonValue("SoftVer", ""); + CbbVersionType.Text = json.GetJsonValue("VersionType", ""); cmbNewDbVer.Text = json.GetJsonValue("DbVer", ""); cmbProcUpdateUrl.Text = json.GetJsonValue("FileUpdateUrl", ""); dtNewProcDate.Value = ConvertDateTime(json.GetJsonValue("SoftDate", ""), DateTime.Now); @@ -184,6 +186,7 @@ namespace LiveUpdate JObject json = new JObject { ["SoftVer"] = cmbNewVer.Text, + ["VersionType"] = CbbVersionType.Text, ["DbVer"] = cmbNewDbVer.Text, ["FileUpdateUrl"] = ProcUpdateUrl, ["DbUpdateUrl"] = cmbDbUpdateUrl.Text, @@ -236,7 +239,7 @@ namespace LiveUpdate { case DialogResult.Yes: QuickWeb web = new QuickWeb(); - web.Post("http://gs2.3h3.com:1881/process", "a=send&touser=" +web.UrlEncode(user.UserList.Replace(",",";")) + "&type="+ ryMessageConst.MsType.MustUpdate + + web.Post("http://gs2.dangyou.com:1881/process", "a=send&touser=" +web.UrlEncode(user.UserList.Replace(",",";")) + "&type="+ ryMessageConst.MsType.MustUpdate + "&msg=" + web.UrlEncode("http://192.168.1.191/OnlineUpgrade/" + System.IO.Path.GetFileName(update_fullpath))); break; } @@ -594,5 +597,10 @@ namespace LiveUpdate TxtUpdateDes_Html.SelectedText= txt.Trim(); } } + + private void BtnDefUpdateLog_Click(object sender, EventArgs e) + { + TxtUpdateDes_Html.Text ="

[改进]一些功能改进。

\r\n

[修复]修复了一些BUG。

"; + } } } diff --git a/Source/RaUI/Common/Extend/VarExtension.cs b/Source/RaUI/Common/Extend/VarExtension.cs index e84de55..f84e2f3 100644 --- a/Source/RaUI/Common/Extend/VarExtension.cs +++ b/Source/RaUI/Common/Extend/VarExtension.cs @@ -161,6 +161,7 @@ namespace ryCommon /// static public int IndexOfEx(this string input, string value) { + if (input == null) { return -1; } return input.IndexOf(value, StringComparison.OrdinalIgnoreCase); } /// diff --git a/Source/RaUI/Common/FileFuns/BigFileOp.cs b/Source/RaUI/Common/FileFuns/BigFileOp.cs index d567799..18e4573 100644 --- a/Source/RaUI/Common/FileFuns/BigFileOp.cs +++ b/Source/RaUI/Common/FileFuns/BigFileOp.cs @@ -57,18 +57,22 @@ namespace ryCommon /// public event CancelEventHandler OnCanel; /// + /// 是否跳过相同文件,默认不跳过(根据文件大小和修改时间来判断) + /// + public bool SkipSameFiles { get; set; } = false; + /// /// 大文件按流复制文件,支持自动创建目标文件夹。 true:复制成功 false:复制失败 /// - /// 原始文件路径 + /// 原始文件路径 /// 复制目标文件路径 /// 携带的参数(可选) /// - public bool CopyBigFile(string soucrePath, string targetPath,object Tag=null) + public bool CopyBigFile(string sourcePath, string targetPath,object Tag=null) { if (OnCanelCopy != null) { CancelEventArgs e1 = new CancelEventArgs(); - OnCanelCopy?.Invoke(this, e1, soucrePath, targetPath); + OnCanelCopy?.Invoke(this, e1, sourcePath, targetPath); if (e1.Cancel) { return true; @@ -76,20 +80,33 @@ namespace ryCommon } try { - if (!System.IO.File.Exists(soucrePath)) + if (!System.IO.File.Exists(sourcePath)) { return false; } - if (System.IO.File.Exists(targetPath)) + if (SkipSameFiles) { - if (RyFiles.DeleteFile(targetPath) != 0) + if (System.IO.File.Exists(targetPath)) { - return false; + try + { + var target_info = new System.IO.FileInfo(targetPath); + var source_info = new System.IO.FileInfo(sourcePath); + if (target_info.Length == source_info.Length && target_info.LastWriteTimeUtc == source_info.LastWriteTimeUtc) + { + return true; + } + } + catch { } + if (RyFiles.DeleteFile(targetPath) != 0) + { + return false; + } } } var TranSize = 1024 * 1024 * 2;//每次读取2M //读取复制文件流 - using (FileStream fsRead = new FileStream(soucrePath, FileMode.Open, FileAccess.Read)) + using (FileStream fsRead = new FileStream(sourcePath, FileMode.Open, FileAccess.Read)) { RyFiles.CreateDirectory(System.IO.Path.GetDirectoryName(targetPath)); OnFileProgress?.Invoke(0, fsRead.Length, 0,0, Tag); @@ -151,7 +168,7 @@ namespace ryCommon return false; } } - var from_dt = RyFiles.GetFileDate(soucrePath); + var from_dt = RyFiles.GetFileDate(sourcePath); var file_dt = new sType.FileTime { LastWriteTime = from_dt.LastWriteTime, diff --git a/Source/RaUI/Common/FileFuns/Hosts.cs b/Source/RaUI/Common/FileFuns/Hosts.cs index 7c63c5c..582a7be 100644 --- a/Source/RaUI/Common/FileFuns/Hosts.cs +++ b/Source/RaUI/Common/FileFuns/Hosts.cs @@ -77,40 +77,54 @@ namespace ryCommon bool isAdd = false;//是否有增加数据到hosts里 for (int i = 0; i < rule_list.Count; i++) { - if (rule_list[i].Comment.Length > 0) { continue; } + var rule_item = rule_list[i]; + if (rule_item.Comment.Length > 0) { continue; } bool HaveRecord = false; for (int m = sys_list.Count - 1; m >= 0; m--) //去host文件里查找是否已含有该内容 { if (sys_list[m].Comment.Length > 0) { continue; } - if (rule_list[i].Domain.ToLower() == sys_list[m].Domain.ToLower()) + if (rule_item.Domain.ToLower() == sys_list[m].Domain.ToLower()) { - if (rule_list[i].IP.Length == 0 && rule_list[i].IsDel) + if (rule_item.IsDel) { - sys_list.RemoveAt(m); - HaveRecord = true; + if (rule_item.IP.Length == 0) //如果ip为空,则删除所有包含该域名的项 + { + sys_list.RemoveAt(m); + HaveRecord = true; + } + else if (rule_item.IP == sys_list[m].IP) + { + sys_list.RemoveAt(m); + HaveRecord = true; + } } else { if (rule_list[i].IP != sys_list[m].IP) //如果同样域名对应的ip不一样,则删除该项,然后再插入新的ip { sys_list.RemoveAt(m); - HaveRecord = false; } - else + else if (rule_list[i].IP == sys_list[m].IP) { - if (rule_list[i].IsDel) //如果ip和网址一致,并且标注为删除,则删除 - { - sys_list.RemoveAt(m); - } HaveRecord = true; } } } } - if (!HaveRecord) + if (rule_list[i].IsDel) { - isAdd = true; - sys_list.Add(rule_list[i]); + if (HaveRecord) + { + isAdd = true; + } + } + else + { + if (!HaveRecord) + { + isAdd = true; + sys_list.Add(rule_list[i]); + } } } if (isAdd) @@ -122,6 +136,7 @@ namespace ryCommon sys_content = ""; for (int i = 0; i < sys_list.Count; i++) { + if (sys_list[i].IsDel) { continue; } if (sys_content.Length > 0) { sys_content += "\r\n"; } if (sys_list[i].Comment.Length > 0) { diff --git a/Source/RaUI/Common/FileFuns/RyFiles.cs b/Source/RaUI/Common/FileFuns/RyFiles.cs index b446731..c89d763 100644 --- a/Source/RaUI/Common/FileFuns/RyFiles.cs +++ b/Source/RaUI/Common/FileFuns/RyFiles.cs @@ -380,6 +380,36 @@ namespace ryCommon { return file_op.CopyFolder(fromDir, ToDir); } + /// + /// 复制或剪切文件列表到剪切板 + /// + /// + /// + public static void CopyOrCutFileToClipboard(string[] files,bool cut) + { + DataObject data = new DataObject(DataFormats.FileDrop, files); + MemoryStream memo = new MemoryStream(4); + memo = new MemoryStream(4); byte[] bytes = new byte[] { (byte)(cut ? 2 : 5), 0, 0, 0 }; + memo.Write(bytes, 0, bytes.Length); + data.SetData("Preferred DropEffect", memo); + Clipboard.SetDataObject(data); + } + /// + /// 复制文件列表到剪切板 + /// + /// + public static void CopyFileToClipboard(string[] files) + { + CopyOrCutFileToClipboard(files, false); + } + /// + /// 剪切文件列表到剪切板 + /// + /// + public static void CutFileToClipboard(string[] files) + { + CopyOrCutFileToClipboard(files, true); + } #endregion 【复制文件操作】 #region 【重命名文件】 diff --git a/Source/RaUI/Common/FileFuns/RyImage.cs b/Source/RaUI/Common/FileFuns/RyImage.cs index 3640f43..fa15507 100644 --- a/Source/RaUI/Common/FileFuns/RyImage.cs +++ b/Source/RaUI/Common/FileFuns/RyImage.cs @@ -1053,13 +1053,13 @@ namespace ryCommon { //等宽,计算高 size.Width = i.Width; - size.Height = (i.Width / scale).ToInt(); + size.Height = Math.Truncate(i.Width / scale).ToInt(); } else { //等高,计算宽 size.Height = i.Height; - size.Width = (i.Height * scale).ToInt(); + size.Width = Math.Truncate(i.Height * scale).ToInt(); } //如果原图片和新图片的比例不同,先裁剪或填充后,再缩放 using (System.Drawing.Image cropOrFill = i.CropOrFill(size.Width, size.Height, background, interpolationMode)) diff --git a/Source/RaUI/Common/FileFuns/RySetting.cs b/Source/RaUI/Common/FileFuns/RySetting.cs index 8192fe7..c39cf69 100644 --- a/Source/RaUI/Common/FileFuns/RySetting.cs +++ b/Source/RaUI/Common/FileFuns/RySetting.cs @@ -1,4 +1,5 @@ using ryCommon.Pram; +using ryControls; using System; using System.Collections.Generic; using System.Linq; diff --git a/Source/RaUI/Common/MyDb/ryQuickSQL.cs b/Source/RaUI/Common/MyDb/ryQuickSQL.cs index 8ada590..877fb3b 100644 --- a/Source/RaUI/Common/MyDb/ryQuickSQL.cs +++ b/Source/RaUI/Common/MyDb/ryQuickSQL.cs @@ -1,4 +1,6 @@ -using System; +using Newtonsoft.Json.Linq; +using ryCommon; +using System; using System.Collections.Generic; using System.Xml.Linq; using static ryCommon.RyRegedit; @@ -254,7 +256,10 @@ namespace ryCommonDb /// ///
public List List_calcparam { get; set; } = new List(); - + /// + /// 是否将时间类型转为时间戳 + /// + public bool DateToTimeStamp { get; set; } = true; /// /// 输出多条件搜索。 /// @@ -333,6 +338,17 @@ namespace ryCommonDb { tmpSQL += true_false?"true":"false"; } + else if (item.value is DateTime dt) + { + if (DateToTimeStamp) + { + tmpSQL += dt.ToInt64(); + } + else + { + tmpSQL += RyWeb.WebDecode.UrlEncode(dt.ToString("yyyy-MM-dd HH:mm:ss"), System.Text.Encoding.UTF8); + } + } else { tmpSQL +=RyWeb.WebDecode.UrlEncode(item.value.ToString(), System.Text.Encoding.UTF8); @@ -341,6 +357,55 @@ namespace ryCommonDb return tmpSQL; } /// + /// 根据输入的内容,生成Json数据 + /// + /// + public JObject GetJsonData() + { + JObject jo = new JObject(); + for (int i = 0; i < List.Count; i++) + { + SQLIitem item = List[i]; + var name = item.Field.TrimStart('[').TrimEnd(']'); + if (item.value is long int1) + { + jo[name] = int1; + } + else if (item.value is int @int) + { + jo[name] = @int; + } + else if (item.value is decimal dec) + { + jo[name] = dec; + } + else if (item.value is double dou) + { + jo[name] = dou; + } + else if (item.value is bool true_false) + { + jo[name] = true_false; + } + else if (item.value is DateTime dt) + { + if (DateToTimeStamp) + { + jo[name] = dt.ToInt64(); + } + else + { + jo[name] = dt; + } + } + else + { + jo[name]= item.value.ToString(); + } + } + return jo; + } + /// /// 获取插入SQL语句 /// /// diff --git a/Source/RaUI/Common/Shell/API.cs b/Source/RaUI/Common/Shell/API.cs index 108b5aa..8020474 100644 --- a/Source/RaUI/Common/Shell/API.cs +++ b/Source/RaUI/Common/Shell/API.cs @@ -1,14 +1,22 @@ +//򿪷lc_mtt +//CSDNͣhttp://lemony.cnblogs.com +//ҳhttp://www.3lsoft.com +//ע˴ֹҵ;޸߷һݣлл +//---------------- Դ磬Ҹ ---------------- + using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; -namespace WinShell { +namespace WinShell +{ /// /// /// - public class API { - #region API ɤJ + public class API + { + #region API /// /// /// @@ -104,17 +112,80 @@ namespace WinShell { IntPtr hwnd, IntPtr lptpm); - #endregion + [DllImport("Shell32.Dll")] + private static extern bool SHGetSpecialFolderPath( + IntPtr hwndOwner, + StringBuilder lpszPath, + ShellSpecialFolders nFolder, + bool fCreate); + #endregion /// - ///Shell + /// Shell /// - public static IShellFolder GetDesktopFolder(/*out IntPtr ppshf*/) { - IntPtr ppshf; + public static IShellFolder GetDesktopFolder() + { + return GetDesktopFolder(out _); + } + /// + /// Shell + /// + public static IShellFolder GetDesktopFolder(out IntPtr ppshf) + { SHGetDesktopFolder(out ppshf); Object obj = Marshal.GetObjectForIUnknown(ppshf); return (IShellFolder)obj; } + + /// + /// ȡ· + /// + public static string GetPathByIShell(IShellFolder Root, IntPtr pidlSub) + { + IntPtr strr = Marshal.AllocCoTaskMem(MAX_PATH * 2 + 4); + Marshal.WriteInt32(strr, 0, 0); + StringBuilder buf = new StringBuilder(MAX_PATH); + Root.GetDisplayNameOf(pidlSub, SHGNO.FORADDRESSBAR | SHGNO.FORPARSING, strr); + API.StrRetToBuf(strr, pidlSub, buf, MAX_PATH); + Marshal.FreeCoTaskMem(strr); + return buf.ToString(); + } + + /// + /// ȡʾ + /// + public static string GetNameByIShell(IShellFolder Root, IntPtr pidlSub) + { + IntPtr strr = Marshal.AllocCoTaskMem(MAX_PATH * 2 + 4); + Marshal.WriteInt32(strr, 0, 0); + StringBuilder buf = new StringBuilder(MAX_PATH); + Root.GetDisplayNameOf(pidlSub, SHGNO.INFOLDER, strr); + API.StrRetToBuf(strr, pidlSub, buf, MAX_PATH); + Marshal.FreeCoTaskMem(strr); + return buf.ToString(); + } + + /// + /// PIDL ȡʾ + /// + public static string GetNameByPIDL(IntPtr pidl) + { + SHFILEINFO info = new SHFILEINFO(); + API.SHGetFileInfo(pidl, 0, ref info, Marshal.SizeOf(typeof(SHFILEINFO)), + SHGFI.PIDL | SHGFI.DISPLAYNAME | SHGFI.TYPENAME); + return info.szDisplayName; + } + + /// + /// ȡļе· + /// + public static string GetSpecialFolderPath(IntPtr hwnd, ShellSpecialFolders nFolder) + { + StringBuilder sb = new StringBuilder(MAX_PATH); + SHGetSpecialFolderPath(hwnd, sb, nFolder, false); + return sb.ToString(); + } + /// /// ·ȡ IShellFolder PIDL /// @@ -126,30 +197,14 @@ namespace WinShell { desktop.BindToObject(Pidl, IntPtr.Zero, ref Guids.IID_IShellFolder, out IFolder); return IFolder; } - /// - /// - /// - /// - /// - /// - public static string GetNameByIShell(IShellFolder Root, IntPtr pidlSub) { - IntPtr strr = Marshal.AllocCoTaskMem(MAX_PATH * 2 + 4); - Marshal.WriteInt32(strr, 0, 0); - StringBuilder buf = new StringBuilder(MAX_PATH); - Root.GetDisplayNameOf(pidlSub, SHGNO.INFOLDER, strr); - API.StrRetToBuf(strr, pidlSub, buf, MAX_PATH); - return buf.ToString(); - } /// - /// + /// ·ȡ IShellFolder /// - public static string GetNameByPIDL(IntPtr pidl) { - SHFILEINFO info = new SHFILEINFO(); - API.SHGetFileInfo(pidl, 0, ref info, Marshal.SizeOf(typeof(SHFILEINFO)), - SHGFI.PIDL | SHGFI.DISPLAYNAME | SHGFI.TYPENAME); - return info.szDisplayName; + public static IShellFolder GetShellFolder(IShellFolder desktop, string path) + { + IntPtr Pidl; + return GetShellFolder(desktop, path, out Pidl); } - } } diff --git a/Source/RaUI/Common/Shell/CShellFolder.cs b/Source/RaUI/Common/Shell/CShellFolder.cs index 5a843e3..6f0d126 100644 --- a/Source/RaUI/Common/Shell/CShellFolder.cs +++ b/Source/RaUI/Common/Shell/CShellFolder.cs @@ -5,6 +5,7 @@ using System.Runtime.InteropServices; using System.Drawing; using System.IO; using System.Windows.Forms; +using RaUI.UI.LayeredForm; #pragma warning disable CS1591 // 缺少对公共可见类型或成员的 XML 注释 namespace WinShell { @@ -172,11 +173,11 @@ namespace WinShell { { OnFetchFolder(this, name); IShellFolder IParent = Root; + //桌面的真实路径的 PIDL + //Root.BindToObject(pidlSub, IntPtr.Zero, ref Guids.IID_IShellFolder, out IParent); IntPtr PIDL = pidlSub; //存放 PIDL 的数组 - IntPtr[] pidls = new IntPtr[1]; - pidls[0] = PIDL; - + IntPtr[] pidls = [PIDL]; //得到 IContextMenu 接口 IntPtr iContextMenuPtr = IntPtr.Zero; iContextMenuPtr = IParent.GetUIObjectOf(IntPtr.Zero, (uint)pidls.Length, diff --git a/Source/RaUI/Common/Shell/Enums.cs b/Source/RaUI/Common/Shell/Enums.cs index 084e476..a335eee 100644 --- a/Source/RaUI/Common/Shell/Enums.cs +++ b/Source/RaUI/Common/Shell/Enums.cs @@ -1,3 +1,9 @@ +//򿪷lc_mtt +//CSDNͣhttp://lemony.cnblogs.com +//ҳhttp://www.3lsoft.com +//ע˴ֹҵ;޸߷һݣлл +//---------------- Դ磬Ҹ ---------------- + using System; using System.Collections.Generic; using System.Text; @@ -208,4 +214,71 @@ namespace WinShell LAYOUTRTL = 0x8000 } + [Flags()] + public enum ShellSpecialFolders + { + DESKTOP = 0x0000, // + INTERNET = 0x0001, + PROGRAMS = 0x0002, // Start Menu\Programs + CONTROLS = 0x0003, // My Computer\Control Panel + PRINTERS = 0x0004, // My Computer\Printers + PERSONAL = 0x0005, // My Documents + FAVORITES = 0x0006, // \Favorites + STARTUP = 0x0007, // Start Menu\Programs\Startup + RECENT = 0x0008, // \Recent + SENDTO = 0x0009, // \SendTo + BITBUCKET = 0x000a, // \Recycle Bin + STARTMENU = 0x000b, // \Start Menu + MYDOCUMENTS = 0x000c, // logical "My Documents" desktop icon + MYMUSIC = 0x000d, // "My Music" folder + MYVIDEO = 0x000e, // "My Videos" folder + DESKTOPDIRECTORY = 0x0010, // \Desktop + DRIVES = 0x0011, // My Computer + NETWORK = 0x0012, // Network Neighborhood (My Network Places) + NETHOOD = 0x0013, // \nethood + FONTS = 0x0014, // windows\fonts + TEMPLATES = 0x0015, + COMMON_STARTMENU = 0x0016, // All Users\Start Menu + COMMON_PROGRAMS = 0X0017, // All Users\Start Menu\Programs + COMMON_STARTUP = 0x0018, // All Users\Startup + COMMON_DESKTOPDIRECTORY = 0x0019, // All Users\Desktop + APPDATA = 0x001a, // \Application Data + PRINTHOOD = 0x001b, // \PrintHood + LOCAL_APPDATA = 0x001c, // \Local Settings\Applicaiton Data (non roaming) + ALTSTARTUP = 0x001d, // non localized startup + COMMON_ALTSTARTUP = 0x001e, // non localized common startup + COMMON_FAVORITES = 0x001f, + INTERNET_CACHE = 0x0020, + COOKIES = 0x0021, + HISTORY = 0x0022, + COMMON_APPDATA = 0x0023, // All Users\Application Data + WINDOWS = 0x0024, // GetWindowsDirectory() + SYSTEM = 0x0025, // GetSystemDirectory() + PROGRAM_FILES = 0x0026, // C:\Program Files + MYPICTURES = 0x0027, // C:\Program Files\My Pictures + PROFILE = 0x0028, // USERPROFILE + SYSTEMX86 = 0x0029, // x86 system directory on RISC + PROGRAM_FILESX86 = 0x002a, // x86 C:\Program Files on RISC + PROGRAM_FILES_COMMON = 0x002b, // C:\Program Files\Common + PROGRAM_FILES_COMMONX86 = 0x002c, // x86 Program Files\Common on RISC + COMMON_TEMPLATES = 0x002d, // All Users\Templates + COMMON_DOCUMENTS = 0x002e, // All Users\Documents + COMMON_ADMINTOOLS = 0x002f, // All Users\Start Menu\Programs\Administrative Tools + ADMINTOOLS = 0x0030, // \Start Menu\Programs\Administrative Tools + CONNECTIONS = 0x0031, // Network and Dial-up Connections + COMMON_MUSIC = 0x0035, // All Users\My Music + COMMON_PICTURES = 0x0036, // All Users\My Pictures + COMMON_VIDEO = 0x0037, // All Users\My Video + RESOURCES = 0x0038, // Resource Direcotry + RESOURCES_LOCALIZED = 0x0039, // Localized Resource Direcotry + COMMON_OLINKS = 0x003a, // Links to All Users OEM specific apps + CDBURN_AREA = 0x003b, // USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning + COMPUTERSNEARME = 0x003d, // Computers Near Me (computered from Workgroup membership) + FLAG_CREATE = 0x8000, // combine with value to force folder creation in SHGetFolderPath() + FLAG_DONT_VERIFY = 0x4000, // combine with value to return an unverified folder path + FLAG_NO_ALIAS = 0x1000, // combine with value to insure non-alias versions of the pidl + FLAG_PER_USER_INIT = 0x0800, // combine with value to indicate per-user init (eg. upgrade) + FLAG_MASK = 0xFF00, // mask for all possible flag values + } + } diff --git a/Source/RaUI/Common/SysFuns/ApkOp.cs b/Source/RaUI/Common/SysFuns/ApkOp.cs index 7867ae3..6820688 100644 --- a/Source/RaUI/Common/SysFuns/ApkOp.cs +++ b/Source/RaUI/Common/SysFuns/ApkOp.cs @@ -165,6 +165,7 @@ namespace ryCommon if(item == apk_icon) { list_icon.RemoveAt(i); } } } + list_icon.Insert(0, apk_icon); if (list_icon.Count > 0) { apk_icon = list_icon[list_icon.Count - 1]; } Random rd = new Random(Guid.NewGuid().GetHashCode()); string apkicon_savepath = Cache_Folder + "\\apkicon_" +rySafe.MD5Sha1.GetMD5(apk_file +"_"+ DateTime.Now.ToInt64()+"_"+ rd.Next(1,99999)) + ".png"; diff --git a/Source/RaUI/Common/SysFuns/HotkeyValue.cs b/Source/RaUI/Common/SysFuns/HotkeyValue.cs index 92b7459..3ad6102 100644 --- a/Source/RaUI/Common/SysFuns/HotkeyValue.cs +++ b/Source/RaUI/Common/SysFuns/HotkeyValue.cs @@ -107,11 +107,11 @@ namespace SysFuns Keys m_Modifiers = Modifiers; if ((m_Modifiers & Keys.Alt) != 0) { m_key |= 1; } - else if ((m_Modifiers & Keys.Control) != 0) + if ((m_Modifiers & Keys.Control) != 0) { m_key |= 2; } - else if ((m_Modifiers & Keys.Shift) != 0) + if ((m_Modifiers & Keys.Shift) != 0) { m_key |= 4; } - else if ((m_Modifiers & Keys.LWin) != 0) + if ((m_Modifiers & Keys.LWin) != 0) { m_key |= 8; } this.Modifiers_Int = m_key; } @@ -136,6 +136,37 @@ namespace SysFuns T_Modifiers = item[0].ToInt(0); T_Key = (Keys)item[1].ToInt(0); } + else if (item.Length <= 4) + { + var modifiers = "+"; + for (int i = 0; i < item.Length - 1; i++) + { + modifiers += item[i] + "+"; + } + var m_Modifiers = Keys.None; + if (modifiers.IndexOfEx("+ctrl+") >= 0) + { + m_Modifiers |= Keys.Control; + } + if (modifiers.IndexOfEx("+alt+") >= 0) + { + m_Modifiers |= Keys.Alt; + } + if (modifiers.IndexOfEx("+shift+") >= 0) + { + m_Modifiers |= Keys.Shift; + } + if (modifiers.IndexOfEx("+win+") >= 0) + { + m_Modifiers |= Keys.LWin; + } + var keyString = item[item.Length - 1]; + if (Enum.TryParse(keyString, out Keys key)) + { + LoadHotKey(m_Modifiers, key); + return; + } + } } catch { diff --git a/Source/RaUI/Common/SysFuns/WinHotReg.cs b/Source/RaUI/Common/SysFuns/WinHotReg.cs index a389f9d..c316a3f 100644 --- a/Source/RaUI/Common/SysFuns/WinHotReg.cs +++ b/Source/RaUI/Common/SysFuns/WinHotReg.cs @@ -182,6 +182,17 @@ namespace SysFuns return result; } /// + /// + /// + /// + /// + /// + public bool RegHotKey(int id, string hotkey) + { + HotkeyValue hotkeyValue =new HotkeyValue(hotkey); + return RegHotKey(id, hotkeyValue.Modifiers_Int, hotkeyValue.KeyCode); + } + /// /// 注册热键 /// /// diff --git a/Source/RaUI/ExtendUI/_SCREEN_CAPTURE/ImageProcessBox.cs b/Source/RaUI/ExtendUI/_SCREEN_CAPTURE/ImageProcessBox.cs index e0c88a7..b4569f6 100644 --- a/Source/RaUI/ExtendUI/_SCREEN_CAPTURE/ImageProcessBox.cs +++ b/Source/RaUI/ExtendUI/_SCREEN_CAPTURE/ImageProcessBox.cs @@ -427,14 +427,22 @@ namespace _SCREEN_CAPTURE /// protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; - if (this.baseImage != null) { - g.DrawImage(m_bmpDark, 0, 0); - g.DrawImage(this.baseImage, this.selectedRectangle, this.selectedRectangle, GraphicsUnit.Pixel); + try + { + if (this.baseImage != null) + { + if (!this.IsDisposed) + { + g.DrawImage(m_bmpDark, 0, 0); + g.DrawImage(this.baseImage, this.selectedRectangle, this.selectedRectangle, GraphicsUnit.Pixel); + } + } + this.DrawOperationBox(g); + if (this.baseImage != null && !isDrawed && !isMoving && m_bMouseEnter && isShowInfo) + DrawInfo(e.Graphics); + base.OnPaint(e); } - this.DrawOperationBox(g); - if (this.baseImage != null && !isDrawed && !isMoving && m_bMouseEnter && isShowInfo) - DrawInfo(e.Graphics); - base.OnPaint(e); + catch { } } /// /// 绘制操作框 diff --git a/Source/RaUI/ExtendUI/myUpdate/LiveUpdate_EventArgs.cs b/Source/RaUI/ExtendUI/myUpdate/LiveUpdate_EventArgs.cs index 000632d..24bed6d 100644 --- a/Source/RaUI/ExtendUI/myUpdate/LiveUpdate_EventArgs.cs +++ b/Source/RaUI/ExtendUI/myUpdate/LiveUpdate_EventArgs.cs @@ -24,6 +24,10 @@ namespace LiveUpdate /// public string UpdateVer;//版本 /// + /// 版本类型 + /// + public string VersionType;//版本类型 + /// /// 更新日期 /// public string UpdateDate;//更新日期 diff --git a/Source/RaUI/ExtendUI/myUpdate/clsLiveUpdate.cs b/Source/RaUI/ExtendUI/myUpdate/clsLiveUpdate.cs index 128ecad..f269a2b 100644 --- a/Source/RaUI/ExtendUI/myUpdate/clsLiveUpdate.cs +++ b/Source/RaUI/ExtendUI/myUpdate/clsLiveUpdate.cs @@ -295,12 +295,12 @@ namespace LiveUpdate SoftUpdateDesUrl = jo.GetJsonValue("SoftUpdateDesUrl", ""); //数据库更新描述 DbUpdateDes = jo.GetJsonValue("DbUpdateDes", ""); - + //激发事件 OnReadComplete_T(); //更新标志,1表示软件更新,2表示数据库更新 int UpdateMarket = 0;//更新标志 - UpdateInfo myUpdate=new UpdateInfo(); + UpdateInfo myUpdate = new UpdateInfo(); myUpdate.UpdateDate = ""; myUpdate.UpdateDes = ""; myUpdate.UpdateDes_Url = ""; @@ -308,17 +308,17 @@ namespace LiveUpdate myUpdate.UpdateType = ""; myUpdate.UpdateUrl = ""; var m_UpdateUserList = jo.GetJsonValue("UpdateUserList", ""); - if(m_UpdateUserList.Length>0) + if (m_UpdateUserList.Length > 0) { m_UpdateUserList = "|" + m_UpdateUserList.Replace(";", "|") + "|"; } if (RySoft.CompareVer(MySoftVer, MySoftRVer, SoftVer, ReVer) == 1) { - var ConfigUrl= jo.GetJsonValue("ConfigUrl", ""); - if(ConfigUrl.Length>0) + var ConfigUrl = jo.GetJsonValue("ConfigUrl", ""); + if (ConfigUrl.Length > 0) { var http_config = web.Get(ConfigUrl); - if(http_config.StatusCode== HttpStatusCode.OK) + if (http_config.StatusCode == HttpStatusCode.OK) { try { @@ -328,7 +328,7 @@ namespace LiveUpdate //在下载升级包前首先要下载的内容 myUpdate.FirstDownList = jo_config.GetJsonValue("FirstDownList", ""); Storage storage = new Storage(); - storage.AddNode2("id","MainProcName"); + storage.AddNode2("id", "MainProcName"); storage.SetAttrValue("Value", jo_config.GetJsonValue("MainProcName", "")); storage.AddNode2("id", "MainProcPram"); storage.SetAttrValue("Value", jo_config.GetJsonValue("MainProcPram", "")); @@ -345,6 +345,7 @@ namespace LiveUpdate myUpdate.UpdateDate = SoftDate; myUpdate.UpdateDes = SoftUpdateDes; myUpdate.UpdateVer = SoftVersion; + myUpdate.VersionType = jo.GetJsonValue("VersionType", ""); myUpdate.UpdateType = "soft"; myUpdate.UpdateDes_Url = SoftUpdateDesUrl; if (FileVerUpdateUrl.Length > 0) @@ -404,7 +405,8 @@ namespace LiveUpdate OnNoUpdate_T(); } } - catch { + catch + { UpdateError.ErrorId = 2; UpdateError.ErrorStr = "更新错误,读取远程文件失败"; OnHappenError_T(UpdateError); @@ -412,6 +414,12 @@ namespace LiveUpdate return; } } + else { + UpdateError.ErrorId = 3; + UpdateError.ErrorStr = "更新错误,读取远程文件失败2"; + OnHappenError_T(UpdateError); + OnNoUpdate_T(); + } } Thread threadDown; /// diff --git a/Source/RaUI/ExtendUI/myUpdate/frmUpdate.cs b/Source/RaUI/ExtendUI/myUpdate/frmUpdate.cs index 15764b4..bf2c6fd 100644 --- a/Source/RaUI/ExtendUI/myUpdate/frmUpdate.cs +++ b/Source/RaUI/ExtendUI/myUpdate/frmUpdate.cs @@ -92,7 +92,7 @@ namespace LiveUpdate Capion = "发现更新的数据库,升级到最新版数据库,可以获取更全的显示内容。"; } UpdateDate = ConvertDateStr(e.UpdateDate, "未知"); - UpdateVer = e.UpdateVer; + UpdateVer = e.UpdateVer+(e.VersionType.Length==0?"":" "+e.VersionType); if (e.UpdateDes_Url != "" && e.UpdateDes_Url.IndexOf("http", StringComparison.OrdinalIgnoreCase) == 0) { extendedWebBrowser1.Visible = true; diff --git a/Source/RaUI/Properties/AssemblyInfo.cs b/Source/RaUI/Properties/AssemblyInfo.cs index 5263c98..df3674a 100644 --- a/Source/RaUI/Properties/AssemblyInfo.cs +++ b/Source/RaUI/Properties/AssemblyInfo.cs @@ -33,5 +33,5 @@ using System.Runtime.InteropServices; //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 //通过使用 "*",如下所示: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("4.0.2506.2701")] -[assembly: AssemblyFileVersion("4.0.2506.2701")] \ No newline at end of file +[assembly: AssemblyVersion("4.0.2508.1601")] +[assembly: AssemblyFileVersion("4.0.2508.1601")] \ No newline at end of file diff --git a/Source/RaUI/RaUIV4.csproj.user b/Source/RaUI/RaUIV4.csproj.user index 9b86104..bcb94c6 100644 --- a/Source/RaUI/RaUIV4.csproj.user +++ b/Source/RaUI/RaUIV4.csproj.user @@ -1,6 +1,9 @@ - + ShowAllFiles + + true + \ No newline at end of file diff --git a/Source/RaUI/UI/Controls/ButtonEX.cs b/Source/RaUI/UI/Controls/ButtonEX.cs index bc587fc..8b2c8b0 100644 --- a/Source/RaUI/UI/Controls/ButtonEX.cs +++ b/Source/RaUI/UI/Controls/ButtonEX.cs @@ -401,7 +401,9 @@ namespace ryControls { imageRect = Rectangle.Empty; textRect = Rectangle.Empty; - SizeF textSize = g.MeasureString(Text, Font); + var DD= GetTextFormatFlags(TextAlign, RightToLeft == RightToLeft.Yes); + SizeF textSize = TextRenderer.MeasureText(g, Text, Font, this.Size, DD); + //SizeF textSize =ControlPaint. g.MeasureString(Text, Font); if (Image == null) { switch (TextAlign) diff --git a/Source/RaUI/UI/Controls/ComboBox/ComboBoxEx2.cs b/Source/RaUI/UI/Controls/ComboBox/ComboBoxEx2.cs index 7ed7a85..d400931 100644 --- a/Source/RaUI/UI/Controls/ComboBox/ComboBoxEx2.cs +++ b/Source/RaUI/UI/Controls/ComboBox/ComboBoxEx2.cs @@ -118,23 +118,15 @@ namespace ryControls toolTip1.SetToolTip(BtnPopup, value); } } - private Font _font = new Font("宋体",9); /// - /// 字体 + /// /// - public override Font Font + /// + protected override void OnFontChanged(EventArgs e) { - get - { - return _font; - } - - set - { - _font = value; - txtSearch.Font = value; - BtnPopup.Font = value; - } + txtSearch.Font = base.Font; + BtnPopup.Font = base.Font; + base.OnFontChanged(e); } private bool _UseDefSkin = true; /// @@ -335,7 +327,9 @@ namespace ryControls } txtSearch.Focus(); subForm = new FrmComboBoxPopup(); - if(MaxPopupWidth>0) + subForm.Font = this.Font; + //subForm.ListBox. + if (MaxPopupWidth>0) { subForm.Width= MaxPopupWidth; } @@ -568,6 +562,14 @@ namespace ryControls /// public string ValueStr1 { get; set; } = ""; /// + /// int值1 + /// + public int ValueInt1 { get; set; } = 0; + /// + /// long值1 + /// + public long ValueLong1 { get; set; } = 0; + /// /// Tag /// public object Tag { get; set; } =null; diff --git a/Source/RaUI/UI/Controls/ComboBox/FrmComboBoxPopup.Designer.cs b/Source/RaUI/UI/Controls/ComboBox/FrmComboBoxPopup.Designer.cs index 5711937..8f5f1fc 100644 --- a/Source/RaUI/UI/Controls/ComboBox/FrmComboBoxPopup.Designer.cs +++ b/Source/RaUI/UI/Controls/ComboBox/FrmComboBoxPopup.Designer.cs @@ -32,11 +32,14 @@ // // FrmComboBoxPopup // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 14F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(464, 426); + this.ClientSize = new System.Drawing.Size(541, 497); + this.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); this.Name = "FrmComboBoxPopup"; this.ShowIcon = false; + this.Load += new System.EventHandler(this.FrmComboBoxPopup_Load); this.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.FrmComboBoxPopup_PreviewKeyDown); this.ResumeLayout(false); diff --git a/Source/RaUI/UI/Controls/ComboBox/FrmComboBoxPopup.cs b/Source/RaUI/UI/Controls/ComboBox/FrmComboBoxPopup.cs index 1106e4a..225dd53 100644 --- a/Source/RaUI/UI/Controls/ComboBox/FrmComboBoxPopup.cs +++ b/Source/RaUI/UI/Controls/ComboBox/FrmComboBoxPopup.cs @@ -36,7 +36,7 @@ namespace RaUI.UI.Controls.ComboBox /// /// /// - internal ListBoxEx ListBox=new ListBoxEx(); + public ListBoxEx ListBox=new(); /// /// /// @@ -45,6 +45,7 @@ namespace RaUI.UI.Controls.ComboBox InitializeComponent(); //RyForm.SetChildStyle(this); //this.Selectable = false; + ListBox.Font = this.Font; ListBox.ItemHeight = 30; ListBox.Parent = this; ListBox.Dock = DockStyle.Fill; @@ -117,5 +118,10 @@ namespace RaUI.UI.Controls.ComboBox { } + + private void FrmComboBoxPopup_Load(object sender, EventArgs e) + { + + } } } diff --git a/Source/RaUI/UI/Controls/ComboBox/ryComboBox.cs b/Source/RaUI/UI/Controls/ComboBox/ryComboBox.cs index 40fcd32..00034d0 100644 --- a/Source/RaUI/UI/Controls/ComboBox/ryComboBox.cs +++ b/Source/RaUI/UI/Controls/ComboBox/ryComboBox.cs @@ -5,6 +5,7 @@ using System.Drawing; using System.Windows.Forms; using ryControls; using System.Globalization; +using System.Drawing.Drawing2D; namespace ryControls { @@ -16,10 +17,14 @@ namespace ryControls { private List mUndoList = new List(); private Stack mRedoStack = new Stack(); - private bool mIsUndo = false; private UndoRedoInfo mLastInfo = new UndoRedoInfo("", 0); - private System.ComponentModel.IContainer components; private int mMaxUndoRedoSteps = 50; + //导入API函数 + [System.Runtime.InteropServices.DllImport("user32.dll ")] + static extern IntPtr GetWindowDC(IntPtr hWnd);//返回hWnd参数所指定的窗口的设备环境。 + + [System.Runtime.InteropServices.DllImport("user32.dll ")] + static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); //函数释放设备上下文环境(DC) private class UndoRedoInfo { public UndoRedoInfo(string text, int cursorLoc) @@ -67,7 +72,6 @@ namespace ryControls { if (!CanUndo) return; - mIsUndo = true; mRedoStack.Push(new UndoRedoInfo(Text, SelectionStart)); UndoRedoInfo info = (UndoRedoInfo)mUndoList[0]; mUndoList.RemoveAt(0); @@ -75,7 +79,6 @@ namespace ryControls SelectionStart = info.CursorLocation; //txtInfo.ScrollToCaret(); mLastInfo = info; - mIsUndo = false; } /// /// 重复操作 @@ -84,14 +87,12 @@ namespace ryControls { if (!CanRedo) return; - mIsUndo = true; mUndoList.Insert(0, new UndoRedoInfo(Text, SelectionStart)); LimitUndo(); UndoRedoInfo info = (UndoRedoInfo)mRedoStack.Pop(); Text = info.Text; SelectionStart = info.CursorLocation; //this.ScrollToCaret(); - mIsUndo = false; } private void LimitUndo() { @@ -109,36 +110,66 @@ namespace ryControls base.DoubleBuffered = true; base.FlatStyle = FlatStyle.Flat; base.DrawMode = DrawMode.OwnerDrawFixed; + base.DrawItem += new DrawItemEventHandler(delegate (object sender, DrawItemEventArgs e) { - if (e.Index < 0) + if (e.Index < 0) { return; } + //鼠标选中在这个项上 + if ((e.State & DrawItemState.Selected) != 0) { - return; - } - //StringFormat stringFormat = new StringFormat - //{ - // LineAlignment = StringAlignment.Center - //}; - e.DrawBackground(); - e.DrawFocusRectangle(); - if (base.Items[e.Index] is ComboPopupItem item) - { - var r = e.Bounds; - if (item.Image != null) - { - int width = item.Image.Width * 20 / item.Image.Height; - e.Graphics.DrawImage(item.Image, r.X + 2, r.Y + (r.Height - 20) / 2, width, 20); - //e.Graphics.DrawImage(engine.Icon,e.Bounds.Location); - r.Offset(width+2, 0); - } - e.Graphics.DrawString(item.Text, e.Font, new SolidBrush(e.ForeColor), r, StringFormat.GenericDefault); + //渐变画刷 + LinearGradientBrush brush = new LinearGradientBrush(e.Bounds, Color.FromArgb(255, 251, 237), + Color.FromArgb(255, 236, 181), LinearGradientMode.Vertical); + //填充区域 + Rectangle borderRect = new Rectangle(3, e.Bounds.Y, e.Bounds.Width - 5, e.Bounds.Height-2); + + e.Graphics.FillRectangle(brush, borderRect); + //画边框 + Pen pen = new Pen(Color.FromArgb(229, 195, 101)); + e.Graphics.DrawRectangle(pen, borderRect); } else { - SizeF size = e.Graphics.MeasureString(base.Items[e.Index].ToString(), e.Font); - float kk = e.Bounds.Y + (e.Bounds.Height - (int)size.Height); - e.Graphics.DrawString(base.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds.X, kk); + SolidBrush brush = new SolidBrush(Color.FromArgb(255, 255, 255)); + e.Graphics.FillRectangle(brush, e.Bounds); } + Rectangle textRect = new Rectangle(3, e.Bounds.Y + 1, e.Bounds.Width-5, e.Bounds.Height - 2); + switch (this.Items[e.Index]) + { + case clsCbbItem item: + Image img = item.Img; + //图片绘制的区域 + Rectangle imgRect = new Rectangle(6, e.Bounds.Y + 3, 16, 16); + e.Graphics.SmoothingMode = SmoothingMode.HighQuality; + e.Graphics.CompositingQuality = CompositingQuality.HighQuality; + e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor; + e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; + e.Graphics.DrawImage(img, imgRect); + //文本内容显示区域 + textRect = new Rectangle(imgRect.Right + 2, imgRect.Y, e.Bounds.Width - imgRect.Width, e.Bounds.Height - 2); + break; + case ComboPopupItem item2: + Image img2 = item2.Image; + //图片绘制的区域 + Rectangle imgRect2 = new Rectangle(6, e.Bounds.Y + 3, 16, 16); + e.Graphics.SmoothingMode = SmoothingMode.HighQuality; + e.Graphics.CompositingQuality = CompositingQuality.HighQuality; + e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor; + e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; + e.Graphics.DrawImage(img2, imgRect2); + //文本内容显示区域 + textRect = new Rectangle(imgRect2.Right + 2, imgRect2.Y, e.Bounds.Width - imgRect2.Width, e.Bounds.Height - 2); + break; + } + //获得项文本内容,绘制文本 + string itemText = this.Items[e.Index].ToString(); + + //文本格式垂直居中 + StringFormat strFormat = new StringFormat() + { + LineAlignment = StringAlignment.Center + }; + e.Graphics.DrawString(itemText, new Font("微软雅黑", 11), Brushes.Black, textRect, strFormat); }); } @@ -148,17 +179,26 @@ namespace ryControls /// 消息 protected override void WndProc(ref Message m) { + base.WndProc(ref m); if (m.Msg == 0xf || m.Msg == 0x133) { - ryControls.SkinHelp.ResetBorderColor(m, this, 1, Color.FromArgb(213, 216, 223)); - } - base.WndProc(ref m); - } + IntPtr hDC = GetWindowDC(m.HWnd); + if (hDC.ToInt32() == 0) //如果取设备上下文失败则返回 + { + return; + } - private void InitializeComponent() - { - this.SuspendLayout(); - this.ResumeLayout(false); + //建立Graphics对像 + Graphics g = Graphics.FromHdc(hDC); + //画边框的 + ControlPaint.DrawBorder(g, new Rectangle(0, 0, Width, Height), SkinHelp.DefalutBorderColor, ButtonBorderStyle.Solid); + //画坚线 + //ControlPaint.DrawBorder(g, new Rectangle(Width - Height, 0, Height, Height), Color.Red, ButtonBorderStyle.Solid); + //g.DrawLine(new Pen(Brushes.Blue, 2), new PointF(this.Width - this.Height, 0), new PointF(this.Width - this.Height, this.Height)); + //释放DC + ReleaseDC(m.HWnd, hDC); + return; + } } } diff --git a/Source/RaUI/UI/Controls/Hotkey/HotkeyTextBox.Designer.cs b/Source/RaUI/UI/Controls/Hotkey/HotkeyTextBox.Designer.cs index 9ac80db..1ef5114 100644 --- a/Source/RaUI/UI/Controls/Hotkey/HotkeyTextBox.Designer.cs +++ b/Source/RaUI/UI/Controls/Hotkey/HotkeyTextBox.Designer.cs @@ -28,46 +28,18 @@ /// private void InitializeComponent() { - this.BtnClear = new System.Windows.Forms.Button(); - this.TxtHotKey = new System.Windows.Forms.TextBox(); this.SuspendLayout(); // - // BtnClear + // HotkeyTextBox // - this.BtnClear.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.BtnClear.Location = new System.Drawing.Point(245, 0); - this.BtnClear.Name = "BtnClear"; - this.BtnClear.Size = new System.Drawing.Size(43, 35); - this.BtnClear.TabIndex = 1; - this.BtnClear.Text = "X"; - this.BtnClear.UseVisualStyleBackColor = true; - this.BtnClear.Click += new System.EventHandler(this.BtnClear_Click); - // - // TxtHotKey - // - this.TxtHotKey.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TxtHotKey.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.TxtHotKey.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); - this.TxtHotKey.Location = new System.Drawing.Point(3, 8); - this.TxtHotKey.Name = "TxtHotKey"; - this.TxtHotKey.Size = new System.Drawing.Size(236, 19); - this.TxtHotKey.TabIndex = 2; - // - // ctlHotkey - // - this.Controls.Add(this.TxtHotKey); - this.Controls.Add(this.BtnClear); - this.Name = "ctlHotkey"; + this.DoubleBuffered = true; + this.Name = "HotkeyTextBox"; this.Size = new System.Drawing.Size(288, 35); this.Paint += new System.Windows.Forms.PaintEventHandler(this.CtlHotkey_Paint); this.ResumeLayout(false); - this.PerformLayout(); } #endregion - private System.Windows.Forms.Button BtnClear; - private System.Windows.Forms.TextBox TxtHotKey; } } diff --git a/Source/RaUI/UI/Controls/Hotkey/HotkeyTextBox.cs b/Source/RaUI/UI/Controls/Hotkey/HotkeyTextBox.cs index c8df2ca..9abe59c 100644 --- a/Source/RaUI/UI/Controls/Hotkey/HotkeyTextBox.cs +++ b/Source/RaUI/UI/Controls/Hotkey/HotkeyTextBox.cs @@ -26,15 +26,160 @@ namespace ryControls InitializeComponent(); //定义KeyPress事件 //base.KeyPress += delegate(object sender, KeyPressEventArgs e) { e.Handled = true; }; - TxtHotKey.ReadOnly = true; - TxtHotKey.BackColor = Color.White; - TxtHotKey.KeyDown += TxtHotKey_KeyDown; - TxtHotKey.KeyUp += TxtHotKey_KeyUp; - TxtHotKey.Top = (Height - TxtHotKey.Height) / 2; //Application.AddMessageFilter(this); base.BackColor = Color.White; } /// + /// 清除按钮位置 + /// + public Rectangle ClearBtnRect + { + get + { + return new Rectangle(this.Width - this.Height-1, 1, Height-1, Height-2); + } + } + /// + /// 热键文本位置 + /// + public Rectangle HotKeyTextRect + { + get + { + return new Rectangle(0, 0, this.Width -this.Height-2, Height); + } + } + /// + /// + /// + /// + protected override void OnMouseDown(MouseEventArgs e) + { + if(ClearBtnRect.Contains(e.Location)) + { + m_Modifiers = Keys.None; + m_Key = Keys.None; + UpdateText(); + } + base.OnMouseDown(e); + } + private ControlState _controlState;//控件状态 + internal ControlState ControlState //控件的状态 + { + get { return _controlState; } + set + { + if (_controlState != value) + { + _controlState = value; + base.Invalidate(); + } + } + } + private ControlState _ClearBtnState;//控件状态 + internal ControlState ClearBtnState //控件的状态 + { + get { return _ClearBtnState; } + set + { + if (_ClearBtnState != value) + { + _ClearBtnState = value; + base.Invalidate(); + } + } + } + /// + /// + /// + /// + protected override void OnMouseUp(MouseEventArgs e) + { + base.OnMouseUp(e); + if (e.Button == MouseButtons.Left && e.Clicks == 1) + { + if (ClientRectangle.Contains(e.Location))//控件区域包含鼠标的位置 + { + ControlState = ControlState.Hover; + } + else + { + ControlState = ControlState.Normal; + } + } + } + /// + /// + /// + /// + protected override void OnMouseLeave(EventArgs e) + { + ControlState = ControlState.Normal; + ClearBtnState= ControlState.Normal; + base.OnMouseLeave(e); + } + /// + /// + /// + /// + protected override void OnLostFocus(EventArgs e) + { + ControlState = ControlState.Normal; + ClearBtnState = ControlState.Normal; + base.OnLostFocus(e); + } + /// + /// + /// + /// + protected override void OnMouseMove(MouseEventArgs e) + { + if(ClearBtnRect.Contains(e.Location)) + { + if (ClearBtnState != ControlState.Hover) + { + ClearBtnState = ControlState.Hover; + this.Invalidate(); + } + } + else + { + if (ClearBtnState == ControlState.Hover) + { + ClearBtnState = ControlState.Normal; + this.Invalidate(); + } + } + base.OnMouseMove(e); + } + /// + /// + /// + /// + protected override void OnPaint(PaintEventArgs e) + { + e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + e.Graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; + e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; + StringFormat sf = new StringFormat(); + sf.Trimming = StringTrimming.EllipsisCharacter; + sf.FormatFlags = StringFormatFlags.NoWrap; + sf.LineAlignment = StringAlignment.Center; + sf.Alignment = StringAlignment.Center; + Pen pen = new Pen(new SolidBrush(ClearBtnState== ControlState.Hover ? Color.FromArgb(43, 141, 225) : ForeColor), 1); + //var offset =this.Height/4; + //var btn_rect= ClearBtnRect; + e.Graphics.DrawPath(pen,MGdu.WinFormUI.MyGraphics.GraphicsPathHelper.CreateCloseFlagPath(ClearBtnRect)); + //e.Graphics.DrawLine(pen, btn_rect.Left+ offset, btn_rect.Top+ offset, btn_rect.Right- offset, btn_rect.Bottom- offset); + //e.Graphics.DrawLine(pen, btn_rect.Right- offset, btn_rect.Top+ offset, btn_rect.Left+offset, btn_rect.Bottom- offset); + pen.Dispose(); + //e.Graphics.DrawString("X", MouseInClearBtn?new Font(Font.FontFamily,Font.Size+2, FontStyle.Bold): Font, new SolidBrush(MouseInClearBtn?Color.Blue: ForeColor), ClearBtnRect, sf); + sf.Alignment = StringAlignment.Near; + e.Graphics.DrawString(" "+tmpText, Font,new SolidBrush(ForeColor), HotKeyTextRect, sf); + ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, ControlState== ControlState.Hover?Color.FromArgb(43, 141, 225) : SkinHelp.DefalutBorderColor, ButtonBorderStyle.Solid); + } + /// /// /// ~HotkeyTextBox() @@ -61,19 +206,7 @@ namespace ryControls /// protected override void OnSizeChanged(EventArgs e) { - TxtHotKey.Top = (Height - TxtHotKey.Height) / 2; - TxtHotKey.Width = Width - BtnClear.Width - 2; - BtnClear.Top = 0; - BtnClear.Left = TxtHotKey.Left + TxtHotKey.Width; - BtnClear.Height = Height; - } - private void TxtHotKey_KeyDown(object sender, KeyEventArgs e) - { - OnKeyDown(e); - } - private void TxtHotKey_KeyUp(object sender, KeyEventArgs e) - { - OnKeyUp(e); + } //使文本属性失效掉 /// @@ -82,10 +215,11 @@ namespace ryControls [Description("此属性无效")] public new string Text { - get { return TxtHotKey.Text; } + get { return tmpText; } set { LoadHotKey(value); + this.Invalidate(); } } /// @@ -109,6 +243,37 @@ namespace ryControls T_Modifiers = item[0].ToInt(0); T_Key = (Keys)item[1].ToInt(0); } + else if(item.Length <=4) + { + var modifiers = "+"; + for (int i = 0; i < item.Length-1; i++) + { + modifiers += item[i] + "+"; + } + m_Modifiers = Keys.None; + if (modifiers.IndexOfEx("+ctrl+")>=0) + { + m_Modifiers |= Keys.Control; + } + if (modifiers.IndexOfEx("+alt+") >= 0) + { + m_Modifiers |= Keys.Alt; + } + if (modifiers.IndexOfEx("+shift+") >= 0) + { + m_Modifiers |= Keys.Shift; + } + if (modifiers.IndexOfEx("+win+") >= 0) + { + m_Modifiers |= Keys.LWin; + } + var keyString = item[item.Length - 1]; + if (Enum.TryParse(keyString, out Keys key)) + { + T_Key = key; + } + UpdateText(); + } } catch { @@ -119,10 +284,8 @@ namespace ryControls private void UpdateText() { HotkeyValue xvalue = new HotkeyValue(T_Modifiers, (int)T_Key); - base.Text = xvalue.ToString(); - TxtHotKey.Text = base.Text; - TxtHotKey.SelectionLength = 0; - TxtHotKey.SelectionStart = 0; + tmpText = xvalue.ToString(); + this.Invalidate(); } /// /// 保存热键 @@ -221,11 +384,11 @@ namespace ryControls } m_Modifiers = value.Modifiers; m_Key = value.KeyCode; - base.Text = value.ToString();//赋值 - TxtHotKey.Text = base.Text; + Text = value.ToString();//赋值 e.Handled = true; base.OnKeyDown(e); } + private string tmpText = ""; //TextBox的KeyDown事件 /// /// KeyDown事件 @@ -236,7 +399,7 @@ namespace ryControls if(m_Modifiers!=Keys.None && m_Key==Keys.None) { m_Modifiers = Keys.None; - TxtHotKey.Text = "错误的热键"; + tmpText = "错误的热键"; } e.Handled = false; base.OnKeyUp(e); @@ -250,7 +413,17 @@ namespace ryControls private void CtlHotkey_Paint(object sender, PaintEventArgs e) { - e.Graphics.DrawRectangle(new Pen(Color.FromArgb(213, 216, 223)), new Rectangle(0, 0, this.Width - 1, this.Height - 1)); + //e.Graphics.DrawRectangle(new Pen(Color.FromArgb(213, 216, 223)), new Rectangle(0, 0, this.Width - 1, this.Height - 1)); + } + + private void BtnClear_KeyDown(object sender, KeyEventArgs e) + { + OnKeyDown(e); + } + + private void BtnClear_KeyUp(object sender, KeyEventArgs e) + { + OnKeyUp(e); } } } diff --git a/Source/RaUI/UI/Controls/TextBoxEx2.cs b/Source/RaUI/UI/Controls/TextBoxEx2.cs index ac84edb..45f5b0b 100644 --- a/Source/RaUI/UI/Controls/TextBoxEx2.cs +++ b/Source/RaUI/UI/Controls/TextBoxEx2.cs @@ -92,6 +92,10 @@ namespace ryControls { e.Graphics.Clear(this.BackColor); } + else if(!base.Enabled) + { + e.Graphics.Clear(SystemColors.Control); + } e.Graphics.DrawRectangle(new Pen(SkinHelp.DefalutBorderColor), new Rectangle(0, 0, this.Width - 1, this.Height - 1)); if(txtInfo.Text.Length==0 && !txtInfo.Visible) { @@ -99,10 +103,17 @@ namespace ryControls Font font = this.Font; // 使用当前控件的字体。 Rectangle rect = this.ClientRectangle; // 在当前控件的客户区域绘制。 StringFormat stringFormat = new StringFormat(); - stringFormat.LineAlignment = StringAlignment.Center; + if (!Multiline) + { + stringFormat.LineAlignment = StringAlignment.Center; + } + else + { + rect.Offset(0, 6); + } using (Graphics g = this.CreateGraphics()) { - g.DrawString(" "+EmptyText, font, brush, rect, stringFormat); + g.DrawString(" " + EmptyText, font, brush, rect, stringFormat); } } } @@ -149,7 +160,7 @@ namespace ryControls public bool Multiline { get { return txtInfo.Multiline; } - set { txtInfo.Multiline = value; txtInfo.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; } + set { txtInfo.Multiline = value; txtInfo.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;this.Invalidate(); } } /// /// 是否在显示不下时换行 @@ -299,7 +310,6 @@ namespace ryControls private void TextBoxEx2_FontChanged(object sender, EventArgs e) { txtInfo.Font = this.Font; - } /// /// diff --git a/Source/RaUI/UI/HtmlRenderer/HtmlLabel.cs b/Source/RaUI/UI/HtmlRenderer/HtmlLabel.cs index b8a37d9..6ee8fb5 100644 --- a/Source/RaUI/UI/HtmlRenderer/HtmlLabel.cs +++ b/Source/RaUI/UI/HtmlRenderer/HtmlLabel.cs @@ -301,13 +301,13 @@ namespace TheArtOfDev.HtmlRenderer.WinForms } /// - /// Automatically sets the size of the label by content size + /// ݴСԶñǩĴС /// [Browsable(true)] [DefaultValue(true)] [EditorBrowsable(EditorBrowsableState.Always)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] - [Description("Automatically sets the size of the label by content size.")] + [Description("ݴСԶñǩĴС ")] public override bool AutoSize { get { return base.AutoSize; } @@ -324,12 +324,12 @@ namespace TheArtOfDev.HtmlRenderer.WinForms } /// - /// Automatically sets the height of the label by content height (width is not effected). + /// ݸ߶Զñǩĸ߶ȣȲӰ죩 /// [Browsable(true)] [DefaultValue(false)] [Category("Layout")] - [Description("Automatically sets the height of the label by content height (width is not effected)")] + [Description("ݸ߶Զñǩĸ߶ȣȲӰ죩")] public virtual bool AutoSizeHeightOnly { get { return _autoSizeHight; } diff --git a/Source/RaUI/UI/ObjectListView/Rendering/Renderers.cs b/Source/RaUI/UI/ObjectListView/Rendering/Renderers.cs index 7f298cd..3c56ade 100644 --- a/Source/RaUI/UI/ObjectListView/Rendering/Renderers.cs +++ b/Source/RaUI/UI/ObjectListView/Rendering/Renderers.cs @@ -1,4 +1,4 @@ -/* +/* * Renderers - A collection of useful renderers that are used to owner draw a cell in an ObjectListView * * Author: Phillip Piper @@ -907,19 +907,23 @@ namespace BrightIdeasSoftware { { if (String.IsNullOrEmpty(txt)) return Size.Empty; - - if (this.UseGdiTextRendering) + try { - Size proposedSize = new Size(width, Int32.MaxValue); - return TextRenderer.MeasureText(g, txt, this.Font, proposedSize, NormalTextFormatFlags); - } - - // Using GDI+ renderering - 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); + if (this.UseGdiTextRendering) + { + Size proposedSize = new Size(width, Int32.MaxValue); + return TextRenderer.MeasureText(g, txt, this.Font, proposedSize, NormalTextFormatFlags); + } + + // Using GDI+ renderering + 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); + } } + catch { return Size.Empty; } } /// @@ -1716,15 +1720,15 @@ namespace BrightIdeasSoftware { /// Bounds of the cell /// /// The string to be drawn - /// ˢ - public virtual int DrawText2(Graphics g, Rectangle r,int offset_x, String txt, Brush brush) + /// + public virtual int DrawText2(Graphics g, Rectangle r, int offset_x, String txt, Brush brush) { var txt_size = g.MeasureString(txt, Font).ToSize(); StringFormat sf = new StringFormat(); sf.Trimming = StringTrimming.EllipsisCharacter; - sf.FormatFlags = StringFormatFlags.NoWrap;//Զ - g.DrawString(txt, Font, brush,new RectangleF(r.Left+ offset_x, r.Top + 2 + (r.Height - txt_size.Height) / 2,r.Width- offset_x, r.Height),sf); - return txt_size.Width+1; + sf.FormatFlags = StringFormatFlags.NoWrap;//<2F>Զ + g.DrawString(txt, Font, brush, new RectangleF(r.Left + offset_x, r.Top + 2 + (r.Height - txt_size.Height) / 2, r.Width - offset_x, r.Height), sf); + return txt_size.Width + 1; } /// /// Draw the given text and optional image in the "normal" fashion @@ -1751,7 +1755,7 @@ namespace BrightIdeasSoftware { { var txt_size = g.MeasureString(txt, Font).ToSize(); var rect = new RectangleF(r.Left + offset_x, r.Top + 2 + (r.Height - txt_size.Height) / 2, r.Width - offset_x, r.Height); - var rect_back = new RectangleF(r.Left + offset_x, r.Top + 2, txt_size.Width, r.Height-4); + var rect_back = new RectangleF(r.Left + offset_x, r.Top + 2, txt_size.Width, r.Height - 4); g.FillRectangle(back_brush, rect_back); StringFormat sf = new StringFormat(); sf.Trimming = StringTrimming.EllipsisCharacter; @@ -1759,6 +1763,64 @@ namespace BrightIdeasSoftware { return txt_size.Width + 1; } /// + /// Draw the given text and optional image in the "normal" fashion + /// + /// Graphics context to use for drawing + /// Bounds of the cell + /// + /// The string to be drawn + /// 笔刷 + public virtual int DrawText2(Graphics g, Rectangle r,int offset_x, String txt, Color forecolor) + { + try + { + StringFormat sf = new StringFormat(); + sf.Trimming = StringTrimming.EllipsisCharacter; + + sf.FormatFlags = StringFormatFlags.NoWrap;//自动换行 + Size txt_size = TextRenderer.MeasureText(g, txt, Font, r.Size, TextFormatFlags.NoPadding | TextFormatFlags.PreserveGraphicsTranslateTransform); + TextRenderer.DrawText(g, txt, Font, new Rectangle(r.Left + offset_x, r.Top + 2 + (r.Height - txt_size.Height) / 2, r.Width - offset_x, r.Height), forecolor, TextFormatFlags.NoPadding | TextFormatFlags.PreserveGraphicsTranslateTransform); + //g.DrawString(txt, Font, br ush,new RectangleF(r.Left+ offset_x, r.Top + 2 + (r.Height - txt_size.Height) / 2,r.Width- offset_x, r.Height),sf); + return txt_size.Width; + } + catch { return 0; } + } + /// + /// Draw the given text and optional image in the "normal" fashion + /// + /// Graphics context to use for drawing + /// Bounds of the cell + /// + /// The string to be drawn + public virtual int DrawText3(Graphics g, Rectangle r, int offset_x, String txt) + { + return DrawText2(g, r, offset_x, txt, GetForegroundColor()); + } + /// + /// + /// + /// + /// 这里的r + /// + /// + /// + /// + /// + public virtual int DrawTextAndBackColor2(Graphics g, Rectangle r, int offset_x, string txt, Color forecolor, Color backcolor) + { + try + { + var txt_size = TextRenderer.MeasureText(g, txt, Font, r.Size, TextFormatFlags.NoPadding | TextFormatFlags.PreserveGraphicsTranslateTransform); + var rect = new Rectangle(r.Left + offset_x, r.Top + 2 + (r.Height - txt_size.Height) / 2, r.Width - offset_x, r.Height); + var rect_back = new Rectangle(r.Left + offset_x, r.Top + 2, txt_size.Width, r.Height - 4); + + g.FillRectangle(new SolidBrush(backcolor), rect_back); + TextRenderer.DrawText(g, txt, Font, rect, forecolor, TextFormatFlags.NoPadding | TextFormatFlags.PreserveGraphicsTranslateTransform); + return txt_size.Width; + } + catch { return 0; } + } + /// /// /// /// @@ -1771,7 +1833,7 @@ namespace BrightIdeasSoftware { { var width_bit = bitmap.Width * bit_height / bitmap.Height; g.DrawImage(bitmap, r.X+ offset_x, r.Y + (r.Height - bit_height) / 2, width_bit, bit_height); - return width_bit + 1; + return width_bit ; } /// /// Print the given text in the given rectangle using only GDI routines @@ -2887,10 +2949,10 @@ namespace BrightIdeasSoftware { #region Configuration Properties /// - /// ǷӦϵͳʽƣ + /// 此栏是否应以系统样式绘制? /// [Category("ObjectListView"), - Description("ǷӦϵͳʽ"), + Description("此栏是否应以系统样式绘制"), DefaultValue(true)] public bool UseStandardBar { get { return useStandardBar; } @@ -2900,10 +2962,10 @@ namespace BrightIdeasSoftware { private bool useStandardBar = true; /// - /// ǵĵԪ߿ʼƶصͼ + /// 将从我们的单元格边框开始绘制多少像素的条形图 /// [Category("ObjectListView"), - Description("ǵĵԪ߿ʼƶصͼ"), + Description("将从我们的单元格边框开始绘制多少像素的条形图"), DefaultValue(2)] public int Padding { get { return padding; } @@ -2913,10 +2975,10 @@ namespace BrightIdeasSoftware { private int padding = 2; /// - ///ڻƽ֮ǰʹʲôɫؼڲ + ///在绘制进度条之前,将使用什么颜色填充控件内部? /// [Category("ObjectListView"), - Description("ͼڲɫ"), + Description("条形图内部的颜色"), DefaultValue(typeof (Color), "AliceBlue")] public Color BackgroundColor { get { return backgroundColor; } @@ -2926,10 +2988,10 @@ namespace BrightIdeasSoftware { private Color backgroundColor = Color.AliceBlue; /// - /// ߿ɫ + /// 进度条边框颜色 /// [Category("ObjectListView"), - Description("߿ɫ"), + Description("进度条边框颜色"), DefaultValue(typeof (Color), "Black")] public Color FrameColor { get { return frameColor; } @@ -2939,10 +3001,10 @@ namespace BrightIdeasSoftware { private Color frameColor = Color.Black; /// - /// ı߿ؿ + /// 进度条的边框像素宽 /// [Category("ObjectListView"), - Description("ı߿ؿ"), + Description("进度条的边框像素宽"), DefaultValue(1.0f)] public float FrameWidth { get { return frameWidth; } @@ -2952,11 +3014,11 @@ namespace BrightIdeasSoftware { private float frameWidth = 1.0f; /// - /// ġ䡱Ӧʲôɫ + /// 进度条的“填充”部分应该是什么颜色? /// - /// GradientStartColorΪColor.Emptyʱʹôѡ + /// 仅当GradientStartColor为Color.Empty时才使用此选项 [Category("ObjectListView"), - Description("ġ䡱Ӧʲôɫ"), + Description("进度条的“填充”部分应该是什么颜色?"), DefaultValue(typeof (Color), "BlueViolet")] public Color FillColor { get { return fillColor; } @@ -2965,11 +3027,11 @@ namespace BrightIdeasSoftware { private Color fillColor = Color.BlueViolet; /// - /// ǷʾıٷֱȽʾ + /// 进度条中是否显示文本百分比进度显示 /// /// [Category("ObjectListView"), - Description("ǷʾıٷֱȽʾ"), + Description("进度条中是否显示文本百分比进度显示"), DefaultValue(typeof(Boolean), "True")] public bool ShowTextPercent { @@ -2979,10 +3041,10 @@ namespace BrightIdeasSoftware { private bool showTextPercent = true; /// - /// ʹýԴɫʼ + /// 使用渐变以此颜色开始填充进度条 /// [Category("ObjectListView"), - Description("ʹýԴɫʼ"), + Description("使用渐变以此颜色开始填充进度条"), DefaultValue(typeof (Color), "CornflowerBlue")] public Color GradientStartColor { get { return startColor; } @@ -2992,10 +3054,10 @@ namespace BrightIdeasSoftware { private Color startColor = Color.CornflowerBlue; /// - /// ʹýԴɫβĽ + /// 使用渐变填充以此颜色结尾的进度条 /// [Category("ObjectListView"), - Description("ʹýԴɫβĽ"), + Description("使用渐变填充以此颜色结尾的进度条"), DefaultValue(typeof (Color), "DarkBlue")] public Color GradientEndColor { get { return endColor; } @@ -3003,10 +3065,10 @@ namespace BrightIdeasSoftware { } private Color endColor = Color.DarkBlue; /// - /// ʹýԴɫʼ佥 + /// 使用渐变以此颜色开始填充渐满进度条 /// [Category("ObjectListView"), - Description("ʹýԴɫʼ佥"), + Description("使用渐变以此颜色开始填充渐满进度条"), DefaultValue(typeof(Color), "CornflowerBlue")] public Color NearGradientStartColor { @@ -3017,10 +3079,10 @@ namespace BrightIdeasSoftware { private Color near_startColor = Color.CornflowerBlue; /// - /// ʹýԴɫβĽ + /// 使用渐变填充以此颜色结尾的渐满进度条 /// [Category("ObjectListView"), - Description("ʹýԴɫβĽ"), + Description("使用渐变填充以此颜色结尾的渐满进度条"), DefaultValue(typeof(Color), "DarkBlue")] public Color NearGradientEndColor { @@ -3030,10 +3092,10 @@ namespace BrightIdeasSoftware { private Color near_endColor = Color.DarkBlue; /// - /// бö + /// 无论列变得多宽,进度条都不会比这个宽。 /// [Category("Behavior"), - Description("Զ"), + Description("进度条永远不会比这个更宽"), DefaultValue(100)] public int MaximumWidth { get { return maximumWidth; } @@ -3043,10 +3105,10 @@ namespace BrightIdeasSoftware { private int maximumWidth = 100; /// - /// ۵Ԫжߣ + /// 无论单元格有多高,进度条都不会比这个高 /// [Category("Behavior"), - Description("Զ"), + Description("进度条永远不会比这个高"), DefaultValue(16)] public int MaximumHeight { get { return maximumHeight; } @@ -3056,10 +3118,10 @@ namespace BrightIdeasSoftware { private int maximumHeight = 16; /// - /// ԤڵСֵСڴֵֵʾһ + /// 预期的最小数据值。小于此值的值将显示一个空条。 /// [Category("Behavior"), - Description("ԤڵСֵСڴֵֵʾһ"), + Description("预期的最小数据值。小于此值的值将显示一个空条。"), DefaultValue(0.0)] public double MinimumValue { get { return minimumValue; } @@ -3068,10 +3130,10 @@ namespace BrightIdeasSoftware { private double minimumValue = 0.0; /// - /// ӽʱֵ,ڸֵʱʾͬɫСڵMinimumValueMaximumValueֵʾδøֵ + /// 接近满时的值,高于该值时,显示不同颜色,小于等于MinimumValue或大于MaximumValue值,则表示未设置该值 /// [Category("Behavior"), - Description("ӽʱֵ,ڸֵʱʾͬɫСڵMinimumValueMaximumValueֵʾδøֵ"), + Description("接近满时的值,高于该值时,显示不同颜色,小于等于MinimumValue或大于MaximumValue值,则表示未设置该值"), DefaultValue(0.0)] public double NearFullValue { @@ -3081,10 +3143,10 @@ namespace BrightIdeasSoftware { private double nearfullValue = 0.0; /// - ///ΧֵڴֵֵһΡ + ///范围的最大值。大于此值的值将给出一个完整的条形。 /// [Category("Behavior"), - Description("ΧֵڴֵֵһΡ"), + Description("范围的最大值。大于此值的值将给出一个完整的条形。"), DefaultValue(100.0)] public double MaximumValue { get { return maximumValue; } @@ -3674,10 +3736,10 @@ namespace BrightIdeasSoftware { } private int imageTextSpace = 4; /// - /// + /// 顶部留白像素 /// [Category("ObjectListView"), - Description(""), + Description("顶部留白像素"), DefaultValue(4)] public int TopSpace { @@ -3870,11 +3932,11 @@ namespace BrightIdeasSoftware { private OLVColumn.ButtonSizingMode sizingMode = OLVColumn.ButtonSizingMode.CellBounds; /// - /// ȡSizingModeΪFixedBoundsʱťĴС + /// 获取或设置SizingMode为FixedBounds时按钮的大小 /// /// If this is not set, the bounds of the cell will be used [Category("ObjectListView"), - Description("SizingModeΪFixedBoundsʱťĴС"), + Description("SizingMode为FixedBounds时按钮的大小"), DefaultValue(null)] public Size? ButtonSize { @@ -3884,10 +3946,10 @@ namespace BrightIdeasSoftware { private Size? buttonSize; /// - /// ȡSizingModeΪTextBoundsʱԪΧĶռ + /// 获取或设置SizingMode为TextBounds时单元格周围的额外空间 /// [Category("ObjectListView"), - Description("SizingModeΪTextBoundsʱΧƵԪĶռ")] + Description("SizingMode为TextBounds时围绕单元格的额外空间")] public Size? ButtonPadding { get { return this.buttonPadding; } @@ -3928,50 +3990,50 @@ namespace BrightIdeasSoftware { } private int minButtonWidth = -1; /// - ///ȡôаťɫ(аťĻ) + ///获取或设置此列按钮的字体颜色(如果有按钮的话) /// [Category("ObjectListView"), - Description("ȡôаťɫ(аťĻ)")] + Description("获取或设置此列按钮的字体颜色(如果有按钮的话)")] public Color ButtonForeColor { get; set; } = Color.White; /// - ///ȡôаťıɫ(аťĻ) + ///获取或设置此列按钮的背景颜色(如果有按钮的话) /// [Category("ObjectListView"), - Description("ȡôаťıɫ(аťĻ)")] + Description("获取或设置此列按钮的背景颜色(如果有按钮的话)")] public Color ButtonBaseColor { get; set; } = Color.Green; /// - ///ȡôаťı߿ɫ(аťĻ) + ///获取或设置此列按钮的边框颜色(如果有按钮的话) /// [Category("ObjectListView"), - Description("ȡôаťı߿ɫ(аťĻ)")] + Description("获取或设置此列按钮的边框颜色(如果有按钮的话)")] public Color ButtonBorderColor { get; set; } = Color.Gray; /// - ///ȡôаťڱ߿ɫ(аťĻ) + ///获取或设置此列按钮的内边框颜色(如果有按钮的话) /// [Category("ObjectListView"), - Description("ȡôаťڱ߿ɫ(аťĻ)")] + Description("获取或设置此列按钮的内边框颜色(如果有按钮的话)")] public Color ButtonInnerBorderColor { get; set; } = Color.Gray; /// - ///ȡôаťǷ񻭱߿(аťĻ) + ///获取或设置此列按钮是否画边框(如果有按钮的话) /// [Category("ObjectListView"), - Description("ȡôаťǷ񻭱߿(аťĻ)")] + Description("获取或设置此列按钮是否画边框(如果有按钮的话)")] public bool ButtonDrawBorder { get; diff --git a/Source/RaUI/UI/Rili/PaDateInput.cs b/Source/RaUI/UI/Rili/PaDateInput.cs index 7185a99..b2bcd81 100644 --- a/Source/RaUI/UI/Rili/PaDateInput.cs +++ b/Source/RaUI/UI/Rili/PaDateInput.cs @@ -214,7 +214,6 @@ namespace RaUI.UI.Rili this.Invalidate(); base.OnMouseDown(e); } - int index = 0; /// /// /// diff --git a/Source/RaUI/UI/Scintilla.NET/Highlight/AutoComplete/ScintillaWrapper.cs b/Source/RaUI/UI/Scintilla.NET/Highlight/AutoComplete/ScintillaWrapper.cs index 3a0fb24..ae5ced6 100644 --- a/Source/RaUI/UI/Scintilla.NET/Highlight/AutoComplete/ScintillaWrapper.cs +++ b/Source/RaUI/UI/Scintilla.NET/Highlight/AutoComplete/ScintillaWrapper.cs @@ -3,128 +3,131 @@ using System.Drawing; using System.Windows.Forms; using ScintillaNETV2; using ScintillaNETV2.AutocompleteMenuNS; -/// -/// -/// -public class ScintillaWrapper : ITextBoxWrapper +namespace ScintillaNETV2.AutocompleteMenuNS { /// /// /// - public ScintillaNETV2.Scintilla target; - /// - /// - /// - /// - public ScintillaWrapper(ScintillaNETV2.Scintilla trgt) + public class ScintillaWrapper : ITextBoxWrapper { - target = trgt; - - //Now add handler for the UpdateUI event. - target.UpdateUI += (sender, args) => + /// + /// + /// + public ScintillaNETV2.Scintilla target; + /// + /// + /// + /// + public ScintillaWrapper(ScintillaNETV2.Scintilla trgt) { - if (args?.Change == UpdateChange.HScroll || args?.Change == UpdateChange.VScroll) + target = trgt; + + //Now add handler for the UpdateUI event. + target.UpdateUI += (sender, args) => { - Scroll?.Invoke(sender, new ScrollEventArgs(ScrollEventType.LargeIncrement, 0)); - } - }; - } - - /// - /// - /// - public bool Readonly - { - get{ return target.ReadOnly; } - } - /// - /// - /// - public string SelectedText - { - get { return target.SelectedText; } - set - { - //Store the start of the selection. - int start = target.SelectionStart; - - //Delete the current text between selections. - target.DeleteRange(target.SelectionStart, (target.SelectionEnd - target.SelectionStart)); - - //Add the text in the same postion. - target.InsertText(start, value); - - //Clear selection and make sure the caret is at the end. - target.SelectionStart = (start + value.Length); - target.SelectionEnd = (start + value.Length); + if (args?.Change == UpdateChange.HScroll || args?.Change == UpdateChange.VScroll) + { + Scroll?.Invoke(sender, new ScrollEventArgs(ScrollEventType.LargeIncrement, 0)); + } + }; } - } - /// - /// - /// - public int SelectionLength - { - get { return (target.SelectionEnd - target.SelectionStart); } - set { target.SelectionEnd = (target.SelectionStart + value); } - } - /// - /// - /// - public int SelectionStart - { - get { return target.SelectionStart; } - set { target.SelectionStart = value; } - } - /// - /// - /// - public Control TargetControl - { - get { return target; } - } - /// - /// - /// - public string Text - { - get { return target.Text; } - } - /// - /// - /// - /// - /// - public Point GetPositionFromCharIndex(int pos) - { - return new Point(target.PointXFromPosition(pos), target.PointYFromPosition(pos)); - } - /// - /// - /// - public virtual event KeyEventHandler KeyDown - { - add { target.KeyDown += value; } - remove { target.KeyDown -= value; } + /// + /// + /// + public bool Readonly + { + get { return target.ReadOnly; } + } + /// + /// + /// + public string SelectedText + { + get { return target.SelectedText; } + set + { + //Store the start of the selection. + int start = target.SelectionStart; + + //Delete the current text between selections. + target.DeleteRange(target.SelectionStart, (target.SelectionEnd - target.SelectionStart)); + + //Add the text in the same postion. + target.InsertText(start, value); + + //Clear selection and make sure the caret is at the end. + target.SelectionStart = (start + value.Length); + target.SelectionEnd = (start + value.Length); + } + } + /// + /// + /// + public int SelectionLength + { + get { return (target.SelectionEnd - target.SelectionStart); } + set { target.SelectionEnd = (target.SelectionStart + value); } + } + /// + /// + /// + public int SelectionStart + { + get { return target.SelectionStart; } + set { target.SelectionStart = value; } + } + /// + /// + /// + public Control TargetControl + { + get { return target; } + } + /// + /// + /// + public string Text + { + get { return target.Text; } + } + /// + /// + /// + /// + /// + public Point GetPositionFromCharIndex(int pos) + { + return new Point(target.PointXFromPosition(pos), target.PointYFromPosition(pos)); + } + + /// + /// + /// + public virtual event KeyEventHandler KeyDown + { + add { target.KeyDown += value; } + remove { target.KeyDown -= value; } + } + /// + /// + /// + public virtual event EventHandler LostFocus + { + add { target.LostFocus += value; } + remove { target.LostFocus -= value; } + } + /// + /// + /// + public virtual event MouseEventHandler MouseDown + { + add { target.MouseDown += value; } + remove { target.MouseDown -= value; } + } + /// + /// + /// + public event ScrollEventHandler Scroll; } - /// - /// - /// - public virtual event EventHandler LostFocus - { - add { target.LostFocus += value; } - remove { target.LostFocus -= value; } - } - /// - /// - /// - public virtual event MouseEventHandler MouseDown - { - add { target.MouseDown += value; } - remove { target.MouseDown -= value; } - } - /// - /// - /// - public event ScrollEventHandler Scroll; } \ No newline at end of file diff --git a/Source/RaUI/UI/Scintilla.NET/Highlight/HighlightEditor.cs b/Source/RaUI/UI/Scintilla.NET/Highlight/HighlightEditor.cs index 57f2307..0df7f82 100644 --- a/Source/RaUI/UI/Scintilla.NET/Highlight/HighlightEditor.cs +++ b/Source/RaUI/UI/Scintilla.NET/Highlight/HighlightEditor.cs @@ -49,7 +49,7 @@ namespace ScintillaNETV2.Highlight { Scintilla = Editor }; - AutoComplete.TargetControlWrapper = new ScintillaWrapper(Editor); + AutoComplete.TargetControlWrapper = new AutocompleteMenuNS.ScintillaWrapper(Editor); Editor.DoubleClick += Editor_DoubleClick; var ind_17= Editor.Indicators[17]; ind_17.ForeColor = Color.FromArgb(232, 232, 255); diff --git a/Source/RaUI/UI/SuperTabControl/ChromeTabControl.cs b/Source/RaUI/UI/SuperTabControl/ChromeTabControl.cs index 8248fa1..6c85220 100644 --- a/Source/RaUI/UI/SuperTabControl/ChromeTabControl.cs +++ b/Source/RaUI/UI/SuperTabControl/ChromeTabControl.cs @@ -511,8 +511,7 @@ namespace ryControls ControlStyles.UserMouse, true); tabCollection = new CustomTabPageCollection(this); this.ItemSize = new Size(TabMaxWidth, 25); - this.SizeMode = System.Windows.Forms.TabSizeMode.Fixed; - //this.AllowDrop = true; + base.SizeMode = System.Windows.Forms.TabSizeMode.Fixed; //从资源文件(嵌入到程序集)里读取图片 @@ -520,6 +519,15 @@ namespace ryControls close_normalImage = Resources.tab_close_normal; } /// + /// 获取或设置调整控件的选项卡大小的方式。 + /// + [Description("获取或设置调整控件的选项卡大小的方式。"),DefaultValue(typeof(TabSizeMode), "Fixed")] + public new TabSizeMode SizeMode + { + get { return base.SizeMode; } + set { base.SizeMode = value; } + } + /// /// /// ~ChromeTabControl() @@ -811,7 +819,19 @@ namespace ryControls /// private int GetTabTotalWidth() { - return this.ItemSize.Width * this.TabCount; + if (this.SizeMode == System.Windows.Forms.TabSizeMode.Fixed) + { + return this.ItemSize.Width * this.TabCount; + } + else + { + var total_width = 0; + for (int i = 0; i < this.TabCount; i++) + { + total_width += GetTabRect(i).Width; + } + return total_width; + } } /// /// diff --git a/Source/RaUI/UI/TreeXML/ComboBoxEx.cs b/Source/RaUI/UI/TreeXML/ComboBoxEx.cs index 89bb564..fd57c3f 100644 --- a/Source/RaUI/UI/TreeXML/ComboBoxEx.cs +++ b/Source/RaUI/UI/TreeXML/ComboBoxEx.cs @@ -29,6 +29,7 @@ namespace ryControls //ItemHeight = 50; DrawItem += OnDrawItem; } + private void OnDrawItem(object sender, DrawItemEventArgs e) { if (e.Index < 0) { return; } @@ -66,6 +67,18 @@ namespace ryControls //文本内容显示区域 textRect = new Rectangle(imgRect.Right + 2, imgRect.Y, e.Bounds.Width - imgRect.Width, e.Bounds.Height - 2); break; + case ComboPopupItem item2: + Image img2 = item2.Image; + //图片绘制的区域 + Rectangle imgRect2 = new Rectangle(6, e.Bounds.Y + 3, 16, 16); + e.Graphics.SmoothingMode = SmoothingMode.HighQuality; + e.Graphics.CompositingQuality = CompositingQuality.HighQuality; + e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor; + e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; + e.Graphics.DrawImage(img2, imgRect2); + //文本内容显示区域 + textRect = new Rectangle(imgRect2.Right + 2, imgRect2.Y, e.Bounds.Width - imgRect2.Width, e.Bounds.Height - 2); + break; } //获得项文本内容,绘制文本 string itemText = this.Items[e.Index].ToString(); diff --git a/Source/SkinPreview/FrmTab2.Designer.cs b/Source/SkinPreview/FrmTab2.Designer.cs index 240e7a4..6255155 100644 --- a/Source/SkinPreview/FrmTab2.Designer.cs +++ b/Source/SkinPreview/FrmTab2.Designer.cs @@ -28,6 +28,12 @@ /// private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + this.CbbOpState = new ryControls.RyComboBox(); + this.htmlPanel1 = new TheArtOfDev.HtmlRenderer.WinForms.HtmlPanel(); + this.ryComboBox1 = new ryControls.RyComboBox(); + this.comboBoxEx2 = new ryControls.ComboBoxEx(); + this.comboBoxEx21 = new ryControls.ComboBoxEx2(); this.ctlMyPage1 = new MyPage.ctlMyPage(); this.textBoxEx21 = new ryControls.TextBoxEx2(); this.numericUpDownEx1 = new ryControls.NumericUpDownEx(); @@ -37,9 +43,87 @@ ((System.ComponentModel.ISupportInitialize)(this.numericUpDownEx1)).BeginInit(); this.SuspendLayout(); // + // CbbOpState + // + this.CbbOpState.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; + this.CbbOpState.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.CbbOpState.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.CbbOpState.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.CbbOpState.FormattingEnabled = true; + this.CbbOpState.ItemHeight = 24; + this.CbbOpState.Items.AddRange(new object[] { + "全部流程", + "未完成流程", + "已完成流程"}); + this.CbbOpState.Location = new System.Drawing.Point(392, 285); + this.CbbOpState.MaxUndoRedoSteps = 50; + this.CbbOpState.Name = "CbbOpState"; + this.CbbOpState.Size = new System.Drawing.Size(121, 30); + this.CbbOpState.TabIndex = 43; + // + // htmlPanel1 + // + this.htmlPanel1.AutoScroll = true; + this.htmlPanel1.AutoScrollMinSize = new System.Drawing.Size(309, 20); + this.htmlPanel1.BackColor = System.Drawing.SystemColors.Window; + this.htmlPanel1.BaseStylesheet = null; + this.htmlPanel1.Location = new System.Drawing.Point(117, 256); + this.htmlPanel1.Name = "htmlPanel1"; + this.htmlPanel1.Size = new System.Drawing.Size(309, 71); + this.htmlPanel1.TabIndex = 16; + this.htmlPanel1.Text = "htmlPanel1"; + // + // ryComboBox1 + // + this.ryComboBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; + this.ryComboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.ryComboBox1.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.ryComboBox1.FormattingEnabled = true; + this.ryComboBox1.ItemHeight = 24; + this.ryComboBox1.Items.AddRange(new object[] { + "XXXCDS", + "ADDD"}); + this.ryComboBox1.Location = new System.Drawing.Point(303, 205); + this.ryComboBox1.MaxUndoRedoSteps = 50; + this.ryComboBox1.Name = "ryComboBox1"; + this.ryComboBox1.Size = new System.Drawing.Size(156, 30); + this.ryComboBox1.TabIndex = 15; + // + // comboBoxEx2 + // + this.comboBoxEx2.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; + this.comboBoxEx2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxEx2.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.comboBoxEx2.FormattingEnabled = true; + this.comboBoxEx2.Items.AddRange(new object[] { + "ddd", + "大大方方"}); + this.comboBoxEx2.Location = new System.Drawing.Point(27, 216); + this.comboBoxEx2.Name = "comboBoxEx2"; + this.comboBoxEx2.Size = new System.Drawing.Size(203, 22); + this.comboBoxEx2.TabIndex = 14; + // + // comboBoxEx21 + // + this.comboBoxEx21.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(236)))), ((int)(((byte)(239)))), ((int)(((byte)(244))))); + this.comboBoxEx21.ButtonRoundBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(236)))), ((int)(((byte)(239)))), ((int)(((byte)(244))))); + this.comboBoxEx21.EmptyText = ""; + this.comboBoxEx21.Location = new System.Drawing.Point(48, 177); + this.comboBoxEx21.MaxPopupHeight = 0; + this.comboBoxEx21.MaxPopupWidth = 0; + this.comboBoxEx21.Name = "comboBoxEx21"; + this.comboBoxEx21.SelectedIndex = -1; + this.comboBoxEx21.SelectedItem = null; + this.comboBoxEx21.Size = new System.Drawing.Size(168, 31); + this.comboBoxEx21.TabIndex = 13; + this.comboBoxEx21.ToolTipText = ""; + // // ctlMyPage1 // + this.ctlMyPage1.CountSQL = ""; + this.ctlMyPage1.db = null; this.ctlMyPage1.Location = new System.Drawing.Point(260, 140); + this.ctlMyPage1.Multithreading = false; this.ctlMyPage1.Name = "ctlMyPage1"; this.ctlMyPage1.PageSize = 50; this.ctlMyPage1.RecordCount = 0; @@ -60,7 +144,9 @@ this.textBoxEx21.BackColor = System.Drawing.Color.White; this.textBoxEx21.EmptyText = ""; this.textBoxEx21.Location = new System.Drawing.Point(260, 107); + this.textBoxEx21.LongTime = 2000; this.textBoxEx21.MaxLength = 999999999; + this.textBoxEx21.MaxUndoRedoSteps = 50; this.textBoxEx21.Multiline = false; this.textBoxEx21.Name = "textBoxEx21"; this.textBoxEx21.OnlyNumeric = false; @@ -125,6 +211,11 @@ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(700, 472); + this.Controls.Add(this.CbbOpState); + this.Controls.Add(this.htmlPanel1); + this.Controls.Add(this.ryComboBox1); + this.Controls.Add(this.comboBoxEx2); + this.Controls.Add(this.comboBoxEx21); this.Controls.Add(this.ctlMyPage1); this.Controls.Add(this.textBoxEx21); this.Controls.Add(this.numericUpDownEx1); @@ -146,5 +237,10 @@ private ryControls.PanelEx panelEx1; private ryControls.ComboBoxEx comboBoxEx1; private ryControls.DateTimePickerEX dateTimePickerEX1; + private ryControls.ComboBoxEx2 comboBoxEx21; + private ryControls.ComboBoxEx comboBoxEx2; + private ryControls.RyComboBox ryComboBox1; + private TheArtOfDev.HtmlRenderer.WinForms.HtmlPanel htmlPanel1; + private ryControls.RyComboBox CbbOpState; } } \ No newline at end of file diff --git a/Source/SkinPreview/FrmTab2.cs b/Source/SkinPreview/FrmTab2.cs index b35f4f9..46151aa 100644 --- a/Source/SkinPreview/FrmTab2.cs +++ b/Source/SkinPreview/FrmTab2.cs @@ -15,6 +15,7 @@ namespace SkinPreview public FrmTab2() { InitializeComponent(); + //htmlPanel1. } } } diff --git a/Source/rycUpdate/BigFileOp.cs b/Source/rycUpdate/BigFileOp.cs index 781d3b1..679d987 100644 --- a/Source/rycUpdate/BigFileOp.cs +++ b/Source/rycUpdate/BigFileOp.cs @@ -71,17 +71,33 @@ namespace ryCommon /// /// 大文件按流复制文件,支持自动创建目标文件夹。 true:复制成功 false:复制失败 /// - /// 原始文件路径 + /// 原始文件路径 /// 复制目标文件路径 /// 携带的参数(可选) /// - public bool CopyBigFile(string soucrePath, string targetPath,object Tag=null) + public bool CopyBigFile(string sourcePath, string targetPath,object Tag=null) { try { + if(SkipSameFiles) + { + if (System.IO.File.Exists(targetPath)) + { + try + { + var target_info = new System.IO.FileInfo(targetPath); + var source_info = new System.IO.FileInfo(sourcePath); + if (target_info.Length == source_info.Length && target_info.LastWriteTimeUtc == source_info.LastWriteTimeUtc) + { + return true; + } + } + catch { } + } + } var TranSize = 1024 * 1024 * 2;//每次读取2M //读取复制文件流 - using (FileStream fsRead = new FileStream(soucrePath, FileMode.Open, FileAccess.Read)) + using (FileStream fsRead = new FileStream(sourcePath, FileMode.Open, FileAccess.Read)) { if (System.IO.File.Exists(targetPath)) { @@ -149,6 +165,14 @@ namespace ryCommon { return false; } + try + { + var source_info = new System.IO.FileInfo(sourcePath); + var target_info = new System.IO.FileInfo(targetPath); + target_info.LastWriteTime = source_info.LastWriteTime; + target_info.CreationTime = source_info.CreationTime; + } + catch{ } } return true; } @@ -217,6 +241,10 @@ namespace ryCommon catch { } } } + /// + /// 是否跳过相同文件,默认不跳过(根据文件大小和修改时间来判断) + /// + public bool SkipSameFiles { get; set; } = false; public readonly List ErrFilesList = new List(); /// /// 复制文件夹到目标文件夹,支持中途取消 @@ -234,7 +262,7 @@ namespace ryCommon var error = 0; Copy(fromDir, ToDir); Count = _count; - return error; + return -error; int Copy(string From_Dir, string To_Dir) { var _fromDir = From_Dir.TrimEnd('\\'); @@ -270,14 +298,6 @@ namespace ryCommon OnCanel?.Invoke(this, e1); if (e1.Cancel) { break; } } - if (result > 0) - { - error++; - } - else if (result < 0) - { - error += -result; - } } return -error; } diff --git a/Source/rycUpdate/Frmmain.cs b/Source/rycUpdate/Frmmain.cs index 683d2a1..b889219 100644 --- a/Source/rycUpdate/Frmmain.cs +++ b/Source/rycUpdate/Frmmain.cs @@ -302,6 +302,7 @@ namespace rycUpdate var UpdateZipPath = Application.StartupPath + "\\Update\\tmp.tmp"; var UnZipFolder = Application.StartupPath + "\\Update\\tmp"; BigFileOp bigFileOp = new BigFileOp(); + bigFileOp.SkipSameFiles = false; bigFileOp.OnFolderProgress += BigFileOp_OnFolderProgress; //this.Invoke(new Action(() => //{ @@ -364,7 +365,27 @@ namespace rycUpdate } error_id = 1003; error_msg = System.IO.Path.GetDirectoryName(UnZipFolder + "\\" + entry.FullName.Replace("/", "\\")); - entry.ExtractToFile(UnZipFolder + "\\" + entry.FullName.Replace("/", "\\"), true); + var is_same = false; + try + { + if (bigFileOp.SkipSameFiles) + { + var topath = Application.StartupPath + "\\" + entry.FullName.Replace("/", "\\").Trim('\\'); + if (System.IO.File.Exists(topath)) + { + var info = new +.IO.FileInfo(topath); + if (info.Length == entry.Length && info.LastWriteTime == entry.LastWriteTime) + { + is_same = true; + } + } + } + } + catch { } + if (!is_same) + { + entry.ExtractToFile(UnZipFolder + "\\" + entry.FullName.Replace("/", "\\"), true); + } this.Invoke(new Action(() => { progressBar1.Value = i+1; @@ -418,6 +439,7 @@ namespace rycUpdate } KillMultiProcess(list_proc); EndProcessByFolder(Application.StartupPath); + Thread.Sleep(1000); #endregion ShowState("正在更新文件..."); this.Invoke(new Action(() =>