### 2021-07-01更新

------
#### ryControlsV4    V3.0.2107.0101
- *.[新增]新增Sheng.Winform.Controls部分控件。

#### RyWeb    V3.0.2107.0101
- *.[新增]QuickWeb新增引用页设置。
#### MyDbV4    V3.0.2107.0101
- *.[新增]支持忽略大小写的替换功能。
This commit is contained in:
鑫Intel 2021-07-04 09:41:15 +08:00
parent 870234f406
commit 8b41f58f5c
156 changed files with 25786 additions and 492 deletions

View File

@ -982,6 +982,16 @@
<param name="replacement"></param>
<returns></returns>
</member>
<member name="M:ryCommon.Strings.Replace(System.String,System.String,System.String,System.Boolean)">
<summary>
支持忽略大小写的替换功能
</summary>
<param name="str"></param>
<param name="oldValue"></param>
<param name="newValue"></param>
<param name="IgnoreCase">是否忽略大小写</param>
<returns></returns>
</member>
<member name="M:ryCommon.Strings.GetMatchStr(System.String,System.String,System.Boolean)">
<summary>
获取匹配的内容
@ -1065,6 +1075,16 @@
<param name="isLike">是否是通配符表达式,不是,则普通替换,忽略大小写,是,则启用通配符替换</param>
<returns></returns>
</member>
<member name="M:ryCommon.VarExtension.Replace(System.String,System.String,System.String,System.Boolean)">
<summary>
支持忽略大小写的替换文本功能
</summary>
<param name="original"></param>
<param name="oldValue"></param>
<param name="newValue"></param>
<param name="IgnoreCase">是否忽略大小写</param>
<returns></returns>
</member>
<member name="M:ryCommon.VarExtension.GetMatchStr(System.String,System.String,System.Boolean)">
<summary>
获取符合要求的第一个结果

View File

@ -472,6 +472,11 @@
</summary>
</member>
<member name="P:RyWeb.QuickWeb.Referer">
<summary>
</summary>
</member>
<member name="P:RyWeb.QuickWeb.Timeout">
<summary>

View File

@ -1,2 +1,2 @@
[Money_Op]
hwnd=263848
hwnd=1707890

View File

@ -1,4 +1,4 @@
<root>
<list id="LastUpdateTime" Value="2021/6/13 23:15:28" />
<list id="LastUpdateTime" Value="2021/6/15 16:23:02" />
<list id="UpdateAfterTime" Value="0" />
</root>

File diff suppressed because it is too large Load Diff

View File

@ -982,6 +982,16 @@
<param name="replacement"></param>
<returns></returns>
</member>
<member name="M:ryCommon.Strings.Replace(System.String,System.String,System.String,System.Boolean)">
<summary>
支持忽略大小写的替换功能
</summary>
<param name="str"></param>
<param name="oldValue"></param>
<param name="newValue"></param>
<param name="IgnoreCase">是否忽略大小写</param>
<returns></returns>
</member>
<member name="M:ryCommon.Strings.GetMatchStr(System.String,System.String,System.Boolean)">
<summary>
获取匹配的内容
@ -1065,6 +1075,16 @@
<param name="isLike">是否是通配符表达式,不是,则普通替换,忽略大小写,是,则启用通配符替换</param>
<returns></returns>
</member>
<member name="M:ryCommon.VarExtension.Replace(System.String,System.String,System.String,System.Boolean)">
<summary>
支持忽略大小写的替换文本功能
</summary>
<param name="original"></param>
<param name="oldValue"></param>
<param name="newValue"></param>
<param name="IgnoreCase">是否忽略大小写</param>
<returns></returns>
</member>
<member name="M:ryCommon.VarExtension.GetMatchStr(System.String,System.String,System.Boolean)">
<summary>
获取符合要求的第一个结果

View File

@ -472,6 +472,11 @@
</summary>
</member>
<member name="P:RyWeb.QuickWeb.Referer">
<summary>
</summary>
</member>
<member name="P:RyWeb.QuickWeb.Timeout">
<summary>

File diff suppressed because it is too large Load Diff

View File

@ -982,6 +982,16 @@
<param name="replacement"></param>
<returns></returns>
</member>
<member name="M:ryCommon.Strings.Replace(System.String,System.String,System.String,System.Boolean)">
<summary>
支持忽略大小写的替换功能
</summary>
<param name="str"></param>
<param name="oldValue"></param>
<param name="newValue"></param>
<param name="IgnoreCase">是否忽略大小写</param>
<returns></returns>
</member>
<member name="M:ryCommon.Strings.GetMatchStr(System.String,System.String,System.Boolean)">
<summary>
获取匹配的内容
@ -1065,6 +1075,16 @@
<param name="isLike">是否是通配符表达式,不是,则普通替换,忽略大小写,是,则启用通配符替换</param>
<returns></returns>
</member>
<member name="M:ryCommon.VarExtension.Replace(System.String,System.String,System.String,System.Boolean)">
<summary>
支持忽略大小写的替换文本功能
</summary>
<param name="original"></param>
<param name="oldValue"></param>
<param name="newValue"></param>
<param name="IgnoreCase">是否忽略大小写</param>
<returns></returns>
</member>
<member name="M:ryCommon.VarExtension.GetMatchStr(System.String,System.String,System.Boolean)">
<summary>
获取符合要求的第一个结果

View File

@ -472,6 +472,11 @@
</summary>
</member>
<member name="P:RyWeb.QuickWeb.Referer">
<summary>
</summary>
</member>
<member name="P:RyWeb.QuickWeb.Timeout">
<summary>

File diff suppressed because it is too large Load Diff

View File

@ -982,6 +982,16 @@
<param name="replacement"></param>
<returns></returns>
</member>
<member name="M:ryCommon.Strings.Replace(System.String,System.String,System.String,System.Boolean)">
<summary>
支持忽略大小写的替换功能
</summary>
<param name="str"></param>
<param name="oldValue"></param>
<param name="newValue"></param>
<param name="IgnoreCase">是否忽略大小写</param>
<returns></returns>
</member>
<member name="M:ryCommon.Strings.GetMatchStr(System.String,System.String,System.Boolean)">
<summary>
获取匹配的内容
@ -1065,6 +1075,16 @@
<param name="isLike">是否是通配符表达式,不是,则普通替换,忽略大小写,是,则启用通配符替换</param>
<returns></returns>
</member>
<member name="M:ryCommon.VarExtension.Replace(System.String,System.String,System.String,System.Boolean)">
<summary>
支持忽略大小写的替换文本功能
</summary>
<param name="original"></param>
<param name="oldValue"></param>
<param name="newValue"></param>
<param name="IgnoreCase">是否忽略大小写</param>
<returns></returns>
</member>
<member name="M:ryCommon.VarExtension.GetMatchStr(System.String,System.String,System.Boolean)">
<summary>
获取符合要求的第一个结果

View File

@ -472,6 +472,11 @@
</summary>
</member>
<member name="P:RyWeb.QuickWeb.Referer">
<summary>
</summary>
</member>
<member name="P:RyWeb.QuickWeb.Timeout">
<summary>

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,17 @@
### 2021-06-13更新
### 2021-07-01更新
------
#### ryControlsV4 V3.0.2107.0101
- *.[新增]新增Sheng.Winform.Controls部分控件。
#### RyWeb V3.0.2107.0101
- *.[新增]QuickWeb新增引用页设置。
#### MyDbV4 V3.0.2107.0101
- *.[新增]支持忽略大小写的替换功能。
### 2021-06-13更新
------
#### ryControls V2.1.2106.1301
@ -17,6 +30,10 @@
#### ryControls V2.1.2104.0201
- *.[修复]修复在win7上Gdu.WinformUI会报错的BUG。
ryControls V2.1.2104.0201
- *.[修复]修复在win7上Gdu.WinformUI会报错的BUG。
### 2021-03-13更新
------
#### ryControls V2.1.2103.1301

View File

