zoukankan      html  css  js  c++  java
  • 窗口移动--基类(BaseForm)

    #region 窗口移动
    private bool _isLeftButtonDown = false;

    public const int HTCAPTION = 0x0002;

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
    base.WndProc(ref m);

    switch (m.Msg)
    {
    case WinApi.WM_LBUTTONDOWN:
    case WinApi.WM_LBUTTONUP:

    int lParam = m.LParam.ToInt32();
    int x = lParam & 0xFFFF;
    int y = (lParam >> 16);

    switch (m.Msg)
    {
    case WinApi.WM_LBUTTONDOWN:
    if (x < Width - 20 || y > 20)
    {
    this._isLeftButtonDown = true;
    WinApi.ReleaseCapture();
    WinApi.SendMessage(this.Handle, WinApi.WM_SYSCOMMAND, WinApi.SC_MOVE + HTCAPTION, 0);
    }
    break;
    case WinApi.WM_LBUTTONUP:
    if (this._isLeftButtonDown)
    {
    this._isLeftButtonDown = false;
    if (x < Width - 20 || y > 20)
    {
    WinApi.ReleaseCapture();
    SaveLocation();
    }
    }
    break;
    }
    break;
    }
    }

    /// <summary>
    /// 保存窗口位置.
    /// </summary>
    private void SaveLocation()
    {
    if (this._isLeftButtonDown)
    {
    SavedLocation = this.Location;
    }
    }

    /// <summary>
    /// 引发 <see cref="E:System.Windows.Forms.Control.LocationChanged"/> 事件。
    /// </summary>
    /// <param name="e">包含事件数据的 <see cref="T:System.EventArgs"/>。</param>
    protected override void OnLocationChanged(EventArgs e)
    {
    const int DX = 25;
    const int DY = 25;

    Point location = this.Location;
    Rectangle rect = Screen.PrimaryScreen.WorkingArea;
    if (location.X + this.Width < DX)
    {
    location.X = DX - this.Width;
    }
    else if (location.X + DX > rect.Width)
    {
    location.X = rect.Width - DX;
    }
    if (location.Y + this.Height < DY)
    {
    location.Y = DY - this.Height;
    }
    else if (location.Y + DY > rect.Height)
    {
    location.Y = rect.Height - DY;
    }

    if (location != this.Location)
    {
    this.Location = location;
    }

    SaveLocation();
    }

    private const string SAVED_LOCATION_REGSTER_KEY = @"SoftwareAlarmClientSavedLocation";

    /// <summary>
    /// 保存路径
    /// </summary>
    private Point SavedLocation
    {
    get
    {
    int x, y;
    try
    {
    RegistryKey key = Registry.CurrentUser.OpenSubKey(SAVED_LOCATION_REGSTER_KEY);
    if (key != null)
    {
    x = (int)key.GetValue("X", 0);
    y = (int)key.GetValue("Y", 0);

    return new Point(x, y);
    }
    }
    catch (Exception ex)
    {
    TestLog.DoLog(ex);
    }

    Rectangle rect = Screen.PrimaryScreen.WorkingArea;
    x = rect.Width - this.Width;
    y = rect.Height - this.Height;
    return new Point(x, y);
    }
    set
    {
    try
    {
    RegistryKey key = Registry.CurrentUser.CreateSubKey(SAVED_LOCATION_REGSTER_KEY);
    key.SetValue("X", value.X);
    key.SetValue("Y", value.Y);
    }
    catch (Exception ex)
    {
    TestLog.DoLog(ex);
    }
    }
    }

    /// <summary>
    /// 引发 <see cref="E:System.Windows.Forms.Form.Load"/> 事件。
    /// </summary>
    /// <param name="e">包含事件数据的 <see cref="T:System.EventArgs"/>。</param>
    protected override void OnLoad(EventArgs e)
    {
    base.OnLoad(e);
    //if (this._activeWindow != IntPtr.Zero)
    //{
    // WinApi.SetActiveWindow(this._activeWindow);
    //}
    //this.Controls.EachChildFirst((Control c) =>
    //{
    // LabelX label = c as LabelX;
    // if (label == null) return false;

    // label.MouseDown += new MouseEventHandler(label_MouseDown);
    // label.MouseMove += new MouseEventHandler(label_MouseMove);

    // return true;
    //});

    // 让窗口上的每一个 LabelX 都把鼠标按下和移动的消息发送给本窗口
    MouseEventHandler down = new MouseEventHandler(label_MouseDown);
    MouseEventHandler move = new MouseEventHandler(label_MouseMove);

    // 遍历窗口中的 LabelX
    this.Controls.EachChildFirst((Control c) =>
    {
    LabelX label = c as LabelX;
    if (label == null) return false;

    label.MouseDown += down;
    label.MouseMove += move;

    return true;
    });

    // 加载初始位置
    this.Location = this.SavedLocation;
    // 设置窗口为一个圆角的矩形
    //this.Region = CreateRegion();
    }

    /// <summary>
    /// 给窗口添加圆角区域
    /// </summary>
    /// <returns></returns>
    private Region CreateRegion()
    {
    const int RX = 15;
    const int RY = 15;

    //Region region = this.Region;
    System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();
    path.FillMode = System.Drawing.Drawing2D.FillMode.Winding;
    path.AddRectangle(new Rectangle(1, RY, this.Width - 2, this.Height - (RY + RY)));
    path.AddRectangle(new Rectangle(RX, 1, this.Width - (RX + RX + 2), this.Height - 2));
    path.AddEllipse(1, 0, RX + RX, RY + RY);
    path.AddEllipse(1, this.Height - (RY + RY + 2), RX + RX, RY + RY);
    path.AddEllipse(this.Width - (RX + RX + 2), 0, RX + RX, RY + RY);
    path.AddEllipse(this.Width - (RX + RX + 2), this.Height - (RY + RY + 2), RX + RX, RY + RY);

    return new Region(path);
    }

    /// <summary>
    /// 鼠标在 LabelX 上移动时,将消息发送给窗口
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void label_MouseMove(object sender, MouseEventArgs e)
    {
    WinApi.PostMessage(this.Handle, WinApi.WM_MOUSEMOVE, 1, e.X | (e.Y << 16));
    }

    /// <summary>
    /// 鼠标在 LabelX 上按下时,将消息发送给窗口
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void label_MouseDown(object sender, MouseEventArgs e)
    {
    WinApi.PostMessage(this.Handle, WinApi.WM_LBUTTONDOWN, 1, e.X | (e.Y << 16));
    }
    #endregion

  • 相关阅读:
    第五周的学习进度情况
    周末经历之小体会
    构建之法阅读笔记5
    第四周的学习进度情况
    hashMap中如何形成循环链表的?
    代理模式
    sharing-jdbc实现读写分离及分库分表
    分库分表
    读写分离实现方式
    MySQL主从复制
  • 原文地址:https://www.cnblogs.com/Robert-huge/p/5501309.html
Copyright © 2011-2022 走看看