登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

涤心斋

淡泊以明志,宁静以致远!

 
 
 

日志

 
 

无边框窗体通过拖动改变大小的实现  

2008-08-13 18:21:08|  分类: dotnet |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  一般情况,无边框窗体用拖动来改变大小是蛮容易的。通过重载窗体的WndProc函数即可,点此处见详情!然而,我目前的情况并不适合用这种方法。
  大伙都用过暴风影音,它有一种“最小界面”,设置它以后,只看到播放区域:控制栏、菜单栏、状态栏都不可见。这时,它还能在四个角、四条边通过拖动来改变窗口的大小。我也想给我的播放器加上这个功能。毫无疑问,我得设置wmp.Dock=DockStyle.Fill。然而fill造成的结果是,鼠标消息都给了播放器控件,而窗口没有捕获鼠标消息了。所以,那种重载WndProc的方法不行了。郁闷。
  在网上查了一下,还有一种方法能实现这个功能,通过mousemove/mousedown,mouseup三事件实现。手工捕获鼠标、并改变窗口大小,这下子麻烦了。我初略实现了一下,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace TestWMP
{

    public partial class Form1 : Form
    {


        private bool bStartDrag = false;             //是否正在拖动控件的大小
        private EnumMousePosition starttPosition = EnumMousePosition.None;     //当前鼠标位置
        private Size minSize = new Size(50, 50);     //控件的最小大小

        public Form1()
        {
            InitializeComponent();
        }



        /// <summary>
        /// 获得鼠标所在区域
        /// </summary>
        /// <param name="ctl"></param>
        /// <param name="p"></param>
        /// <returns></returns>
        private EnumMousePosition GetPosition(Control ctl,Point p)
        {
            //鼠标在四个角上的判断范围
            Size s=new Size(10,10);   
           
            //在四个角上
            if (p.X >= 0 && p.X <= s.Width && p.Y >= 0 && p.Y <= s.Height) return EnumMousePosition.LeftTop;
            if (p.X >= ctl.Width - s.Width && p.X <= ctl.Width && p.Y >= 0 && p.Y <= s.Height) return EnumMousePosition.RightTop;
            if (p.X >= 0 && p.X <= s.Width && p.Y >= ctl.Height - s.Height && p.Y <= ctl.Height) return EnumMousePosition.LeftBottom;
            if (p.X >= ctl.Width - s.Width && p.X <= ctl.Width && p.Y >= ctl.Height - s.Height && p.Y <= ctl.Height) return EnumMousePosition.RightBottom;

            //不在四个角但在四条边上时
            if (p.X >= 0 && p.X <= s.Width) return EnumMousePosition.Left;
            if (p.X >= ctl.Width - s.Width && p.X <= ctl.Width) return EnumMousePosition.Right;
            if (p.Y >= 0 && p.Y <= s.Height) return EnumMousePosition.Top;
            if (p.Y >= ctl.Height - s.Height && p.Y <= ctl.Height) return EnumMousePosition.Bottom;

            return EnumMousePosition.None;

        }



        private void SetCursor(EnumMousePosition p,bool bPress)
        {
           switch (p)
           {
               case EnumMousePosition.Left:
                   this.Cursor = Cursors.SizeWE; break;
               case EnumMousePosition.Right:
                   this.Cursor = Cursors.SizeWE; break;
               case EnumMousePosition.Top:
                   this.Cursor = Cursors.SizeNS; break;
               case EnumMousePosition.Bottom:
                   this.Cursor = Cursors.SizeNS; break;
               case EnumMousePosition.LeftTop:
                   this.Cursor = Cursors.SizeNWSE; break;
               case EnumMousePosition.RightBottom:
                   this.Cursor = Cursors.SizeNWSE; break;
               case EnumMousePosition.RightTop:
                   this.Cursor = Cursors.SizeNESW; break;
               case EnumMousePosition.LeftBottom:
                   this.Cursor = Cursors.SizeNESW; break;
               case EnumMousePosition.None:
                   {
                       if(bPress&&!bStartDrag) this.Cursor = Cursors.SizeAll;
                       break;
                   }
           }
                  
        }

        private void axWindowsMediaPlayer1_MouseMoveEvent(object sender, AxWMPLib._WMPOCXEvents_MouseMoveEvent e)
        {
            //当鼠标按下左键离开窗口时仍然捕获
            wmp.Capture = true;

            System.Diagnostics.Debug.Print(e.fX.ToString());

            //鼠标当前位置
            Point cp= new Point(e.fX, e.fY);
            EnumMousePosition currentPosition = GetPosition(wmp,cp);
            bool bPress = e.nButton == 1;
            SetCursor(currentPosition, bPress);
            if (bPress)
            {
                System.Diagnostics.Debug.Print(starttPosition.ToString());
                switch (starttPosition)
                {
                    case EnumMousePosition.Left:
                        {
                            int x = cp.X;
                            cp = this.PointToScreen(cp);
                            this.Left = cp.X;
                            this.Width = this.Width - x;
                            break;
                        }
                    case EnumMousePosition.Right:
                        {
                            this.Width = cp.X;
                            break;
                        }
                    case EnumMousePosition.Top:
                        {
                            int y = cp.Y;
                            cp = this.PointToScreen(cp);
                            this.Top = cp.Y;
                            this.Height = this.Height - y;
                            break;
                        }
                    case EnumMousePosition.Bottom:
                        {
                            this.Height = cp.Y; break;
                        }
                    case EnumMousePosition.LeftTop:
                        {
                            Point p = cp;
                            cp = this.PointToScreen(cp);
                            this.Left = cp.X;
                            this.Top = cp.Y;
                            this.Width = this.Width - p.X;
                            this.Height = this.Height - p.Y;
                            break;
                        }
                    case EnumMousePosition.RightBottom:
                        {
                            this.Width = cp.X;
                            this.Height = cp.Y;
                            break;
                        }
                    case EnumMousePosition.LeftBottom:
                        {
                            Point p = cp;
                            cp = this.PointToScreen(cp);
                            this.Left = cp.X;
                            this.Width = this.Width - p.X;
                            this.Height = p.Y;
                            break;
                        }
                    case EnumMousePosition.RightTop:
                        {
                            Point p = cp;
                            cp = this.PointToScreen(cp);
                            this.Top = cp.Y;
                            this.Height = this.Height - p.Y;
                            this.Width = p.X;
                            break;
                        }

                }

                wmp.Refresh();
            }


        }




        private void wmp_MouseUpEvent(object sender, AxWMPLib._WMPOCXEvents_MouseUpEvent e)
        {
            bStartDrag = false;
            wmp.Capture = false;
            this.Cursor = Cursors.Arrow;
        }




        private void wmp_MouseDownEvent(object sender, AxWMPLib._WMPOCXEvents_MouseDownEvent e)
        {
            if (e.nButton == 1)
            {
                starttPosition = GetPosition(wmp, new Point(e.fX, e.fY));
                bStartDrag = true;
            }


           
        }
    }


        //定义一个枚举类型,描述光标状态
        public enum EnumMousePosition
        {
            Left=0,
            Right=1,
            Top=2,
            Bottom=3,
            LeftTop=4,
            RightTop=5,
            LeftBottom=6,
            RightBottom=7,
            None=-1
        }


}

  评论这张
 
阅读(1861)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018