可能你也有这种感觉,有时候遇到好文章,想保存下来,首先需要选中待复制的文字,然后Ctrl + C,再切换到文本编辑器,然后Ctrl + V,然后Ctrl + S保存,至少需要四个动作,非常麻烦,如果能够有个软件,将需要复制的文字,只能拖拽就能保存,无疑可以节省大量的时间。
有了目标,接著就是一步步实现了。首先新建一个Window Application,然后拖一个TextBox(假设名为mainText)到Form上,设置
mainText.AllowDrop = true; //允许拖拽
mainText.MaxLength = 999992767; //能接收的最大字符长度,可以自行设置
mainText.Multiline = true; // 是否多行,这个必须设置
mainText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; //有垂直滚动条,当然你可以自己设定
然后,为其添加三个事件:
//当用户在拖放操作过程中首次将鼠标光标拖到控件上时,会引发DragEnter事件
this.mainText.DragEnter += new System.Windows.Forms.DragEventHandler(this.mainText_DragEnter);
//在完成将拖拽的文字拖放到textBox时发生DragDrop事件
this.mainText.DragDrop += new System.Windows.Forms.DragEventHandler(this.mainText_DragDrop);
// 为其添加Ctrl + S保存的快捷键
this.mainText.KeyDown += new System.Windows.Forms.KeyEventHandler(this.mainText_KeyDown);
private void mainText_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.Text))
{
e.Effect = DragDropEffects.Copy;
}
}
private void mainText_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.S)
{
SaveToFile();
}
}
private void SaveToFile()
{
StreamWriter sw = new StreamWriter("拖放结果文件.txt", true, Encoding.UTF8);
sw.Write(mainText.Text);
sw.Close();
}
private void mainText_DragDrop(object sender, DragEventArgs e)
{
string enter = "";
if (cbAutoEnter.Checked)
{
enter = "\r\n";
}
//this.mainText.Text += e.Data.GetData(DataFormats.Text).ToString() + enter;
mainText.AppendText(e.Data.GetData(DataFormats.Text).ToString() + enter);
lblInfo.Text = string.Format("Total Line: {0}", mainText.Lines.Length - 1);
//实现TextBox自动滚动到最后一行,大致有三种方法:
////方法1:(比较笨的方法,如果行数过多,会频繁闪屏)
//mainText.SelectionStart = mainText.Text.Length;
//mainText.ScrollToCaret();
//// 方法2:
//mainText.Focus();
//mainText.ScrollToCaret();
//mainText.Focus();
//方法3:
int lineNumber = 1;
int EM_LINESCROLL = 0xB6;
SendMessage(mainText.Handle, EM_LINESCROLL, 0, lineNumber);
}
[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(
IntPtr hwnd,
int wMsg,
int wParam,
int lParam
);
其他,请参见附件完整源代码。
源代码。
有了目标,接著就是一步步实现了。首先新建一个Window Application,然后拖一个TextBox(假设名为mainText)到Form上,设置
mainText.AllowDrop = true; //允许拖拽
mainText.MaxLength = 999992767; //能接收的最大字符长度,可以自行设置
mainText.Multiline = true; // 是否多行,这个必须设置
mainText.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; //有垂直滚动条,当然你可以自己设定
然后,为其添加三个事件:
//当用户在拖放操作过程中首次将鼠标光标拖到控件上时,会引发DragEnter事件
this.mainText.DragEnter += new System.Windows.Forms.DragEventHandler(this.mainText_DragEnter);
//在完成将拖拽的文字拖放到textBox时发生DragDrop事件
this.mainText.DragDrop += new System.Windows.Forms.DragEventHandler(this.mainText_DragDrop);
// 为其添加Ctrl + S保存的快捷键
this.mainText.KeyDown += new System.Windows.Forms.KeyEventHandler(this.mainText_KeyDown);
private void mainText_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.Text))
{
e.Effect = DragDropEffects.Copy;
}
}
private void mainText_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.S)
{
SaveToFile();
}
}
private void SaveToFile()
{
StreamWriter sw = new StreamWriter("拖放结果文件.txt", true, Encoding.UTF8);
sw.Write(mainText.Text);
sw.Close();
}
private void mainText_DragDrop(object sender, DragEventArgs e)
{
string enter = "";
if (cbAutoEnter.Checked)
{
enter = "\r\n";
}
//this.mainText.Text += e.Data.GetData(DataFormats.Text).ToString() + enter;
mainText.AppendText(e.Data.GetData(DataFormats.Text).ToString() + enter);
lblInfo.Text = string.Format("Total Line: {0}", mainText.Lines.Length - 1);
//实现TextBox自动滚动到最后一行,大致有三种方法:
////方法1:(比较笨的方法,如果行数过多,会频繁闪屏)
//mainText.SelectionStart = mainText.Text.Length;
//mainText.ScrollToCaret();
//// 方法2:
//mainText.Focus();
//mainText.ScrollToCaret();
//mainText.Focus();
//方法3:
int lineNumber = 1;
int EM_LINESCROLL = 0xB6;
SendMessage(mainText.Handle, EM_LINESCROLL, 0, lineNumber);
}
[DllImport("user32.dll", EntryPoint = "SendMessage")]
public static extern int SendMessage(
IntPtr hwnd,
int wMsg,
int wParam,
int lParam
);
其他,请参见附件完整源代码。
源代码。