代码如下//----声明外部函数及全局变量--------------------------------------------------------------------
        [DllImport("user32")]
        private static extern bool ReleaseCapture();
        [DllImport("user32")]
        private static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
        public const int WM_SYSCOMMAND = 0x0112;
        public const int SC_MOVE = 0Xf010;
        public const int HTCAPTION = 0x0002; private void pictureBox_topmiddle_MouseDown(object sender, MouseEventArgs e)
        {
            ReleaseCapture();
            SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
        }private void pictureBox_topmiddle_DoubleClick(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Normal)
            {
                this.WindowState = FormWindowState.Maximized;
            }
            else
            {
                this.WindowState = FormWindowState.Normal;
            }
        }

解决方案 »

  1.   

    private void pictureBox
    你这picturebox到底是窗体还是图片框?
      

  2.   

    标题写有点问题,
    我想左键双击图片(pictureBox_topmiddle),可以最大化,在双击还原
      

  3.   

    噢..可是当你像控件发送这句
    SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); 
    消息后,鼠标已经被系统认为在窗体的顶部也就是标题栏按下了. 
    那你说说看你的控件怎么获得双击消息?
      

  4.   

    标题写有点问题, 
    自已做的一个窗口,标题栏是图片,
    我想左键双击图片(pictureBox_1),可以最大化,在双击还原
    代码//----声明外部函数及全局变量--------------------------------------------------------
            [DllImport("user32")] 
            private static extern bool ReleaseCapture(); 
            [DllImport("user32")] 
            private static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); 
            public const int WM_SYSCOMMAND = 0x0112; 
            public const int SC_MOVE = 0Xf010; 
            public const int HTCAPTION = 0x0002; //pictureBox_1 MouseDown事件
    private void pictureBox_1_MouseDown(object sender, MouseEventArgs e) 
            { 
                ReleaseCapture(); 
                SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); 
            } //pictureBox_1 DoubleClick事件
    private void pictureBox_1_DoubleClick(object sender, EventArgs e) 
            { 
                if (this.WindowState == FormWindowState.Normal) 
                { 
                    this.WindowState = FormWindowState.Maximized; 
                } 
                else 
                { 
                    this.WindowState = FormWindowState.Normal; 
                } 
            }但左双击pictureBox_1不执行pictureBox_1_DoubleClick事件,右双击可以执行,
    但我把pictureBox_1 MouseDown事件注释掉,左双击就能执行DoubleClick事件不知道为什么
      

  5.   


    5楼已经说了,你mousedown的时候,已经用SendMessage将它变成单击非客户区的标题了,而doubleclick是由两个mousedown(click)组成的,自然就没了
      

  6.   

    如果你坚持要吃掉mousedown的话,那doubleclick肯定没有,如果两个效果都一定要用,可以用以下变通的方法:两个全局变量,一个bool为假,一个记录时间mousedown的时候
    bool为真
    记录时间再次mousedown的时候
    如果bool为真,且时间差小于一定数值,则判断为双击
    不执行Sendmessage
    执行双击事件
    将bool置为假
      

  7.   

    试试,我在你的基础上加了 一些东西
      public Frm1()
            {
                InitializeComponent();
                pictureBox1.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
                doubleClickTimer.Tick +=new EventHandler(doubleClickTimer_Tick);
                pictureBox1.DoubleClick += new EventHandler(pictureBox1_DoubleClick);
            }
     
     
             [DllImport("user32")]
            private static extern bool ReleaseCapture();
            [DllImport("user32")]
            private static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
            public const int WM_SYSCOMMAND = 0x0112;
            public const int SC_MOVE = 0Xf010;
            public const int HTCAPTION = 0x0002;        
            Timer doubleClickTimer = new Timer();
            int DoubleClickTime;//双击对比时间
            bool msgDown = false;//表示当前鼠标左键按下是否是发送的消息        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
            {
                if (!msgDown)
                {
                    ReleaseCapture();
                    SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);                 if (e.Button == MouseButtons.Left)
                    {
                        msgDown = true;
                        DoubleClickTime = 0;
                        doubleClickTimer.Start();
                        //发送鼠标左键按下消息
                        SendMessage((sender as PictureBox).Handle, 0x201, 0, ((e.Y << 16) | (e.X & 0xffff)));
                    }
                }
     
            }
            /// <summary>
            /// 双击时间计算
            /// </summary>
            void doubleClickTimer_Tick(object sender, EventArgs e)
            {
                DoubleClickTime += 125;
                if (DoubleClickTime >= SystemInformation.DoubleClickTime)
                {
                    msgDown = false;
                    doubleClickTimer.Stop();
                }
            }        private void pictureBox1_DoubleClick(object sender, EventArgs e)
            {
                msgDown = false;
                doubleClickTimer.Stop();
                if (this.WindowState == FormWindowState.Normal)
                {
                    this.WindowState = FormWindowState.Maximized;
                }
                else
                {
                    this.WindowState = FormWindowState.Normal;
                }
            }