同洲共际海让路@小舟侧盼千帆过,扬帆寻她千百度
+U, 抬头仰望,低头思索@同洲共际海让路
    可能你也有这种感觉,有时候遇到好文章,想保存下来,首先需要选中待复制的文字,然后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
        );

    其他,请参见附件完整源代码。

    源代码。

posted on 2007-11-01 14:51  同洲共际海让路  阅读(405)  评论(0编辑  收藏  举报