• C#创建可以随意拖动的控件


    经常进行图形界面设计的编程者肯定知道,控件在设计的时候才能随意拖动,运行的时候就不能拖动了.
    你肯定会问:运行时能随意拖动控件吗?答案是肯定的,我们的项目涉及到了这一点,我已经实现了,实际上很简单的哟.我就拿出来给你们show一下,哈哈,各位高手不要笑我哟.
    我们先从简单的入手,一步一步的来吧:
    首先,新建一个Form1,拖进去一个label1,text为:鼠标拖动控件练习.接下来就是为它注册事件了,这里我们注册的是label1_MouseUp,label1_MouseDown两个事件.在实现注册事件的代码前要先定义一个Point对象(全局),
     
    private Point mouse_offset;
     
    用来记录鼠标位置,以便平移鼠标位置.
     
    下面是label1_MouseDown的代码:
     
    private void label1_MouseDown(object sender, MouseEventArgs e)
            {
                mouse_offset = new Point(-e.X, -e.Y);
            }

    来源:(http://blog.sina.com.cn/s/blog_4a1f2422010004hm.html) - C#创建可以随意拖动的控件_wade_新浪博客

     
    是不是非常easy哟.
     
    下面是label1_MouseUp的代码:
     
    private void label1_MouseUp(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    Point mousePos = Control.MousePosition;
                    mousePos.Offset(mouse_offset.X, mouse_offset.Y);
                    ((Control)sender).Location = ((Control)sender).Parent.PointToClient(mousePos);
                }
            }
    这个比较复杂,有必要介绍下,
     
    Point mousePos = Control.MousePosition;定义一个 Point,它包含鼠标光标相对于屏幕左上角的坐标。此时记录的是当前鼠标的位置,也就是最后放控件的位置.
     
    mousePos.Offset(mouse_offset.X, mouse_offset.Y);
    是一个方法,

    Point.Offset(Int32,Int32)

    将此 Point 平移指定的量。

     

    ((Control)sender).Location = ((Control)sender).Parent.PointToClient(mousePos);
    这个里面的sender大家应该很清楚吧,就是触发事件的label1喽,((Control)sender).Location 这句话就是指定label1的位置,((Control)sender).Parent当然就代表当前的Form1了,如果Form1嵌套在另外一个Form1里面,那么后面可以在有一个.Parent,即:((Control)sender).Parent.Parent,.......依次类推喽.......

    Control.PointToClient 方法,将指定屏幕点的位置计算成工作区坐标。参数是:

    要转换的屏幕坐标 Point。

    事实工作已经完成了,很简单吧,觉得汗吧......C#创建可以随意拖动的控件

    下次介绍运行时怎样动态添加控件.C#创建可以随意拖动的控件

     下面把代码附上:

    form1.desgener////////代码

    namespace 窗体拖动1
    {
        partial class Form1
        {
            /// <summary>
            /// 必需的设计器变量。
            /// </summary>
            private System.ComponentModel.IContainer components = null;

            /// <summary>
            /// 清理所有正在使用的资源。
            /// </summary>
            /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }

            #region Windows 窗体设计器生成的代码

            /// <summary>
            /// 设计器支持所需的方法 - 不要
            /// 使用代码编辑器修改此方法的内容。
            /// </summary>
            private void InitializeComponent()
            {
                this.label1 = new System.Windows.Forms.Label();
                this.SuspendLayout();
                //
                // label1
                //
                this.label1.AutoSize = true;
                this.label1.Location = new System.Drawing.Point(92, 86);
                this.label1.Name = "label1";
                this.label1.Size = new System.Drawing.Size(101, 12);
                this.label1.TabIndex = 0;
                this.label1.Text = "鼠标拖动控件练习";
                this.label1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.label1_MouseDown);
                this.label1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.label1_MouseUp);
                //
                // Form1
                //
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(292, 266);
                this.Controls.Add(this.label1);
                this.Name = "Form1";
                this.Text = "Form1";
                this.ResumeLayout(false);
                this.PerformLayout();

            }

            #endregion

            private System.Windows.Forms.Label label1;
        }
    }

    form1.cs//////代码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace 窗体拖动1
    {
        public partial class Form1 : Form
        {
            private Point mouse_offset;
            public Form1()
            {
                InitializeComponent();
            }
            private void label1_MouseUp(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    Point mousePos = Control.MousePosition;
                    mousePos.Offset(mouse_offset.X, mouse_offset.Y);
                    ((Control)sender).Location = ((Control)sender).Parent.PointToClient(mousePos);
                }
            }

            private void label1_MouseDown(object sender, MouseEventArgs e)
            {
                mouse_offset = new Point(-e.X, -e.Y);
            }
        }
    }

     http://blog.sina.com.cn/s/blog_4a1f2422010004hm.html

    好记性不如烂博客
  • 相关阅读:
    STL
    STL
    视觉里程计- 位姿
    opencv
    C++ 智能指针auto_ptr、shared_ptr、unique_ptr《三》-----智能指针的选择
    C++ 智能指针auto_ptr、shared_ptr、unique_ptr《二》-----为何unique_ptr优于auto_ptr
    C++ 智能指针auto_ptr、shared_ptr、unique_ptr《一》-----智能指针初识
    DBow中,TF-IDF了解
    网络爬虫(CrawlSpider)
    python3 获取cookie
  • 原文地址:https://www.cnblogs.com/huazaizai/p/1766106.html
Copyright © 2020-2023  润新知