@ -1,4 +1,4 @@
namespace Itrycn_Project.DbOp
namespace Itrycn_Project2.DbOp
{
partial class FrmAdd
{

View File

@ -9,7 +9,7 @@ using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Itrycn_Project.DbOp
namespace Itrycn_Project2.DbOp
{
public partial class FrmAdd : Form
{

View File

@ -9,7 +9,7 @@ using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Itrycn_Project.DbOp
namespace Itrycn_Project2.DbOp
{
public partial class FrmView : Form
{

View File

@ -1,4 +1,4 @@
namespace Itrycn_Project.DbOp
namespace Itrycn_Project2.DbOp
{
partial class FrmView
{

View File

@ -1,4 +1,4 @@
namespace Itrycn_Project
namespace Itrycn_Project2
{
partial class FrmAbout
{

View File

@ -7,7 +7,7 @@ using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Itrycn_Project
namespace Itrycn_Project2
{
public partial class FrmAbout : Form
{

View File

@ -7,7 +7,7 @@ using System.Text;
using System.Windows.Forms;
using static ryCommonDb.DataProvider;
namespace Itrycn_Project
namespace Itrycn_Project2
{
/// <summary>
/// 配置类(本系统基于乘黄V1架构)

View File

@ -4,7 +4,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace Itrycn_Project
namespace Itrycn_Project2
{
static class Program
{

View File

@ -8,7 +8,7 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace Itrycn_Project.Properties {
namespace Itrycn_Project2.Properties {
using System;

View File

@ -8,7 +8,7 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace Itrycn_Project.Properties
namespace Itrycn_Project2.Properties
{

View File

@ -1,4 +1,4 @@
using Itrycn_Project;
using Itrycn_Project2;
using ryCommon;
using RyHardWare;
using System;

View File

@ -1,4 +1,4 @@
namespace Itrycn_Project
namespace Itrycn_Project2
{
partial class FrmSetting
{

View File

@ -7,7 +7,7 @@ using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Itrycn_Project
namespace Itrycn_Project2
{
public partial class FrmSetting : Form
{

View File

@ -113,7 +113,7 @@
// picExpand
//
this.picExpand.Cursor = System.Windows.Forms.Cursors.Hand;
this.picExpand.Image = global::Itrycn_Project.Properties.Resources.closetree;
this.picExpand.Image = global::Itrycn_Project2.Properties.Resources.closetree;
this.picExpand.Location = new System.Drawing.Point(187, 247);
this.picExpand.Name = "picExpand";
this.picExpand.Size = new System.Drawing.Size(10, 49);

View File

@ -1,4 +1,4 @@
using Itrycn_Project;
using Itrycn_Project2;
using ryCommon;
using System;
using System.Collections.Generic;
@ -179,7 +179,7 @@ namespace Itrycn
{
if (isExpand)
{
picExpand.Image = Itrycn_Project.Properties.Resources.opentree;
picExpand.Image = Itrycn_Project2.Properties.Resources.opentree;
toolTip1.SetToolTip(picExpand,"展开列表");
treeView1.Visible = false;
picExpand.Left = 0;
@ -187,7 +187,7 @@ namespace Itrycn
}
else
{
picExpand.Image = Itrycn_Project.Properties.Resources.closetree;
picExpand.Image = Itrycn_Project2.Properties.Resources.closetree;
toolTip1.SetToolTip(picExpand, "关闭列表");
treeView1.Visible = true;
picExpand.Left = treeView1.Left + treeView1.Width + 1;

View File

@ -7,7 +7,7 @@ using System.Linq;
using System.Text;
using static ryCommonDb.DataProvider;
namespace Itrycn_Project
namespace Itrycn_Project2
{
public static class Itrycn_Db
{

View File

@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Itrycn_Project
namespace Itrycn_Project2
{
/// <summary>
/// 配置类,保存在文件中的配置信息(本系统基于乘黄V2架构)

View File

@ -5,7 +5,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Itrycn_Project
namespace Itrycn_Project2
{
/// <summary>
/// 运行期间存储的变量,不会存储在文件中,只存储内存中.每次启动软件会初始化变量。

View File

@ -1,4 +1,4 @@
namespace Itrycn_Project.DbOp
namespace Itrycn_Project2.DbOp
{
partial class FrmAdd
{

View File

@ -9,7 +9,7 @@ using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Itrycn_Project.DbOp
namespace Itrycn_Project2.DbOp
{
public partial class FrmAdd : RySkins.SKinForm
{

View File

@ -1,182 +1,204 @@
using ryCommon;
using ryCommonDb;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Itrycn_Project.DbOp
{
public partial class FrmView : RySkins.SKinForm
{
string orderSQL = "order by addTime desc";
string tableName = "MainTable1";
string titleName = "数据";
public FrmView()
{
InitializeComponent();
OlvName.AspectGetter = delegate (object x) { return ((ViewInfo)x).Name; };
OlvAddTime.AspectGetter = delegate (object x) { return ((ViewInfo)x).AddTimeStr; };
}
#region
private void RySearch1_OnSearch(object sender, EventArgs e)
{
//需要修改此处
//LoadDb("(" + TableProject.name + " like @SearchText or " + TableProject.des + " like @SearchText)");
}
private void CtlMyPage1_OnPageChange(object sender, EventArgs e)
{
#region
LvCbResult.ClearObjects();
DataProvider mydb = new DataProvider();
IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType);
List<ViewInfo> list = new List<ViewInfo>();
if (db.ConnDb(Itrycn_Db.SQLConnStr) == 1)
{
DataSet ds = db.ReadData(ctlMyPage1.GetSQLText, ctlMyPage1.T_Parameters);
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
DataRow row = ds.Tables[0].Rows[i];
using ryCommon;
using ryCommonDb;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Itrycn_Project2.DbOp
{
public partial class FrmView : RySkins.SKinForm
{
string orderSQL = "order by addTime desc";
string tableName = "MainTable1";
string titleName = "数据";
public FrmView()
{
InitializeComponent();
OlvName.AspectGetter = delegate (object x) { return ((ViewInfo)x).Name; };
OlvAddTime.AspectGetter = delegate (object x) { return ((ViewInfo)x).AddTimeStr; };
}
#region
private void RySearch1_OnSearch(object sender, EventArgs e)
{
//需要修改此处
//LoadDb("(" + TableProject.name + " like @SearchText or " + TableProject.des + " like @SearchText)");
}
private void CtlMyPage1_OnPageChange(object sender, EventArgs e)
{
#region
LvCbResult.ClearObjects();
DataProvider mydb = new DataProvider();
IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType);
List<ViewInfo> list = new List<ViewInfo>();
if (db.ConnDb(Itrycn_Db.SQLConnStr) == 1)
{
DataSet ds = db.ReadData(ctlMyPage1.GetSQLText, ctlMyPage1.T_Parameters);
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
DataRow row = ds.Tables[0].Rows[i];
list.Add(new ViewInfo()
{
Id=row["id"].ToInt(),
Name = row["Name"].ToString(),
AddTime = row["AddTime"].ToDateTime()
}) ;
}
}
db.Free();
LvCbResult.AddObjects(list);
#endregion
}
private void GetRow(int id, int index)
{
#region
DataProvider mydb = new DataProvider();
IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType);
if (db.ConnDb(Itrycn_Db.SQLConnStr) == 1)
{
DataSet ds = db.ReadData("select * from " + tableName + " where id=" + id);
if (mydb.HaveData(ds))
{
DataRow row = ds.Tables[0].Rows[0];
var item=(ViewInfo) LvCbResult.GetModelObject(index);
item.Name = row["Name"].ToString();
//添加剩余的项目
//添加完毕
LvCbResult.UpdateObject(item);
}
}
db.Free();
#endregion
}
#endregion
public void LoadDb(string whereSQL)
{
string _whereSQL = whereSQL;
DataProvider mydb = new DataProvider();
IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType);
if (db.ConnDb(Itrycn_Db.SQLConnStr) == 1)
{
#region
db.AddParameter("SearchText", "%" + rySearch1.Text + "%");
ctlMyPage1.RecordCount = db.GetCount(tableName, _whereSQL);
ctlMyPage1.T_Parameters = db.GetParameter();
ctlMyPage1.SQLText= db.GetPageSQL(tableName, _whereSQL, orderSQL);
ctlMyPage1.SQLText2 = db.GetPageSQL2(tableName, _whereSQL, orderSQL);
ctlMyPage1.GotoPageIndex(1);
#endregion
}
db.Free();
}
private void BtnAdd_Click(object sender, EventArgs e)
{
FrmAdd frm = new FrmAdd()
{
Text = "添加"+ titleName,
Icon = Icon,
isAdd = 1
};
frm.mr = new ModalForm(this, frm);
frm.mr.OnDialogResult += new ModalForm.DialogResultHandler((object t, DialogResult dg) => {
if (dg == DialogResult.OK)
{
rySearch1.PerformClick();
}
});
frm.mr.ShowModal();
}
private void BtnEdit_Click(object sender, EventArgs e)
{
if (LvCbResult.SelectedObject == null) { return; }
var item = (ViewInfo)LvCbResult.SelectedObject;
var selectId = item.Id;
FrmAdd frm = new FrmAdd()
{
Text = "修改"+ titleName,
Icon = Icon,
isAdd = 0
};
frm.GetInfo(selectId.ToString());
frm.mr = new ModalForm(this, frm);
frm.mr.OnDialogResult += new ModalForm.DialogResultHandler((object t, DialogResult dg) => {
if (dg == DialogResult.OK)
{
GetRow(selectId, LvCbResult.SelectedIndex);
}
});
frm.mr.ShowModal();
}
private void BtnDel_Click(object sender, EventArgs e)
Name = row["Name"].ToString(),
AddTime = row["AddTime"].ToDateTime()
}) ;
}
}
db.Free();
LvCbResult.AddObjects(list);
#endregion
}
private void GetRow(int id, int index)
{
if (LvCbResult.SelectedObject == null) { MessageBox.Show("请先选择要删除的项。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; }
var item = (ViewInfo)LvCbResult.SelectedObject;
var selectId = item.Id;
if (RySkins.Msg.ShowMsg("确定要删除该项吗?一旦删除将不可恢复。", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.No)
{
return;
}
//DataProvider mydb = new DataProvider();
IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType);
if (db.ConnDb(Itrycn_Db.SQLConnStr) == 1)
{
db.DelById(tableName, selectId.ToString());
LvCbResult.RemoveObject(item);
}
}
private void FrmView_Load(object sender, EventArgs e)
{
Text = "浏览"+ titleName;
ToolStripMenuItem.Text = "添加"+ titleName;
ToolStripMenuItem.Text = "修改" + titleName;
ToolStripMenuItem.Text = "删除" + titleName;
rySearch1.PerformClick();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
btnAdd.PerformClick();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
btnEdit.PerformClick();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
btnDel.PerformClick();
}
}
#region
DataProvider mydb = new DataProvider();
IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType);
if (db.ConnDb(Itrycn_Db.SQLConnStr) == 1)
{
DataSet ds = db.ReadData("select * from " + tableName + " where id=" + id);
if (mydb.HaveData(ds))
{
DataRow row = ds.Tables[0].Rows[0];
var item=(ViewInfo) LvCbResult.GetModelObject(index);
item.Name = row["Name"].ToString();
//添加剩余的项目
//添加完毕
LvCbResult.UpdateObject(item);
}
}
db.Free();
#endregion
}
#endregion
public void LoadDb(string whereSQL)
{
string _whereSQL = whereSQL;
DataProvider mydb = new DataProvider();
IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType);
if (db.ConnDb(Itrycn_Db.SQLConnStr) == 1)
{
#region
db.AddParameter("SearchText", "%" + rySearch1.Text + "%");
ctlMyPage1.RecordCount = db.GetCount(tableName, _whereSQL);
ctlMyPage1.T_Parameters = db.GetParameter();
ctlMyPage1.SQLText= db.GetPageSQL(tableName, _whereSQL, orderSQL);
ctlMyPage1.SQLText2 = db.GetPageSQL2(tableName, _whereSQL, orderSQL);
ctlMyPage1.GotoPageIndex(1);
#endregion
}
db.Free();
}
private void BtnAdd_Click(object sender, EventArgs e)
{
FrmAdd frm = new FrmAdd()
{
Text = "添加"+ titleName,
Icon = Icon,
isAdd = 1
};
frm.mr = new ModalForm(this, frm);
frm.mr.OnDialogResult += new ModalForm.DialogResultHandler((object t, DialogResult dg) => {
if (dg == DialogResult.OK)
{
rySearch1.PerformClick();
}
});
frm.mr.ShowModal();
}
private void BtnEdit_Click(object sender, EventArgs e)
{
if (LvCbResult.SelectedObject == null) { return; }
var item = (ViewInfo)LvCbResult.SelectedObject;
var selectId = item.Id;
FrmAdd frm = new FrmAdd()
{
Text = "修改"+ titleName,
Icon = Icon,
isAdd = 0
};
frm.GetInfo(selectId.ToString());
frm.mr = new ModalForm(this, frm);
frm.mr.OnDialogResult += new ModalForm.DialogResultHandler((object t, DialogResult dg) => {
if (dg == DialogResult.OK)
{
GetRow(selectId, LvCbResult.SelectedIndex);
}
});
frm.mr.ShowModal();
}
private void BtnDel_Click(object sender, EventArgs e)
{
if (LvCbResult.SelectedObject == null) { MessageBox.Show("请先选择要删除的项。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; }
var item = (ViewInfo)LvCbResult.SelectedObject;
var selectId = item.Id;
if (RySkins.Msg.ShowMsg("确定要删除该项吗?一旦删除将不可恢复。", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.No)
{
return;
}
//DataProvider mydb = new DataProvider();
IDbInterface db = Itrycn_Db.CreateDataProvider(Itrycn_Db.dataType);
if (db.ConnDb(Itrycn_Db.SQLConnStr) == 1)
{
db.DelById(tableName, selectId.ToString());
LvCbResult.RemoveObject(item);
}
}
private void FrmView_Load(object sender, EventArgs e)
{
Text = "浏览"+ titleName;
ToolStripMenuItem.Text = "添加"+ titleName;
ToolStripMenuItem.Text = "修改" + titleName;
ToolStripMenuItem.Text = "删除" + titleName;
rySearch1.PerformClick();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
btnAdd.PerformClick();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
btnEdit.PerformClick();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
btnDel.PerformClick();
}
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (LvCbResult.SelectedObject == null) { return; }
var item = (ViewInfo)LvCbResult.SelectedObject;
var selectId = item.Id;
FrmAdd frm = new FrmAdd()
{
Text = "添加" + titleName,
Icon = Icon,
isAdd = 1
};
frm.GetInfo(selectId.ToString());
frm.mr = new ModalForm(this, frm);
frm.mr.OnDialogResult += new ModalForm.DialogResultHandler((object t, DialogResult dg) => {
if (dg == DialogResult.OK)
{
rySearch1.PerformClick();
}
});
frm.mr.ShowModal();
}
}
class ViewInfo
{
/// <summary>
@ -198,5 +220,5 @@ namespace Itrycn_Project.DbOp
{
get { return AddTime.ToString("yyyy-MM-dd dddd HH:mm:ss"); }
}
}
}
}
}

View File

@ -1,4 +1,4 @@
namespace Itrycn_Project.DbOp
namespace Itrycn_Project2.DbOp
{
partial class FrmView
{
@ -41,6 +41,7 @@
this.LvCbResult = new BrightIdeasSoftware.FastObjectListView();
this.OlvName = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));
this.OlvAddTime = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn()));
this.ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.contextMenuStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.LvCbResult)).BeginInit();
this.SuspendLayout();
@ -59,11 +60,12 @@
// contextMenuStrip1
//
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.ToolStripMenuItem,
this.ToolStripMenuItem,
this.ToolStripMenuItem,
this.ToolStripMenuItem});
this.contextMenuStrip1.Name = "contextMenuStrip1";
this.contextMenuStrip1.Size = new System.Drawing.Size(125, 70);
this.contextMenuStrip1.Size = new System.Drawing.Size(181, 114);
//
// 添加数据ToolStripMenuItem
//
@ -153,6 +155,7 @@
this.LvCbResult.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.OlvName,
this.OlvAddTime});
this.LvCbResult.ContextMenuStrip = this.contextMenuStrip1;
this.LvCbResult.Cursor = System.Windows.Forms.Cursors.Default;
this.LvCbResult.EmptyListMsg = "当前列表没有任何项";
this.LvCbResult.FullRowSelect = true;
@ -179,6 +182,13 @@
this.OlvAddTime.Text = "时间";
this.OlvAddTime.Width = 200;
//
// 复制并添加数据ToolStripMenuItem
//
this.ToolStripMenuItem.Name = "复制并添加数据ToolStripMenuItem";
this.ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
this.ToolStripMenuItem.Text = "复制并添加数据";
this.ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click);
//
// FrmView
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
@ -214,5 +224,6 @@
private BrightIdeasSoftware.FastObjectListView LvCbResult;
private BrightIdeasSoftware.OLVColumn OlvName;
private BrightIdeasSoftware.OLVColumn OlvAddTime;
private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItem;
}
}

View File

@ -118,6 +118,6 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>269, 21</value>
<value>35, 26</value>
</metadata>
</root>

View File

@ -1,4 +1,4 @@
namespace Itrycn_Project
namespace Itrycn_Project2
{
partial class FrmAbout
{

View File

@ -7,7 +7,7 @@ using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Itrycn_Project
namespace Itrycn_Project2
{
public partial class FrmAbout : RySkins.SKinForm
{

View File

@ -1,4 +1,4 @@
using Itrycn_Project;
using Itrycn_Project2;
using ryCommon;
using ryCommonDb;
using System;

View File

@ -1,4 +1,4 @@
using Itrycn_Project;
using Itrycn_Project2;
using ryCommon;
using System;
using System.Collections.Generic;
@ -164,12 +164,12 @@ namespace Itrycn_Project2
void Start()
{
//RyWeb.QuickWeb ry3h3 = new RyWeb.QuickWeb();
IsExit = false;
IsRunning = false;
Soft_MemInfo.IsCanCloseForm = true;
//将扫描的代码写在下面
//↑将扫描的代码写在上面
IsExit = false;
IsRunning = false;
Soft_MemInfo.IsCanCloseForm = true;
this.Invoke(new Action(() =>
{
//LvCbResult.AddObjects(list);

View File

@ -1,4 +1,4 @@
using Itrycn_Project;
using Itrycn_Project2;
using ryCommon;
using RyHardWare;
using System;

View File

@ -7,7 +7,7 @@ using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Itrycn_Project
namespace Itrycn_Project2
{
static class Program
{

View File

@ -8,7 +8,7 @@
// </auto-generated>
//------------------------------------------------------------------------------
namespace Itrycn_Project.Properties
namespace Itrycn_Project2.Properties
{

View File

@ -80,10 +80,12 @@ namespace RySkins
this.Controls.Add(this.btnCancel);
this.Controls.Add(this.btnYes);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Location = new System.Drawing.Point(0, 0);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "FrmMessageBox";
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmMessageBox_FormClosing);
this.ResumeLayout(false);
}

View File

@ -15,9 +15,11 @@ namespace RySkins
{
InitializeComponent();
}
private bool ProcUse = false;
public MessageBoxButtons ResultDg { get; set; } = MessageBoxButtons.OKCancel;
private void BtnYes_Click(object sender, EventArgs e)
{
ProcUse = true;
if (this.Modal)
{
switch (ResultDg)
@ -38,6 +40,7 @@ namespace RySkins
private void BtnCancel_Click(object sender, EventArgs e)
{
ProcUse = true;
switch (ResultDg)
{
case MessageBoxButtons.YesNo:
@ -54,5 +57,13 @@ namespace RySkins
lblMsg.UpdateInfo();
lblMsg.Refresh();
}
private void FrmMessageBox_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing && !ProcUse)
{
this.DialogResult = DialogResult.Cancel;
}
}
}
}

View File

@ -1,4 +1,4 @@
namespace Itrycn_Project
namespace Itrycn_Project2
{
partial class FrmSetting
{

View File

@ -7,7 +7,7 @@ using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Itrycn_Project
namespace Itrycn_Project2
{
public partial class FrmSetting : RySkins.SKinForm
{

View File

@ -342,6 +342,32 @@ namespace ryCommon
//return replace.IsMatch(wildcardStr1);
}
/// <summary>
/// 支持忽略大小写的替换功能
/// </summary>
/// <param name="str"></param>
/// <param name="oldValue"></param>
/// <param name="newValue"></param>
/// <param name="IgnoreCase">是否忽略大小写</param>
/// <returns></returns>
public static string Replace(string str, string oldValue, string newValue,bool IgnoreCase)
{
if(IgnoreCase)
{
var str2 = "";
var str_tmp = str;
var pos = str_tmp.IndexOfEx(oldValue);
while(pos>=0)
{
str2 += str_tmp.Substring(0, pos);
str_tmp = str_tmp.Substring(pos + oldValue.Length);
pos = str_tmp.IndexOfEx(oldValue);
}
str2 += str_tmp;
return str2;
}
else { return str.Replace(oldValue,newValue); }
}
/// <summary>
/// 获取匹配的内容
/// </summary>
/// <param name="str"></param>

View File

@ -55,6 +55,18 @@ namespace ryCommon
}
}
/// <summary>
/// 支持忽略大小写的替换文本功能
/// </summary>
/// <param name="original"></param>
/// <param name="oldValue"></param>
/// <param name="newValue"></param>
/// <param name="IgnoreCase">是否忽略大小写</param>
/// <returns></returns>
static public string Replace(this string original, string oldValue, string newValue, bool IgnoreCase)
{
return Strings.Replace(original, oldValue, newValue, IgnoreCase);
}
/// <summary>
/// 获取符合要求的第一个结果
/// </summary>
/// <param name="input"></param>

View File

@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”: :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("3.0.2105.2201")]
[assembly: AssemblyFileVersion("3.0.2105.2201")]
[assembly: AssemblyVersion("3.0.2107.0101")]
[assembly: AssemblyFileVersion("3.0.2107.0101")]

View File

@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("3.0.2105.2201")]
[assembly: AssemblyFileVersion("3.0.2105.2201")]
[assembly: AssemblyVersion("3.0.2107.0101")]
[assembly: AssemblyFileVersion("3.0.2107.0101")]

View File

@ -1,282 +1,293 @@
using DotNet4.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RyWeb
{
using DotNet4.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace RyWeb
{
/// <summary>
///
/// </summary>
public class QuickWeb
{
/// <summary>
/// 以post方式获取网页源码
/// </summary>
/// <param name="url"></param>
/// <param name="post"></param>
/// <param name="cookie"></param>
/// <returns></returns>
public HttpResult Post(string url, string post, string cookie)
{
return Post(url, post, "application/x-www-form-urlencoded", cookie);
}
/// <summary>
/// 以post方式提交json内容
/// </summary>
/// <param name="url"></param>
/// <param name="post"></param>
/// <param name="cookie"></param>
/// <returns></returns>
public HttpResult PostJson(string url, string post, string cookie)
{
return Post(url, post, "application/json", cookie);
}
/// <summary>
/// 以post方式提交json内容
/// </summary>
/// <param name="url"></param>
/// <param name="post"></param>
/// <returns></returns>
public HttpResult PostJson(string url, string post)
{
return Post(url, post, "application/json", "");
}
/// <summary>
/// 以post方式获取网页源码
/// </summary>
/// <param name="url"></param>
/// <param name="post"></param>
/// <param name="ContentType"></param>
/// <param name="cookie"></param>
/// <returns></returns>
public HttpResult Post(string url, string post,string ContentType, string cookie)
{
try
{
HttpHelper t = new HttpHelper();
HttpItem m = new HttpItem()
{
URL = url,
Postdata = post,
ContentType = ContentType,
Method = "POST",
Timeout = Timeout,
ReadWriteTimeout = Timeout,
UserAgent = UserAgent
};
if (cookie.Length > 0)
{
m.Cookie = cookie;
}
HttpResult r = t.GetHtml(m);
return r;
}
catch
{
HttpResult r = new HttpResult();
return r;
}
}
/// <summary>
/// 以post方式获取网页源码
/// </summary>
/// <param name="url"></param>
/// <param name="post"></param>
/// <returns></returns>
public HttpResult Post(string url, string post)
{
return Post(url, post, cookie);
}
/// <summary>
/// 获取网址对应的文件大小
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public long GetSize(string url)
{
try
{
HttpHelper t = new HttpHelper();
HttpItem m = new HttpItem()
{
URL = url,
Method = "HEAD",
Allowautoredirect = true,
Cookie = cookie,
Timeout = Timeout,
ReadWriteTimeout = Timeout,
UserAgent=UserAgent
};
HttpResult r = t.GetHtml(m);
if (r.StatusCode == System.Net.HttpStatusCode.OK)
{
return Convert.ToInt64(r.Header["Content-Length"]);
}
else if (r.StatusCode == System.Net.HttpStatusCode.MethodNotAllowed)
{
System.Net.ServicePointManager.DefaultConnectionLimit = 512;
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url);
System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();
long totalBytes = response.ContentLength;
return totalBytes;
}
else
return 0;
}
catch
{
return 0;
}
}
/// </summary>
public class QuickWeb
{
/// <summary>
/// 以post方式获取网页源码
/// </summary>
/// <param name="url"></param>
/// <param name="post"></param>
/// <param name="cookie"></param>
/// <returns></returns>
public HttpResult Post(string url, string post, string cookie)
{
return Post(url, post, "application/x-www-form-urlencoded", cookie);
}
/// <summary>
/// 以post方式提交json内容
/// </summary>
/// <param name="url"></param>
/// <param name="post"></param>
/// <param name="cookie"></param>
/// <returns></returns>
public HttpResult PostJson(string url, string post, string cookie)
{
return Post(url, post, "application/json", cookie);
}
/// <summary>
/// 以post方式提交json内容
/// </summary>
/// <param name="url"></param>
/// <param name="post"></param>
/// <returns></returns>
public HttpResult PostJson(string url, string post)
{
return Post(url, post, "application/json", "");
}
/// <summary>
/// 以post方式获取网页源码
/// </summary>
/// <param name="url"></param>
/// <param name="post"></param>
/// <param name="ContentType"></param>
/// <param name="cookie"></param>
/// <returns></returns>
public HttpResult Post(string url, string post,string ContentType, string cookie)
{
try
{
HttpHelper t = new HttpHelper();
HttpItem m = new HttpItem()
{
URL = url,
Postdata = post,
ContentType = ContentType,
Method = "POST",
Timeout = Timeout,
ReadWriteTimeout = Timeout,
UserAgent = UserAgent,
Referer=Referer
};
if (cookie.Length > 0)
{
m.Cookie = cookie;
}
HttpResult r = t.GetHtml(m);
return r;
}
catch
{
HttpResult r = new HttpResult();
return r;
}
}
/// <summary>
/// 以post方式获取网页源码
/// </summary>
/// <param name="url"></param>
/// <param name="post"></param>
/// <returns></returns>
public HttpResult Post(string url, string post)
{
return Post(url, post, cookie);
}
/// <summary>
/// 获取网址对应的文件大小
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public long GetSize(string url)
{
try
{
HttpHelper t = new HttpHelper();
HttpItem m = new HttpItem()
{
URL = url,
Method = "HEAD",
Allowautoredirect = true,
Cookie = cookie,
Timeout = Timeout,
ReadWriteTimeout = Timeout,
UserAgent = UserAgent,
Referer = Referer
};
HttpResult r = t.GetHtml(m);
if (r.StatusCode == System.Net.HttpStatusCode.OK)
{
return Convert.ToInt64(r.Header["Content-Length"]);
}
else if (r.StatusCode == System.Net.HttpStatusCode.MethodNotAllowed)
{
System.Net.ServicePointManager.DefaultConnectionLimit = 512;
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url);
System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)request.GetResponse();
long totalBytes = response.ContentLength;
return totalBytes;
}
else
return 0;
}
catch
{
return 0;
}
}
/// <summary>
///
/// </summary>
public string UserAgent
{
get; set;
} = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
/// <summary>
/// 获取网页源码
/// </summary>
/// <param name="url"></param>
/// <param name="cookie"></param>
/// <returns></returns>
public HttpResult Get(string url, string cookie)
{
try
{
HttpHelper t = new HttpHelper();
HttpItem m = new HttpItem()
{
URL = url,
ContentType= "application/x-www-form-urlencoded"
};
if (cookie.Length>0)
{
m.Cookie = cookie;
}
m.UserAgent = UserAgent;
m.Allowautoredirect = true;
m.Timeout = Timeout;
m.ReadWriteTimeout = Timeout;
HttpResult r = t.GetHtml(m);
return r;
}
catch
{
HttpResult r = new HttpResult()
{
Html = ""
};
return r;
}
}
/// <summary>
/// 获取网页源码
/// </summary>
/// <param name="url"></param>
///<param name="encoding"></param>
/// <param name="cookie"></param>
/// <returns></returns>
public HttpResult Get(string url,Encoding encoding, string cookie)
{
try
{
HttpHelper t = new HttpHelper();
HttpItem m = new HttpItem()
{
URL = url
};
if (cookie != "")
{
m.Cookie = cookie;
}
m.UserAgent = UserAgent;
m.Encoding = encoding;
m.Allowautoredirect = true;
m.Timeout = Timeout;
m.ReadWriteTimeout = Timeout;
HttpResult r = t.GetHtml(m);
return r;
}
catch
{
HttpResult r = new HttpResult()
{
Html = ""
};
return r;
}
}
/// <summary>
/// 获取网页源码
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public HttpResult Get(string url)
{
return Get(url, cookie);
}
/// </summary>
public string UserAgent
{
get; set;
} = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
/// <summary>
/// 获取网页源码
/// </summary>
/// <param name="url"></param>
/// <param name="cookie"></param>
/// <returns></returns>
public HttpResult Get(string url, string cookie)
{
try
{
HttpHelper t = new HttpHelper();
HttpItem m = new HttpItem()
{
URL = url,
ContentType= "application/x-www-form-urlencoded"
};
if (cookie.Length>0)
{
m.Cookie = cookie;
}
m.UserAgent = UserAgent;
m.Allowautoredirect = true;
m.Timeout = Timeout;
m.ReadWriteTimeout = Timeout;
m.Referer = Referer;
HttpResult r = t.GetHtml(m);
return r;
}
catch
{
HttpResult r = new HttpResult()
{
Html = ""
};
return r;
}
}
/// <summary>
/// 获取网页源码
/// </summary>
/// <param name="url"></param>
///<param name="encoding"></param>
/// <param name="cookie"></param>
/// <returns></returns>
public HttpResult Get(string url,Encoding encoding, string cookie)
{
try
{
HttpHelper t = new HttpHelper();
HttpItem m = new HttpItem()
{
URL = url
};
if (cookie != "")
{
m.Cookie = cookie;
}
m.UserAgent = UserAgent;
m.Encoding = encoding;
m.Allowautoredirect = true;
m.Timeout = Timeout;
m.ReadWriteTimeout = Timeout;
m.Referer = Referer;
HttpResult r = t.GetHtml(m);
return r;
}
catch
{
HttpResult r = new HttpResult()
{
Html = ""
};
return r;
}
}
/// <summary>
/// 获取网页源码
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public HttpResult Get(string url)
{
return Get(url, cookie);
}
/// <summary>
///
/// </summary>
public string Cookie
{
get { return cookie; }
}
/// </summary>
public string Cookie
{
get { return cookie; }
}
/// <summary>
///
/// </summary>
public int Timeout { get; set; } = 10000;
/// </summary>
public string Referer
{
get;set;
}
/// <summary>
///
/// </summary>
public int Timeout { get; set; } = 10000;
/// <summary>
///
/// </summary>
/// <param name="str"></param>
/// <param name="encode"></param>
/// <returns></returns>
public string UrlEncode(string str, Encoding encode)
{
StringBuilder sb = new StringBuilder();
byte[] byStr = encode.GetBytes(str); //默认是System.Text.Encoding.Default.GetBytes(str)
for (int i = 0; i < byStr.Length; i++)
{
var item = Convert.ToString(byStr[i], 16);
if (item.Length == 1) { item = "0" + item; }
sb.Append(@"%" + item);
}
return (sb.ToString());
}
private string cookie = "";
/// <summary>
/// 将相对网址转换成绝对网址
/// </summary>
/// <param name="rel_url">相对网址</param>
/// <param name="cur_pageUrl">当前页面地址</param>
/// <returns>转换后的绝对网址</returns>
public string ConvertUrl(string rel_url, string cur_pageUrl)
{
if (rel_url == "")
{
return cur_pageUrl;
}
try
{
string _rel_url = rel_url;
if (_rel_url.IndexOf("//")==0)
{
int iPos = cur_pageUrl.IndexOf(":");
if (iPos > 0)
{
_rel_url = cur_pageUrl.Substring(0,iPos)+ ":" + _rel_url;
}
}
Uri baseUri = new Uri(cur_pageUrl); //
Uri absoluteUri = new Uri(baseUri, _rel_url);//相对绝对路径都在这里转 这里的urlx ="../test.html"
return absoluteUri.AbsoluteUri.Replace("&amp;", "&");//
}
catch { return rel_url; }
}
}
}
/// <returns></returns>
public string UrlEncode(string str, Encoding encode)
{
StringBuilder sb = new StringBuilder();
byte[] byStr = encode.GetBytes(str); //默认是System.Text.Encoding.Default.GetBytes(str)
for (int i = 0; i < byStr.Length; i++)
{
var item = Convert.ToString(byStr[i], 16);
if (item.Length == 1) { item = "0" + item; }
sb.Append(@"%" + item);
}
return (sb.ToString());
}
private string cookie = "";
/// <summary>
/// 将相对网址转换成绝对网址
/// </summary>
/// <param name="rel_url">相对网址</param>
/// <param name="cur_pageUrl">当前页面地址</param>
/// <returns>转换后的绝对网址</returns>
public string ConvertUrl(string rel_url, string cur_pageUrl)
{
if (rel_url == "")
{
return cur_pageUrl;
}
try
{
string _rel_url = rel_url;
if (_rel_url.IndexOf("//")==0)
{
int iPos = cur_pageUrl.IndexOf(":");
if (iPos > 0)
{
_rel_url = cur_pageUrl.Substring(0,iPos)+ ":" + _rel_url;
}
}
Uri baseUri = new Uri(cur_pageUrl); //
Uri absoluteUri = new Uri(baseUri, _rel_url);//相对绝对路径都在这里转 这里的urlx ="../test.html"
return absoluteUri.AbsoluteUri.Replace("&amp;", "&");//
}
catch { return rel_url; }
}
}
}

View File

@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”: :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("3.0.2106.1301")]
[assembly: AssemblyFileVersion("3.0.2106.1301")]
[assembly: AssemblyVersion("3.0.2107.0101")]
[assembly: AssemblyFileVersion("3.0.2107.0101")]

View File

@ -0,0 +1,41 @@
//用在SETreeView 的拖放操作时
//http://www.codeproject.com/KB/tree/TreeViewDragDrop.aspx
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace Sheng.Winform.Controls
{
public class DragHelper
{
[DllImport("comctl32.dll")]
public static extern bool InitCommonControls();
[DllImport("comctl32.dll", CharSet = CharSet.Auto)]
public static extern bool ImageList_BeginDrag(IntPtr himlTrack, int
iTrack, int dxHotspot, int dyHotspot);
[DllImport("comctl32.dll", CharSet = CharSet.Auto)]
public static extern bool ImageList_DragMove(int x, int y);
[DllImport("comctl32.dll", CharSet = CharSet.Auto)]
public static extern void ImageList_EndDrag();
[DllImport("comctl32.dll", CharSet = CharSet.Auto)]
public static extern bool ImageList_DragEnter(IntPtr hwndLock, int x, int y);
[DllImport("comctl32.dll", CharSet = CharSet.Auto)]
public static extern bool ImageList_DragLeave(IntPtr hwndLock);
[DllImport("comctl32.dll", CharSet = CharSet.Auto)]
public static extern bool ImageList_DragShowNolock(bool fShow);
static DragHelper()
{
InitCommonControls();
}
}
}

View File

@ -0,0 +1,279 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
namespace Sheng.Winform.Controls.Drawing
{
public class BmpAdjuster
{
#region
public delegate ColorPalette PaletteAdjustEvent(ColorPalette plt);
public unsafe delegate void ConvertScanLineEvent(IntPtr srcLine, IntPtr dstLine, int width, int srcPixBit, int dstPixBit, Bitmap srcBmp, Bitmap dstBmp);
private int alpha = 255;
public BmpAdjuster()
{
}
/// <summary>
/// 初始化的时候给个alpha值,这样在灰图片的时候可以半透明
/// </summary>
/// <param name="alpha"></param>
public BmpAdjuster(int alpha)
{
this.alpha = alpha;
}
public void AdjustColor(ref Bitmap bmp, PixelFormat format, PaletteAdjustEvent PalleteAdjust, ConvertScanLineEvent ConvertScanLine)
{
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
Bitmap bmpOut = new Bitmap(bmp.Width, bmp.Height, format);
bmpOut.Palette = PalleteAdjust(bmpOut.Palette);
PixelFormat srcFmt = bmp.PixelFormat;
PixelFormat dstFmt = bmpOut.PixelFormat;
int srcPixBit = GetPixelSize(srcFmt);
int dstPixBit = GetPixelSize(dstFmt);
BitmapData srcData = null;
BitmapData dstData = null;
try
{
srcData = bmp.LockBits(rect, ImageLockMode.ReadOnly, srcFmt);
dstData = bmpOut.LockBits(rect, ImageLockMode.WriteOnly, dstFmt);
unsafe
{
byte* srcLine = (byte*)srcData.Scan0.ToPointer();
byte* dstLine = (byte*)dstData.Scan0.ToPointer();
for (int L = 0; L < srcData.Height; L++)
{
ConvertScanLine((IntPtr)srcLine, (IntPtr)dstLine, srcData.Width, srcPixBit, dstPixBit, bmp, bmpOut);
srcLine += srcData.Stride;
dstLine += dstData.Stride;
}
}
}
finally
{
bmp.UnlockBits(srcData);
bmpOut.UnlockBits(dstData);
}
bmp = bmpOut;
}
internal int GetPixelSize(PixelFormat format)
{
switch (format)
{
case PixelFormat.Format16bppRgb555: return 16;
case PixelFormat.Format16bppRgb565: return 16;
case PixelFormat.Format24bppRgb: return 24;
case PixelFormat.Format32bppRgb: return 32;
case PixelFormat.Format1bppIndexed: return 1;
case PixelFormat.Format4bppIndexed: return 4;
case PixelFormat.Format8bppIndexed: return 8;
case PixelFormat.Format16bppArgb1555: return 16;
case PixelFormat.Format32bppPArgb: return 32;
case PixelFormat.Format16bppGrayScale: return 16;
case PixelFormat.Format48bppRgb: return 48;
case PixelFormat.Format64bppPArgb: return 64;
case PixelFormat.Canonical: return 32;
case PixelFormat.Format32bppArgb: return 32;
case PixelFormat.Format64bppArgb: return 64;
}
return 0;
}
public unsafe void Monochrome(ref Bitmap bmp)
{
AdjustColor(ref bmp, PixelFormat.Format1bppIndexed,
new PaletteAdjustEvent(SetBlackWhitePallete),
new ConvertScanLineEvent(ConvertBlackWhiteScanLine));
}
ColorPalette SetBlackWhitePallete(ColorPalette plt)
{
plt.Entries[0] = Color.Black;
plt.Entries[1] = Color.White;
return plt;
}
unsafe void ConvertBlackWhiteScanLine(IntPtr srcLine, IntPtr dstLine, int width, int srcPixBit, int dstPixBit, Bitmap srcBmp, Bitmap dstBmp)
{
byte* src = (byte*)srcLine.ToPointer();
byte* dst = (byte*)dstLine.ToPointer();
int srcPixByte = srcPixBit / 8;
int x, v, t = 0;
for (x = 0; x < width; x++)
{
v = 28 * src[0] + 151 * src[1] + 77 * src[2];
t = (t << 1) | (v > 200 * 256 ? 1 : 0);
src += srcPixByte;
if (x % 8 == 7)
{
*dst = (byte)t;
dst++;
t = 0;
}
}
if ((x %= 8) != 7)
{
t <<= 8 - x;
*dst = (byte)t;
}
}
public void Gray(ref Bitmap bmp)
{
AdjustColor(ref bmp, PixelFormat.Format8bppIndexed,
new PaletteAdjustEvent(SetGrayPallete),
new ConvertScanLineEvent(ConvertGaryScanLine));
}
ColorPalette SetGrayPallete(ColorPalette plt)
{
//for (int i = plt.Entries.Length - 1; i >= 0; i--)
// plt.Entries[i] = Color.FromArgb( i, i, i);
for (int i = plt.Entries.Length - 1; i >= 0; i--)
plt.Entries[i] = Color.FromArgb(alpha, i, i, i);
return plt;
}
unsafe void ConvertGaryScanLine(IntPtr srcLine, IntPtr dstLine, int width, int srcPixBit, int dstPixBit, Bitmap srcBmp, Bitmap dstBmp)
{
byte* src = (byte*)srcLine.ToPointer();
byte* dst = (byte*)dstLine.ToPointer();
int srcPixByte = srcPixBit / 8;
for (int x = 0; x < width; x++)
{
*dst = (byte)((28 * src[0] + 151 * src[1] + 77 * src[2]) >> 8);
src += srcPixByte;
dst++;
}
}
#endregion
/// <summary>
/// 使图片单色化
/// </summary>
/// <param name="pimage"></param>
/// <returns></returns>
public static Bitmap MonochromeLockBits(Bitmap pimage)
{
Bitmap source = null;
// If original bitmap is not already in 32 BPP, ARGB format, then convert
if (pimage.PixelFormat != PixelFormat.Format32bppArgb)
{
source = new Bitmap(pimage.Width, pimage.Height, PixelFormat.Format32bppArgb);
source.SetResolution(pimage.HorizontalResolution, pimage.VerticalResolution);
using (Graphics g = Graphics.FromImage(source))
{
g.DrawImageUnscaled(pimage, 0, 0);
}
}
else
{
source = pimage;
}
// Lock source bitmap in memory
BitmapData sourceData = source.LockBits(new Rectangle(0, 0, source.Width, source.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
// Copy image data to binary array
int imageSize = sourceData.Stride * sourceData.Height;
byte[] sourceBuffer = new byte[imageSize];
Marshal.Copy(sourceData.Scan0, sourceBuffer, 0, imageSize);
// Unlock source bitmap
source.UnlockBits(sourceData);
// Create destination bitmap
Bitmap destination = new Bitmap(source.Width, source.Height, PixelFormat.Format1bppIndexed);
// Lock destination bitmap in memory
BitmapData destinationData = destination.LockBits(new Rectangle(0, 0, destination.Width, destination.Height), ImageLockMode.WriteOnly, PixelFormat.Format1bppIndexed);
// Create destination buffer
imageSize = destinationData.Stride * destinationData.Height;
byte[] destinationBuffer = new byte[imageSize];
int sourceIndex = 0;
int destinationIndex = 0;
int pixelTotal = 0;
byte destinationValue = 0;
int pixelValue = 128;
int height = source.Height;
int width = source.Width;
int threshold = 500;
// Iterate lines
for (int y = 0; y < height; y++)
{
sourceIndex = y * sourceData.Stride;
destinationIndex = y * destinationData.Stride;
destinationValue = 0;
pixelValue = 128;
// Iterate pixels
for (int x = 0; x < width; x++)
{
// Compute pixel brightness (i.e. total of Red, Green, and Blue values)
pixelTotal = sourceBuffer[sourceIndex + 1] + sourceBuffer[sourceIndex + 2] + sourceBuffer[sourceIndex + 3];
if (pixelTotal > threshold)
{
destinationValue += (byte)pixelValue;
}
if (pixelValue == 1)
{
destinationBuffer[destinationIndex] = destinationValue;
destinationIndex++;
destinationValue = 0;
pixelValue = 128;
}
else
{
pixelValue >>= 1;
}
sourceIndex += 4;
}
if (pixelValue != 128)
{
destinationBuffer[destinationIndex] = destinationValue;
}
}
// Copy binary image data to destination bitmap
Marshal.Copy(destinationBuffer, 0, destinationData.Scan0, imageSize);
// Unlock destination bitmap
destination.UnlockBits(destinationData);
// Dispose of source if not originally supplied bitmap
if (source != pimage)
{
source.Dispose();
}
// Return
return destination;
}
}
}

View File

@ -0,0 +1,67 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Reflection;
namespace Sheng.Winform.Controls.Drawing
{
public enum ChooseColorType
{
/// <summary>
/// 自定义
/// </summary>
Custom = 0,
/// <summary>
/// 预置
/// </summary>
Define = 1,
/// <summary>
/// 系统
/// </summary>
System = 2
}
/// <summary>
/// 颜色表示法
/// </summary>
public class ColorRepresentationHelper
{
/// <summary>
/// 根据颜色表示字符串获取对应的颜色
/// </summary>
/// <param name="colorValueString"></param>
/// <returns></returns>
public static Color GetColorByValue(string colorValueString)
{
if (colorValueString == null || colorValueString == String.Empty)
{
return Color.Empty;
}
string[] strArray = colorValueString.Split('.');
ChooseColorType type =
(ChooseColorType)Convert.ToInt32(strArray[0]);
Color color = Color.Empty;
switch (type)
{
case ChooseColorType.Custom:
color = Color.FromArgb(Convert.ToInt32(strArray[2]));
break;
case ChooseColorType.Define:
color = Color.FromArgb(Convert.ToInt32(strArray[2]));
break;
case ChooseColorType.System:
Type typeSystemColors = typeof(System.Drawing.SystemColors);
PropertyInfo p = typeSystemColors.GetProperty(strArray[1]);
color = (Color)p.GetValue(typeSystemColors, null);
break;
}
return color;
}
}
}

View File

@ -0,0 +1,494 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace Sheng.Winform.Controls.Drawing
{
public static class DrawingTool
{
#region GetImage
public static Image GetImage(string filePath)
{
return GetImage(filePath, true);
}
public static Image GetImage(string filePath, bool memberCopy)
{
return GetImage(filePath, memberCopy, false);
}
/// <summary>
/// 从文件中获取Image对象
/// 这个函数的主要功能是处理一些ico文件
/// 一些ico文件的格式可能比较新直接Image.FormFile会报内存不足的异常
/// </summary>
/// <param name="filePath"></param>
/// <param name="memberCopy">是否将文件读入内存操作如果为false,将直接返回Image.FromFile在此情况下
/// 必须手动释放Image对象否则文件将一直处于占用状态如果为true,则在内存中拷贝副本</param>
/// <returns></returns>
public static Image GetImage(string filePath,bool memberCopy, bool markNotFind)
{
FileInfo file = new FileInfo(filePath);
Image image = null;
if (!file.Exists)
{
if (markNotFind)
{
image = new Bitmap(16, 16);
Mark.FileNotFind(image);
return image;
}
else
{
return null;
}
}
switch (file.Extension.ToLower())
{
case ".ico": try
{
Icon icon = new Icon(file.FullName);
image = icon.ToBitmap();
}
catch
{
image = new Bitmap(16, 16);
Mark.FileCanNotRead(image);
}
break;
default:
if (memberCopy)
{
Image imgTemp = Image.FromFile(file.FullName);
image = new System.Drawing.Bitmap(imgTemp);
imgTemp.Dispose();
}
else
{
// Image.FromFile(file.FullName);会使文件一直处于被占用状态,必须手动释放
image = Image.FromFile(file.FullName);
}
break;
}
return image;
}
#endregion
#region ImageToIcon
/// <summary>
/// 将图像转为Icon对象,使用png格式
/// </summary>
/// <param name="image"></param>
/// <returns></returns>
public static Icon ImageToIcon(Image image)
{
return ImageToIcon(image, ImageFormat.Png);
}
/// <summary>
/// 将图像转为Icon对象
/// </summary>
/// <param name="image"></param>
/// <param name="format"></param>
/// <returns></returns>
public static Icon ImageToIcon(Image image, ImageFormat format)
{
System.IO.Stream ms = new MemoryStream();
image.Save(ms, format);
Icon icon = Icon.FromHandle(new Bitmap(ms).GetHicon());
ms.Close();
return icon;
}
#endregion
#region GetScaleImage
/// <summary>
/// 返回适应指定容器大小的图像
/// 如果图像的尺寸(长或宽)超出了容器范围,将按比例获取图像的缩略图返回,否则直接返回图像
/// 此方法最终调用 Image.GetThumbnailImage
/// 但是注意,在指定的容器尺寸过小时,返回的Image尺寸不可知,是在为了显示16x16的小缩略图是发现了此问题
/// 使用 GetScaleImage
/// </summary>
/// <param name="image"></param>
/// <param name="containerWidth"></param>
/// <param name="containerHeight"></param>
/// <returns></returns>
public static Image GetAutoScaleThumbnailImage(Image image, int containerWidth, int containerHeight)
{
if (image.Size.Width > containerWidth ||
image.Size.Height > containerHeight)
{
double height = containerHeight;
double width = containerWidth;
double new_height;
double new_width;
double scale;
new_height = height;
new_width = width;
if ((image.Width > width) || (image.Height > height))
{
if (image.Width > width)
{
scale = image.Width / width;
new_width = image.Width / scale;
new_height = image.Height / scale;
}
else
{
scale = image.Height / height;
new_width = image.Width / scale;
new_height = image.Height / scale;
}
}
return image.GetThumbnailImage(Convert.ToInt32(new_width), Convert.ToInt32(new_height),
thumbnailCallback, IntPtr.Zero);
}
else
{
return image;
}
}
static Image.GetThumbnailImageAbort thumbnailCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback);
private static bool ThumbnailCallback()
{
return false;
}
/// <summary>
/// 返回适应指定容器大小的图像
/// 在需要的情况下,此方法创建一个新对象,进行绘制
/// </summary>
/// <param name="image"></param>
/// <param name="containerWidth"></param>
/// <param name="containerHeight"></param>
/// <returns></returns>
public static Image GetScaleImage(Image image, Size size)
{
if (image.Size.Width > size.Width ||
image.Size.Height > size.Height)
{
double width = size.Width;
double height = size.Height;
double new_width;
double new_height;
double scale;
new_height = height;
new_width = width;
if ((image.Width > width) || (image.Height > height))
{
if (image.Width > width)
{
scale = image.Width / width;
new_width = image.Width / scale;
new_height = image.Height / scale;
}
else
{
scale = image.Height / height;
new_width = image.Width / scale;
new_height = image.Height / scale;
}
}
Bitmap bitmap = new Bitmap(Convert.ToInt32(new_width), Convert.ToInt32(new_height));
Graphics g = Graphics.FromImage(bitmap);
g.DrawImage(image, 0, 0, bitmap.Width, bitmap.Height);
return bitmap;
}
else
{
return image;
}
}
/// <summary>
/// 返回适应指定容器大小的图像
/// 在需要的情况下,此方法创建一个新对象,进行绘制
/// </summary>
/// <param name="image"></param>
/// <param name="containerWidth"></param>
/// <param name="containerHeight"></param>
/// <returns></returns>
public static Image GetScaleImage(Image image, int containerWidth, int containerHeight)
{
if (containerWidth == null || containerHeight == null)
{
Debug.Assert(false, "containerWidth 或 containerHeight为空");
throw new ArgumentNullException();
}
return GetScaleImage(image, new Size(containerWidth, containerHeight));
}
#endregion
/// <summary>
/// Gets the bounding rectangle of an image required to fit
/// in to the given rectangle keeping the image aspect ratio.
/// </summary>
/// <param name="image">The source image.</param>
/// <param name="fit">The rectangle to fit in to.</param>
/// <param name="hAlign">Horizontal image aligment in percent.</param>
/// <param name="vAlign">Vertical image aligment in percent.</param>
/// <returns>New image size.</returns>
public static Rectangle GetSizedImageBounds(Image image, Rectangle fit, float hAlign, float vAlign)
{
if (hAlign < 0 || hAlign > 100.0f)
throw new ArgumentException("hAlign must be between 0.0 and 100.0 (inclusive).", "hAlign");
if (vAlign < 0 || vAlign > 100.0f)
throw new ArgumentException("vAlign must be between 0.0 and 100.0 (inclusive).", "vAlign");
Size scaled = GetSizedImageBounds(image, fit.Size);
int x = fit.Left + (int)(hAlign / 100.0f * (float)(fit.Width - scaled.Width));
int y = fit.Top + (int)(vAlign / 100.0f * (float)(fit.Height - scaled.Height));
return new Rectangle(x, y, scaled.Width, scaled.Height);
}
/// <summary>
/// Gets the bounding rectangle of an image required to fit
/// in to the given rectangle keeping the image aspect ratio.
/// The image will be centered in the fit box.
/// </summary>
/// <param name="image">The source image.</param>
/// <param name="fit">The rectangle to fit in to.</param>
/// <returns>New image size.</returns>
public static Rectangle GetSizedImageBounds(Image image, Rectangle fit)
{
return GetSizedImageBounds(image, fit, 50.0f, 50.0f);
}
/// <summary>
/// Gets the scaled size of an image required to fit
/// in to the given size keeping the image aspect ratio.
/// </summary>
/// <param name="image">The source image.</param>
/// <param name="fit">The size to fit in to.</param>
/// <returns>New image size.</returns>
public static Size GetSizedImageBounds(Image image, Size fit)
{
float f = System.Math.Max((float)image.Width / (float)fit.Width, (float)image.Height / (float)fit.Height);
if (f < 1.0f) f = 1.0f; // Do not upsize small images
int width = (int)System.Math.Round((float)image.Width / f);
int height = (int)System.Math.Round((float)image.Height / f);
return new Size(width, height);
}
#region RoundedRect
/// <summary>
/// 获取一个圆角矩形
/// </summary>
/// <param name="width"></param>
/// <param name="height"></param>
/// <param name="radius">角度</param>
/// <returns></returns>
public static GraphicsPath RoundedRect(int width, int height, int radius)
{
RectangleF baseRect = new RectangleF(0, 0, width, height);
return RoundedRect(baseRect, radius);
}
/// <summary>
/// 获取一个圆角矩形
/// </summary>
/// <param name="width"></param>
/// <param name="height"></param>
/// <param name="radius">角度</param>
/// <returns></returns>
public static GraphicsPath RoundedRect(RectangleF baseRect, int radius)
{
//RectangleF baseRect = new RectangleF(0, 0, width, height);
float diameter = radius * 2.0f;
SizeF sizeF = new SizeF(diameter, diameter);
RectangleF arc = new RectangleF(baseRect.Location, sizeF);
GraphicsPath path = new GraphicsPath();
// top left arc
path.AddArc(arc, 180, 90);
// top right arc
arc.X = baseRect.Right - diameter;
path.AddArc(arc, 270, 90);
// bottom right arc
arc.Y = baseRect.Bottom - diameter;
path.AddArc(arc, 0, 90);
// bottom left arc
arc.X = baseRect.Left;
path.AddArc(arc, 90, 90);
path.CloseFigure();
return path;
}
#endregion
#region GetArrowPath
public static GraphicsPath GetArrowPath(PointF startPoint, PointF endPoint)
{
return GetArrowPath(startPoint, endPoint, 7);
}
public static GraphicsPath GetArrowPath(PointF startPoint, PointF endPoint, double arrowLength)
{
return GetArrowPath(startPoint, endPoint, arrowLength, 1);
}
/// <summary>
/// 返回一个表示箭头的Path
/// 如果开始坐标和结束坐标之间的距离大于箭头的大小,箭头向结束坐标对齐,顶着结束坐标
/// </summary>
/// <param name="startPoint">开始坐标</param>
/// <param name="endPoint">结束坐标(顶点,方向)</param>
/// <param name="arrowLength">箭头的长短,大小</param>
/// <param name="relativeValue">箭头的粗细</param>
/// <returns></returns>
public static GraphicsPath GetArrowPath(PointF startPoint, PointF endPoint,
double arrowLength, double relativeValue)
{
//http://www.cnblogs.com/jasenkin/archive/2011/01/04/graphic_drawing_arrow_head_II.html
double distance = Math.Abs(Math.Sqrt(
(startPoint.X - endPoint.X) * (startPoint.X - endPoint.X) +
(startPoint.Y - endPoint.Y) * (startPoint.Y - endPoint.Y)));
if (distance == 0)
{
return new GraphicsPath();
}
double xa = endPoint.X + arrowLength * ((startPoint.X - endPoint.X)
+ (startPoint.Y - endPoint.Y) / relativeValue) / distance;
double ya = endPoint.Y + arrowLength * ((startPoint.Y - endPoint.Y)
- (startPoint.X - endPoint.X) / relativeValue) / distance;
double xb = endPoint.X + arrowLength * ((startPoint.X - endPoint.X)
- (startPoint.Y - endPoint.Y) / relativeValue) / distance;
double yb = endPoint.Y + arrowLength * ((startPoint.Y - endPoint.Y)
+ (startPoint.X - endPoint.X) / relativeValue) / distance;
PointF[] polygonPoints =
{
new PointF(endPoint.X , endPoint.Y),
new PointF( (float)xa , (float)ya),
new PointF( (float)xb , (float)yb)
};
GraphicsPath path = new GraphicsPath();
path.AddLines(polygonPoints);
return path;
}
#endregion
#region Mark
/// <summary>
/// 在指定的Image上绘制特定标记
/// </summary>
public static class Mark
{
/// <summary>
/// 文件不存在
/// </summary>
/// <param name="img"></param>
[Obsolete("改用 FileNotFind(Size size)")]
public static void FileNotFind(Image image)
{
if (image == null)
{
Debug.Assert(false, "image = null");
return;
}
Graphics g = Graphics.FromImage(image);
g.DrawRectangle(Pens.Red, 0, 0, image.Width - 1, image.Height - 1);
g.DrawLine(Pens.Red, 0, 0, image.Width, image.Height);
g.DrawLine(Pens.Red, image.Width, 0, 0, image.Height);
g.Dispose();
}
/// <summary>
/// 文件不存在
/// </summary>
/// <param name="size"></param>
public static Image FileNotFind(Size size)
{
Image image = new Bitmap(size.Width, size.Height);
Graphics g = Graphics.FromImage(image);
g.Clear(Color.White);
g.DrawRectangle(Pens.Red, 0, 0, image.Width - 1, image.Height - 1);
g.DrawLine(Pens.Red, 0, 0, image.Width, image.Height);
g.DrawLine(Pens.Red, image.Width, 0, 0, image.Height);
g.Dispose();
return image;
}
/// <summary>
/// 无法读取文件
/// </summary>
/// <param name="image"></param>
[Obsolete("改用 FileCanNotRead(Size size)")]
public static void FileCanNotRead(Image image)
{
if (image == null)
{
Debug.Assert(false, "image = null");
return;
}
Graphics g = Graphics.FromImage(image);
g.DrawRectangle(Pens.Red, 0, 0, image.Width - 1, image.Height - 1);
g.DrawLine(Pens.Red, 0, 0, image.Width, image.Height);
g.DrawLine(Pens.Red, image.Width, 0, 0, image.Height);
g.Dispose();
}
public static Image FileCanNotRead(Size size)
{
Image image = new Bitmap(size.Width, size.Height);
Graphics g = Graphics.FromImage(image);
g.Clear(Color.White);
g.DrawRectangle(Pens.Red, 0, 0, image.Width - 1, image.Height - 1);
g.DrawLine(Pens.Red, 0, 0, image.Width, image.Height);
g.DrawLine(Pens.Red, image.Width, 0, 0, image.Height);
g.Dispose();
return image;
}
}
#endregion
}
}

View File

@ -0,0 +1,268 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Drawing.Imaging;
namespace SEDrawing
{
public class GraphPlotting
{
/// <summary>
/// 最大圆角半径
/// </summary>
protected const int roundMaxRoundRadius = 3;
/// <summary>
/// 最小矩形边长,用于自动处理圆角大小
/// </summary>
protected const int roundMinBorderLength = 20;
/// <summary>
/// 绘制一个圆角矩形.
/// </summary>
/// <param name="currentGraphicObject">当前屏幕的图形对象</param>
/// <param name="lineColor">矩形线条的颜色</param>
/// <param name="nLeft">矩形左上角X坐标</param>
/// <param name="nTop">矩形左上角Y坐标</param>
/// <param name="nRight">矩形右下角X坐标</param>
/// <param name="nBottom">矩形右下角Y坐标</param>
/// <param name="round">圆角的半径长度</param>
public static void DrawRoundRect(System.Drawing.Graphics currentGraphicObject, Pen drawPen, int nLeft, int nTop, int nRight, int nBottom, int round)
{
if (round > roundMaxRoundRadius)
{
round = roundMaxRoundRadius;
}
else if (round < 0)
{
round = 0;
}
if (Math.Abs(nRight - nLeft) < roundMinBorderLength && Math.Abs(nBottom - nTop) < roundMinBorderLength)
{
round = 1;
}
Point Polygon1 = new Point(nLeft + round, nTop);
Point Polygon2 = new Point(nRight - round + 1, nTop);
Point Polygon3 = new Point(nLeft, nTop + round);
Point Polygon4 = new Point(nRight + 1, nTop + round);
Point Polygon5 = new Point(nLeft, nBottom - round);
Point Polygon6 = new Point(nRight + 1, nBottom - round);
Point Polygon7 = new Point(nLeft + round, nBottom + 1);
Point Polygon8 = new Point(nRight - round, nBottom + 1);
//四条主线(上下左右)
currentGraphicObject.DrawLine(drawPen, Polygon1.X, Polygon1.Y, Polygon2.X, Polygon2.Y);
currentGraphicObject.DrawLine(drawPen, Polygon7.X, Polygon7.Y, Polygon8.X, Polygon8.Y);
currentGraphicObject.DrawLine(drawPen, Polygon3.X, Polygon3.Y, Polygon5.X, Polygon5.Y);
currentGraphicObject.DrawLine(drawPen, Polygon4.X, Polygon4.Y, Polygon6.X, Polygon6.Y);
//四个边角
currentGraphicObject.DrawLine(drawPen, Polygon1.X, Polygon1.Y, Polygon3.X, Polygon3.Y);
currentGraphicObject.DrawLine(drawPen, Polygon2.X, Polygon2.Y, Polygon4.X, Polygon4.Y);
currentGraphicObject.DrawLine(drawPen, Polygon5.X, Polygon5.Y, Polygon7.X, Polygon7.Y);
currentGraphicObject.DrawLine(drawPen, Polygon6.X, Polygon6.Y, Polygon8.X, Polygon8.Y);
}
/// <summary>
/// 绘制一个圆角矩形.
/// </summary>
/// <param name="currentGraphicObject">当前屏幕的图形对象</param>
/// <param name="lineColor">矩形线条的颜色</param>
/// <param name="rect">要绘制的矩形对象</param>
/// <param name="round">圆角的半径长度</param>
public static void DrawRoundRect(System.Drawing.Graphics currentGraphicObject, Pen drawPen, Rectangle rect, int round)
{
DrawRoundRect(currentGraphicObject, drawPen, rect.Left, rect.Top, rect.Right, rect.Bottom, round);
}
/// <summary>
/// 绘制一个圆角矩形.
/// </summary>
/// <param name="currentGraphicObject">当前屏幕的图形对象</param>
/// <param name="lineColor">矩形线条的颜色</param>
/// <param name="rect">要绘制的矩形对象</param>
public static void DrawRoundRect(System.Drawing.Graphics currentGraphicObject, Pen drawPen, Rectangle rect)
{
DrawRoundRect(currentGraphicObject, drawPen, rect.Left, rect.Top, rect.Right, rect.Bottom, 2);
}
/// <summary>
/// 填充一个圆角矩形.
/// </summary>
/// <param name="currentGraphicObject">当前屏幕的图形对象</param>
/// <param name="lineColor">矩形线条的颜色</param>
/// <param name="nLeft">矩形左上角X坐标</param>
/// <param name="nTop">矩形左上角Y坐标</param>
/// <param name="nRight">矩形右下角X坐标</param>
/// <param name="nBottom">矩形右下角Y坐标</param>
/// <param name="round">圆角的半径长度</param>
public static void FillRoundRect(System.Drawing.Graphics currentGraphicObject, Brush brush, int nLeft, int nTop, int nRight, int nBottom, int round)
{
if (round > roundMaxRoundRadius)
{
round = roundMaxRoundRadius;
}
else if (round < 0)
{
round = 0;
}
if (Math.Abs(nRight - nLeft) < roundMinBorderLength && Math.Abs(nBottom - nTop) < roundMinBorderLength)
{
round = 1;
}
Point Polygon1 = new Point(nLeft + round, nTop);
Point Polygon2 = new Point(nRight - round + 1, nTop);
Point Polygon3 = new Point(nLeft, nTop + round);
Point Polygon4 = new Point(nRight + 1, nTop + round);
Point Polygon5 = new Point(nLeft, nBottom - round);
Point Polygon6 = new Point(nRight + 1, nBottom - round);
Point Polygon7 = new Point(nLeft + round, nBottom + 1);
Point Polygon8 = new Point(nRight - round, nBottom + 1);
currentGraphicObject.FillPolygon(brush, new Point[]{ Polygon1,
Polygon3,
Polygon5,
Polygon7,
Polygon8,
Polygon6,
Polygon4,
Polygon2});
}
/// <summary>
/// 填充一个圆角矩形.
/// </summary>
/// <param name="currentGraphicObject">当前屏幕的图形对象</param>
/// <param name="lineColor">矩形线条的颜色</param>
/// <param name="rect">要填充的矩形</param>
/// <param name="indentSize">填充区域针对矩形的缩进距离</param>
/// <param name="round">圆角的半径长度</param>
public static void FillRoundRect(System.Drawing.Graphics currentGraphicObject, Brush brush, Rectangle rect, int indentSize, int round)
{
FillRoundRect(currentGraphicObject, brush, rect.Left + indentSize, rect.Top + indentSize, rect.Right - indentSize + 1, rect.Bottom - indentSize + 1, round);
}
/// <summary>
/// 填充一个圆角矩形.
/// </summary>
/// <param name="currentGraphicObject">当前屏幕的图形对象</param>
/// <param name="lineColor">矩形线条的颜色</param>
/// <param name="rect">要填充的矩形</param>
public static void FillRoundRect(System.Drawing.Graphics currentGraphicObject, Brush brush, Rectangle rect)
{
FillRoundRect(currentGraphicObject, brush, rect, 0, 2);
}
/// <summary>
/// 使图片单色化
/// </summary>
/// <param name="pimage"></param>
/// <returns></returns>
public static Bitmap MonochromeLockBits(Bitmap pimage)
{
Bitmap source = null;
// If original bitmap is not already in 32 BPP, ARGB format, then convert
if (pimage.PixelFormat != PixelFormat.Format32bppArgb)
{
source = new Bitmap(pimage.Width, pimage.Height, PixelFormat.Format32bppArgb);
source.SetResolution(pimage.HorizontalResolution, pimage.VerticalResolution);
using (Graphics g = Graphics.FromImage(source))
{
g.DrawImageUnscaled(pimage, 0, 0);
}
}
else
{
source = pimage;
}
// Lock source bitmap in memory
BitmapData sourceData = source.LockBits(new Rectangle(0, 0, source.Width, source.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
// Copy image data to binary array
int imageSize = sourceData.Stride * sourceData.Height;
byte[] sourceBuffer = new byte[imageSize];
Marshal.Copy(sourceData.Scan0, sourceBuffer, 0, imageSize);
// Unlock source bitmap
source.UnlockBits(sourceData);
// Create destination bitmap
Bitmap destination = new Bitmap(source.Width, source.Height, PixelFormat.Format1bppIndexed);
// Lock destination bitmap in memory
BitmapData destinationData = destination.LockBits(new Rectangle(0, 0, destination.Width, destination.Height), ImageLockMode.WriteOnly, PixelFormat.Format1bppIndexed);
// Create destination buffer
imageSize = destinationData.Stride * destinationData.Height;
byte[] destinationBuffer = new byte[imageSize];
int sourceIndex = 0;
int destinationIndex = 0;
int pixelTotal = 0;
byte destinationValue = 0;
int pixelValue = 128;
int height = source.Height;
int width = source.Width;
int threshold = 500;
// Iterate lines
for (int y = 0; y < height; y++)
{
sourceIndex = y * sourceData.Stride;
destinationIndex = y * destinationData.Stride;
destinationValue = 0;
pixelValue = 128;
// Iterate pixels
for (int x = 0; x < width; x++)
{
// Compute pixel brightness (i.e. total of Red, Green, and Blue values)
pixelTotal = sourceBuffer[sourceIndex + 1] + sourceBuffer[sourceIndex + 2] + sourceBuffer[sourceIndex + 3];
if (pixelTotal > threshold)
{
destinationValue += (byte)pixelValue;
}
if (pixelValue == 1)
{
destinationBuffer[destinationIndex] = destinationValue;
destinationIndex++;
destinationValue = 0;
pixelValue = 128;
}
else
{
pixelValue >>= 1;
}
sourceIndex += 4;
}
if (pixelValue != 128)
{
destinationBuffer[destinationIndex] = destinationValue;
}
}
// Copy binary image data to destination bitmap
Marshal.Copy(destinationBuffer, 0, destinationData.Scan0, imageSize);
// Unlock destination bitmap
destination.UnlockBits(destinationData);
// Dispose of source if not originally supplied bitmap
if (source != pimage)
{
source.Dispose();
}
// Return
return destination;
}
}
}

View File

@ -0,0 +1,454 @@
/* GraphicsExtension - [Extended Graphics]
* Author name: Arun Reginald Zaheeruddin
* Current version: 1.0.0.4 (12b)
* Release documentation: http://www.codeproject.com
* License information: Microsoft Public License (Ms-PL) [http://www.opensource.org/licenses/ms-pl.html]
*
* Enhancements and history
* ------------------------
* 1.0.0.1 (20 Jul 2009): Initial release with modified code from previous CodeProject article.
* 1.0.0.2 (25 Jul 2009): Added functionality that allows selected corners on a rectangle to be rounded.
* Modified code to adapt to an anti-aliased output while drawing and filling rounded rectangles.
* 1.0.0.3 (26 Jul 2009): Added DrawRoundedRectangle and FillRoundedRectangle methods that take a Rectangle and RectangleF object.
* 1.0.0.4 (27 Jul 2009): Added font metrics and measuring utility that measures a font's height, leading, ascent, etc.
*
* Issues addressed
* ----------------
* 1. Rounded rectangles - rounding edges of a rectangle.
* 2. Font Metrics - Measuring a font's height, leading, ascent, etc.
*/
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;
namespace Sheng.Winform.Controls.Drawing
{
static class GraphicsExtension
{
private static GraphicsPath GenerateRoundedRectangle(
this Graphics graphics,
RectangleF rectangle,
float radius,
RectangleEdgeFilter filter)
{
float diameter;
GraphicsPath path = new GraphicsPath();
if (radius <= 0.0F || filter == RectangleEdgeFilter.None)
{
path.AddRectangle(rectangle);
path.CloseFigure();
return path;
}
else
{
if (radius >= (Math.Min(rectangle.Width, rectangle.Height)) / 2.0)
return graphics.GenerateCapsule(rectangle);
diameter = radius * 2.0F;
SizeF sizeF = new SizeF(diameter, diameter);
RectangleF arc = new RectangleF(rectangle.Location, sizeF);
if ((RectangleEdgeFilter.TopLeft & filter) == RectangleEdgeFilter.TopLeft)
path.AddArc(arc, 180, 90);
else
{
path.AddLine(arc.X, arc.Y + arc.Height, arc.X, arc.Y);
path.AddLine(arc.X, arc.Y, arc.X + arc.Width, arc.Y);
}
arc.X = rectangle.Right - diameter;
if ((RectangleEdgeFilter.TopRight & filter) == RectangleEdgeFilter.TopRight)
path.AddArc(arc, 270, 90);
else
{
path.AddLine(arc.X, arc.Y, arc.X + arc.Width, arc.Y);
path.AddLine(arc.X + arc.Width, arc.Y + arc.Height, arc.X + arc.Width, arc.Y);
}
arc.Y = rectangle.Bottom - diameter;
if ((RectangleEdgeFilter.BottomRight & filter) == RectangleEdgeFilter.BottomRight)
path.AddArc(arc, 0, 90);
else
{
path.AddLine(arc.X + arc.Width, arc.Y, arc.X + arc.Width, arc.Y + arc.Height);
path.AddLine(arc.X, arc.Y + arc.Height, arc.X + arc.Width, arc.Y + arc.Height);
}
arc.X = rectangle.Left;
if ((RectangleEdgeFilter.BottomLeft & filter) == RectangleEdgeFilter.BottomLeft)
path.AddArc(arc, 90, 90);
else
{
path.AddLine(arc.X + arc.Width, arc.Y + arc.Height, arc.X, arc.Y + arc.Height);
path.AddLine(arc.X, arc.Y + arc.Height, arc.X, arc.Y);
}
path.CloseFigure();
}
return path;
}
private static GraphicsPath GenerateCapsule(
this Graphics graphics,
RectangleF rectangle)
{
float diameter;
RectangleF arc;
GraphicsPath path = new GraphicsPath();
try
{
if (rectangle.Width > rectangle.Height)
{
diameter = rectangle.Height;
SizeF sizeF = new SizeF(diameter, diameter);
arc = new RectangleF(rectangle.Location, sizeF);
path.AddArc(arc, 90, 180);
arc.X = rectangle.Right - diameter;
path.AddArc(arc, 270, 180);
}
else if (rectangle.Width < rectangle.Height)
{
diameter = rectangle.Width;
SizeF sizeF = new SizeF(diameter, diameter);
arc = new RectangleF(rectangle.Location, sizeF);
path.AddArc(arc, 180, 180);
arc.Y = rectangle.Bottom - diameter;
path.AddArc(arc, 0, 180);
}
else path.AddEllipse(rectangle);
}
catch { path.AddEllipse(rectangle); }
finally { path.CloseFigure(); }
return path;
}
public static void DrawRoundedRectangle(
this Graphics graphics,
Pen pen,
float x,
float y,
float width,
float height,
float radius,
RectangleEdgeFilter filter)
{
RectangleF rectangle = new RectangleF(x, y, width, height);
GraphicsPath path = graphics.GenerateRoundedRectangle(rectangle, radius, filter);
SmoothingMode old = graphics.SmoothingMode;
graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.DrawPath(pen, path);
graphics.SmoothingMode = old;
}
public static void DrawRoundedRectangle(
this Graphics graphics,
Pen pen,
float x,
float y,
float width,
float height,
float radius)
{
graphics.DrawRoundedRectangle(
pen,
x,
y,
width,
height,
radius,
RectangleEdgeFilter.All);
}
public static void DrawRoundedRectangle(
this Graphics graphics,
Pen pen,
int x,
int y,
int width,
int height,
int radius)
{
graphics.DrawRoundedRectangle(
pen,
Convert.ToSingle(x),
Convert.ToSingle(y),
Convert.ToSingle(width),
Convert.ToSingle(height),
Convert.ToSingle(radius));
}
public static void DrawRoundedRectangle(
this Graphics graphics,
Pen pen,
Rectangle rectangle,
int radius,
RectangleEdgeFilter filter)
{
graphics.DrawRoundedRectangle(
pen,
rectangle.X,
rectangle.Y,
rectangle.Width,
rectangle.Height,
radius,
filter);
}
public static void DrawRoundedRectangle(
this Graphics graphics,
Pen pen,
Rectangle rectangle,
int radius)
{
graphics.DrawRoundedRectangle(
pen,
rectangle.X,
rectangle.Y,
rectangle.Width,
rectangle.Height,
radius,
RectangleEdgeFilter.All);
}
public static void DrawRoundedRectangle(
this Graphics graphics,
Pen pen,
RectangleF rectangle,
int radius,
RectangleEdgeFilter filter)
{
graphics.DrawRoundedRectangle(
pen,
rectangle.X,
rectangle.Y,
rectangle.Width,
rectangle.Height,
radius,
filter);
}
public static void DrawRoundedRectangle(
this Graphics graphics,
Pen pen,
RectangleF rectangle,
int radius)
{
graphics.DrawRoundedRectangle(
pen,
rectangle.X,
rectangle.Y,
rectangle.Width,
rectangle.Height,
radius,
RectangleEdgeFilter.All);
}
public static void FillRoundedRectangle(
this Graphics graphics,
Brush brush,
float x,
float y,
float width,
float height,
float radius,
RectangleEdgeFilter filter)
{
RectangleF rectangle = new RectangleF(x, y, width, height);
GraphicsPath path = graphics.GenerateRoundedRectangle(rectangle, radius, filter);
SmoothingMode old = graphics.SmoothingMode;
graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.FillPath(brush, path);
graphics.SmoothingMode = old;
}
public static void FillRoundedRectangle(
this Graphics graphics,
Brush brush,
float x,
float y,
float width,
float height,
float radius)
{
graphics.FillRoundedRectangle(
brush,
x,
y,
width,
height,
radius,
RectangleEdgeFilter.All);
}
public static void FillRoundedRectangle(
this Graphics graphics,
Brush brush,
int x,
int y,
int width,
int height,
int radius)
{
graphics.FillRoundedRectangle(
brush,
Convert.ToSingle(x),
Convert.ToSingle(y),
Convert.ToSingle(width),
Convert.ToSingle(height),
Convert.ToSingle(radius));
}
public static void FillRoundedRectangle(
this Graphics graphics,
Brush brush,
Rectangle rectangle,
int radius,
RectangleEdgeFilter filter)
{
graphics.FillRoundedRectangle(
brush,
rectangle.X,
rectangle.Y,
rectangle.Width,
rectangle.Height,
radius,
filter);
}
public static void FillRoundedRectangle(
this Graphics graphics,
Brush brush,
Rectangle rectangle,
int radius)
{
graphics.FillRoundedRectangle(
brush,
rectangle.X,
rectangle.Y,
rectangle.Width,
rectangle.Height,
radius,
RectangleEdgeFilter.All);
}
public static void FillRoundedRectangle(
this Graphics graphics,
Brush brush,
RectangleF rectangle,
int radius,
RectangleEdgeFilter filter)
{
graphics.FillRoundedRectangle(
brush,
rectangle.X,
rectangle.Y,
rectangle.Width,
rectangle.Height,
radius,
filter);
}
public static void FillRoundedRectangle(
this Graphics graphics,
Brush brush,
RectangleF rectangle,
int radius)
{
graphics.FillRoundedRectangle(
brush,
rectangle.X,
rectangle.Y,
rectangle.Width,
rectangle.Height,
radius,
RectangleEdgeFilter.All);
}
public static FontMetrics GetFontMetrics(
this Graphics graphics,
Font font)
{
return FontMetricsImpl.GetFontMetrics(graphics, font);
}
private class FontMetricsImpl : FontMetrics
{
[StructLayout(LayoutKind.Sequential)]
public struct TEXTMETRIC
{
public int tmHeight;
public int tmAscent;
public int tmDescent;
public int tmInternalLeading;
public int tmExternalLeading;
public int tmAveCharWidth;
public int tmMaxCharWidth;
public int tmWeight;
public int tmOverhang;
public int tmDigitizedAspectX;
public int tmDigitizedAspectY;
public char tmFirstChar;
public char tmLastChar;
public char tmDefaultChar;
public char tmBreakChar;
public byte tmItalic;
public byte tmUnderlined;
public byte tmStruckOut;
public byte tmPitchAndFamily;
public byte tmCharSet;
}
[DllImport("gdi32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
[DllImport("gdi32.dll", CharSet = CharSet.Unicode)]
public static extern bool GetTextMetrics(IntPtr hdc, out TEXTMETRIC lptm);
[DllImport("gdi32.dll", CharSet = CharSet.Unicode)]
public static extern bool DeleteObject(IntPtr hdc);
private TEXTMETRIC GenerateTextMetrics(
Graphics graphics,
Font font)
{
IntPtr hDC = IntPtr.Zero;
TEXTMETRIC textMetric;
IntPtr hFont = IntPtr.Zero;
try
{
hDC = graphics.GetHdc();
hFont = font.ToHfont();
IntPtr hFontDefault = SelectObject(hDC, hFont);
bool result = GetTextMetrics(hDC, out textMetric);
SelectObject(hDC, hFontDefault);
}
finally
{
if (hFont != IntPtr.Zero) DeleteObject(hFont);
if (hDC != IntPtr.Zero) graphics.ReleaseHdc(hDC);
}
return textMetric;
}
private TEXTMETRIC metrics;
public override int Height { get { return this.metrics.tmHeight; } }
public override int Ascent { get { return this.metrics.tmAscent; } }
public override int Descent { get { return this.metrics.tmDescent; } }
public override int InternalLeading { get { return this.metrics.tmInternalLeading; } }
public override int ExternalLeading { get { return this.metrics.tmExternalLeading; } }
public override int AverageCharacterWidth { get { return this.metrics.tmAveCharWidth; } }
public override int MaximumCharacterWidth { get { return this.metrics.tmMaxCharWidth; } }
public override int Weight { get { return this.metrics.tmWeight; } }
public override int Overhang { get { return this.metrics.tmOverhang; } }
public override int DigitizedAspectX { get { return this.metrics.tmDigitizedAspectX; } }
public override int DigitizedAspectY { get { return this.metrics.tmDigitizedAspectY; } }
private FontMetricsImpl(Graphics graphics, Font font)
{
this.metrics = this.GenerateTextMetrics(graphics, font);
}
public static FontMetrics GetFontMetrics(
Graphics graphics,
Font font)
{
return new FontMetricsImpl(graphics, font);
}
}
public enum RectangleEdgeFilter
{
None = 0,
TopLeft = 1,
TopRight = 2,
BottomLeft = 4,
BottomRight = 8,
All = TopLeft | TopRight | BottomLeft | BottomRight
}
public abstract class FontMetrics
{
public virtual int Height { get { return 0; } }
public virtual int Ascent { get { return 0; } }
public virtual int Descent { get { return 0; } }
public virtual int InternalLeading { get { return 0; } }
public virtual int ExternalLeading { get { return 0; } }
public virtual int AverageCharacterWidth { get { return 0; } }
public virtual int MaximumCharacterWidth { get { return 0; } }
public virtual int Weight { get { return 0; } }
public virtual int Overhang { get { return 0; } }
public virtual int DigitizedAspectX { get { return 0; } }
public virtual int DigitizedAspectY { get { return 0; } }
}
}
}

View File

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Sheng.Winform.Controls
{
public delegate bool CustomValidateMethod(object sender, out string msg);
interface IShengValidate
{
/// <summary>
/// 验证失败中显示错误信息时用的标题
/// </summary>
string Title { get; set; }
/// <summary>
/// 验证失败时是否需要高亮显示(改变背景色)
/// </summary>
bool HighLight { get; set; }
/// <summary>
/// 验证控件的输入
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
bool SEValidate(out string msg);
/// <summary>
/// 自定义验证方法
/// 在基础验证都通过后,才会调用自定义验证方法(如果有)
/// </summary>
CustomValidateMethod CustomValidate { get; set; }
}
}

View File

@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sheng.Winform.Controls.Win32;
namespace Sheng.Winform.Controls.Kernal
{
public static class EnvironmentHelper
{
/// <summary>
/// 是否支持 Windows Vista 以上的玻璃效果
/// </summary>
public static bool SupportAreo
{
get
{
if (Environment.OSVersion.Version.Major < 6)
{
return false;
}
return true;
}
}
/// <summary>
/// 是否打开了玻璃效果
/// </summary>
public static bool DwmIsCompositionEnabled
{
get
{
return DwmApi.DwmIsCompositionEnabled();
}
}
/// <summary>
/// 获取应用程序主窗体
/// </summary>
public static System.Windows.Forms.Form MainForm
{
get;
set;
}
}
}

View File

@ -0,0 +1,71 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Linq.Expressions;
namespace Sheng.Winform.Controls.Kernal
{
public interface IConstructorInvoker
{
object Invoke(params object[] parameters);
}
public class ConstructorInvoker : IConstructorInvoker
{
private Func<object[], object> m_invoker;
public ConstructorInfo ConstructorInfo { get; private set; }
public ConstructorInvoker(ConstructorInfo constructorInfo)
{
this.ConstructorInfo = constructorInfo;
this.m_invoker = InitializeInvoker(constructorInfo);
}
private Func<object[], object> InitializeInvoker(ConstructorInfo constructorInfo)
{
// Target: (object)new T((T0)parameters[0], (T1)parameters[1], ...)
// parameters to execute
var parametersParameter = Expression.Parameter(typeof(object[]), "parameters");
// build parameter list
var parameterExpressions = new List<Expression>();
var paramInfos = constructorInfo.GetParameters();
for (int i = 0; i < paramInfos.Length; i++)
{
// (Ti)parameters[i]
var valueObj = Expression.ArrayIndex(parametersParameter, Expression.Constant(i));
var valueCast = Expression.Convert(valueObj, paramInfos[i].ParameterType);
parameterExpressions.Add(valueCast);
}
// new T((T0)parameters[0], (T1)parameters[1], ...)
var instanceCreate = Expression.New(constructorInfo, parameterExpressions);
// (object)new T((T0)parameters[0], (T1)parameters[1], ...)
var instanceCreateCast = Expression.Convert(instanceCreate, typeof(object));
var lambda = Expression.Lambda<Func<object[], object>>(instanceCreateCast, parametersParameter);
return lambda.Compile();
}
public object Invoke(params object[] parameters)
{
return this.m_invoker(parameters);
}
#region IConstructorInvoker Members
object IConstructorInvoker.Invoke(params object[] parameters)
{
return this.Invoke(parameters);
}
#endregion
}
}

View File

@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Diagnostics;
namespace Sheng.Winform.Controls.Kernal
{
public class ConstructorInvokerPool : FastReflectionPool<Type[], IConstructorInvoker>
{
public ConstructorInvokerPool()
{
CustomCompare = true;
}
protected override bool Compare(Type[] key1, Type[] key2)
{
return key1.SequenceEqual(key2);
}
protected override IConstructorInvoker Create(Type type, Type[] key)
{
if (type == null || key == null)
{
Debug.Assert(false, "type 或 key 为空");
throw new ArgumentNullException();
}
ConstructorInfo constructorInfo = type.GetConstructor(key);
if (constructorInfo == null)
{
Debug.Assert(false, "没有指定的ConstructorInfo");
throw new InvalidOperationException();
}
return new ConstructorInvoker(constructorInfo);
}
}
}

View File

@ -0,0 +1,74 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace Sheng.Winform.Controls.Kernal
{
/*
* Dictionary<Type, Dictionary<object, TAccessor>>
* type.GetConstructor
* Types数组GetProperty,GetMethod接收的都是一个String
* Types数组Types数组做为缓存的Key
* Eques是不会相同的使
* GetAccessorKeyFunc Type数组做为缓存的构造函数Cache查找缓存中的key
* object的话key时Type数组和object的转换
* FastReflection的目的就是追求高性能
* TKeyType来标识key的类型
*/
//这个缓存是全局的
public abstract class FastReflectionPool<TKeyType, TAccessor> : IFastReflectionPool<TKeyType,TAccessor>
{
private object _mutex = new object();
private Dictionary<Type, Dictionary<TKeyType, TAccessor>> _cache =
new Dictionary<Type, Dictionary<TKeyType, TAccessor>>();
private bool _customCompare = false;
public bool CustomCompare { get { return _customCompare; } set { _customCompare = value; } }
protected virtual bool Compare(TKeyType key1, TKeyType key2)
{
return false;
}
public TAccessor Get(Type type, TKeyType key)
{
TAccessor accessor;
Dictionary<TKeyType, TAccessor> accessorCache;
if (this._cache.TryGetValue(type, out accessorCache))
{
TKeyType accessorKey;
if (_customCompare)
{
accessorKey = accessorCache.Keys.Single((k) => { return Compare(k, key); });
}
else
{
accessorKey = key;
}
if (accessorCache.TryGetValue(key, out accessor))
{
return accessor;
}
}
lock (_mutex)
{
if (this._cache.ContainsKey(type) == false)
{
this._cache[type] = new Dictionary<TKeyType, TAccessor>();
}
accessor = Create(type, key);
this._cache[type][key] = accessor;
return accessor;
}
}
protected abstract TAccessor Create(Type type, TKeyType key);
}
}

View File

@ -0,0 +1,63 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Linq.Expressions;
namespace Sheng.Winform.Controls.Kernal
{
public interface IFieldAccessor
{
object GetValue(object instance);
}
public class FieldAccessor : IFieldAccessor
{
private Func<object, object> m_getter;
public FieldInfo FieldInfo { get; private set; }
public FieldAccessor(FieldInfo fieldInfo)
{
this.FieldInfo = fieldInfo;
}
private void InitializeGet(FieldInfo fieldInfo)
{
// target: (object)(((TInstance)instance).Field)
// preparing parameter, object type
var instance = Expression.Parameter(typeof(object), "instance");
// non-instance for static method, or ((TInstance)instance)
var instanceCast = fieldInfo.IsStatic ? null :
Expression.Convert(instance, fieldInfo.ReflectedType);
// ((TInstance)instance).Property
var fieldAccess = Expression.Field(instanceCast, fieldInfo);
// (object)(((TInstance)instance).Property)
var castFieldValue = Expression.Convert(fieldAccess, typeof(object));
// Lambda expression
var lambda = Expression.Lambda<Func<object, object>>(castFieldValue, instance);
this.m_getter = lambda.Compile();
}
public object GetValue(object instance)
{
return this.m_getter(instance);
}
#region IFieldAccessor Members
object IFieldAccessor.GetValue(object instance)
{
return this.GetValue(instance);
}
#endregion
}
}

View File

@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Diagnostics;
namespace Sheng.Winform.Controls.Kernal
{
public class FieldAccessorPool : FastReflectionPool<string,IFieldAccessor>
{
protected override IFieldAccessor Create(Type type, string key)
{
if (type == null || String.IsNullOrEmpty(key))
{
Debug.Assert(false, "type 或 key 为空");
throw new ArgumentNullException();
}
FieldInfo fieldInfo = type.GetField(key);
if (fieldInfo == null)
{
Debug.Assert(false, "没有指定的FieldInfo:" + key);
throw new MissingFieldException(key);
}
return new FieldAccessor(fieldInfo);
}
}
}

Some files were not shown because too many files have changed in this diff Show More