none
动态创建一个可移动、拖拽的GDI+图元,并可修改其属性! RRS feed

  • 问题

  • 在窗体上右键出现一个菜单,提供创建诸如椭圆、图标、复选框等选项。选择以后,在窗体上产生相应控件图元,并可对该图元进行移动、拖拽、缩放、修改属性等相关操作 !
    2009年9月9日 4:58

答案

  • 你好!
         如果你要拖动的是控件,可以这样来实现:
         http://blog.csdn.net/gdw_xql/archive/2006/07/24/970526.aspx
         如果你要拖动的是使用GDI+画的图形,相对麻烦一些,需要檫除旧的图形(通过在旧位置用背景色来画图形来檫掉就图形),然后在新位置画新的图形
    周雪峰
    2009年9月9日 7:07
    版主
  • 你按我的思路尝试实现拖拽效果!
    其他的效果也都要自己写代码来实现,还是比较烦琐的!
    周雪峰
    2009年9月9日 7:25
    版主

全部回复

  • 拖动示例如下,任何控件都可以拖动,改属性可以使用 PropertyGrid
    ----------------------------------------------------------------------
    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;
    using System.Data.SqlClient;
    
    namespace X.WinFormsApp
    {
        /// <summary>
        /// 标题:简单鼠标操作
        /// 日期:2009-05-11
        /// 描述:用C#怎么实现标题栏功能 左键单击退拽左键双击最大化;通过拖放改变窗体大小
        ///     
        /// </summary>
        public partial class X200905111129 : Form
        {
            public X200905111129()
            {
                InitializeComponent();
    
                this.FormBorderStyle = FormBorderStyle.None;
                this.MouseDown += new MouseEventHandler(X200905111129_MouseDown);
                this.MouseMove += new MouseEventHandler(X200905111129_MouseMove);
                this.DoubleClick += new EventHandler(X200905111129_DoubleClick);
            }
    
            #region " 拖动无边框窗体 "
    
            private void X200905111129_DoubleClick(object sender, EventArgs e)
            {
                this.WindowState = FormWindowState.Maximized;
            }
    
            private Point fPoint;
    
            private void X200905111129_MouseDown(object sender, MouseEventArgs e)
            {
                fPoint = e.Location;
            }
    
            private void X200905111129_MouseMove(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    int fNewX = this.Location.X + e.X - fPoint.X;
                    int fNewY = this.Location.Y + e.Y - fPoint.Y;
                    this.Location = new Point(fNewX, fNewY);
                }
            }
    
            #endregion
    
            #region " 改变无边框窗体大小 "
    
            const int WM_NCHITTEST = 0x0084;
            const int HTLEFT = 10;
            const int HTRIGHT = 11;
            const int HTTOP = 12;
            const int HTTOPLEFT = 13;
            const int HTTOPRIGHT = 14;
            const int HTBOTTOM = 15;
            const int HTBOTTOMLEFT = 0x10;
            const int HTBOTTOMRIGHT = 17;
    
            protected override void WndProc(ref Message m)
            {
                base.WndProc(ref m);
                switch (m.Msg)
                {
                    case WM_NCHITTEST:
                        Point vPoint = new Point((int)m.LParam & 0xFFFF,
                            (int)m.LParam >> 16 & 0xFFFF);
                        vPoint = PointToClient(vPoint);
                        if (vPoint.X <= 5)
                            if (vPoint.Y <= 5)
                                m.Result = (IntPtr)HTTOPLEFT;
                            else if (vPoint.Y >= ClientSize.Height - 5)
                                m.Result = (IntPtr)HTBOTTOMLEFT;
                            else m.Result = (IntPtr)HTLEFT;
                        else if (vPoint.X >= ClientSize.Width - 5)
                            if (vPoint.Y <= 5)
                                m.Result = (IntPtr)HTTOPRIGHT;
                            else if (vPoint.Y >= ClientSize.Height - 5)
                                m.Result = (IntPtr)HTBOTTOMRIGHT;
                            else m.Result = (IntPtr)HTRIGHT;
                        else if (vPoint.Y <= 5)
                            m.Result = (IntPtr)HTTOP;
                        else if (vPoint.Y >= ClientSize.Height - 5)
                            m.Result = (IntPtr)HTBOTTOM;
                        break;
                }
            }
    
            #endregion
    
        }
    }
    


    知识改变命运,奋斗成就人生!
    2009年9月9日 5:58
    版主
  • 你好!
         如果你要拖动的是控件,可以这样来实现:
         http://blog.csdn.net/gdw_xql/archive/2006/07/24/970526.aspx
         如果你要拖动的是使用GDI+画的图形,相对麻烦一些,需要檫除旧的图形(通过在旧位置用背景色来画图形来檫掉就图形),然后在新位置画新的图形
    周雪峰
    2009年9月9日 7:07
    版主
  • 谢谢。。。。

    拖动的是使用GDI+绘制的图形!

    窗体上放的是诸如椭圆、图标、矩形等GDI+ 绘制的图形, 当在某一个图元上点右键出现一个下拉菜单,有属性修改的操作。同时当点了该图元时,该图元选中,表示可缩放状态,根据鼠标的位置显示鼠标的样式如南北、东西、东南等。并可直接拖拽修改。
    2009年9月9日 7:15
  • 你按我的思路尝试实现拖拽效果!
    其他的效果也都要自己写代码来实现,还是比较烦琐的!
    周雪峰
    2009年9月9日 7:25
    版主

  • 很感谢得到您的帮助!

    拖拽的功能已经实现,问题是缩放、修改该图远的属性 !希望您不吝赐教 !谢谢...

    如果你不介意的话,麻烦你把QQ或者MSN说一下,可否加您为好友 !
    2009年9月9日 7:29
  • 缩放效果需要把源图形檫除,重新画一个大的图形,或小的图形。
    修改属性,也是重画而已!

    我没有QQ,这是我的MSN:xuefeng1982@live.cn
    很高兴认识你,我是周雪峰
    周雪峰
    2009年9月9日 10:33
    版主