zoukankan      html  css  js  c++  java
  • C# WinForm 拖动无边框窗体 改变无边框窗体尺寸

    经常遇到这种情况、窗体的边框去掉了、然后种种问题就出来了:
    不能拖动、
    不能改变窗体大小、
    不能......
    当然、肯定有解决方案滴*^_^*
    今天的目标就是:
    可以直接拖动没有边框的窗体、
    可以直接拉拽窗体改变其大小、
    制作步骤如下:
    新建WinForm程序、添加一个启动的窗体、
    将其边框设置为None、
    进入代码编辑界面、
    定义如下常量值:
    const int Guying_HTLEFT = 10;
    const int Guying_HTRIGHT = 11;
    const int Guying_HTTOP = 12;
    const int Guying_HTTOPLEFT = 13;
    const int Guying_HTTOPRIGHT = 14;
    const int Guying_HTBOTTOM = 15;
    const int Guying_HTBOTTOMLEFT = 0x10;
    const int Guying_HTBOTTOMRIGHT = 17;
    定义用于设置的常量值
    重写系统WndProc函数:
    protected override void WndProc(ref Message m)
    {
    switch (m.Msg)
    {
    case 0x0084:
    base.WndProc(ref m);
    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)Guying_HTTOPLEFT;
    else if (vPoint.Y >= ClientSize.Height - 5)
    m.Result = (IntPtr)Guying_HTBOTTOMLEFT;
    else m.Result = (IntPtr)Guying_HTLEFT;
    else if (vPoint.X >= ClientSize.Width - 5)
    if (vPoint.Y <= 5)
    m.Result = (IntPtr)Guying_HTTOPRIGHT;
    else if (vPoint.Y >= ClientSize.Height - 5)
    m.Result = (IntPtr)Guying_HTBOTTOMRIGHT;
    else m.Result = (IntPtr)Guying_HTRIGHT;
    else if (vPoint.Y <= 5)
    m.Result = (IntPtr)Guying_HTTOP;
    else if (vPoint.Y >= ClientSize.Height - 5)
    m.Result = (IntPtr)Guying_HTBOTTOM;
    break;
    case 0x0201: //鼠标左键按下的消息
    m.Msg = 0x00A1; //更改消息为非客户区按下鼠标
    m.LParam = IntPtr.Zero; //默认值
    m.WParam = new IntPtr(2);//鼠标放在标题栏内
    base.WndProc(ref m);
    break;
    default:
    base.WndProc(ref m);
    break;
    }
    }
    重写系统WndProc函数
    OK、运行一下看看效果吧、可以拖动、可以拖拽窗体改变尺寸、、、
    呵呵、
    完整代码如下:
    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;
    namespace Demo
    {
    public partial class Frm_Main : Form
    {
    public Frm_Main()
    {
    InitializeComponent();
    StartPosition = FormStartPosition.CenterScreen;
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
    }
    const int Guying_HTLEFT = 10;
    const int Guying_HTRIGHT = 11;
    const int Guying_HTTOP = 12;
    const int Guying_HTTOPLEFT = 13;
    const int Guying_HTTOPRIGHT = 14;
    const int Guying_HTBOTTOM = 15;
    const int Guying_HTBOTTOMLEFT = 0x10;
    const int Guying_HTBOTTOMRIGHT = 17;
    protected override void WndProc(ref Message m)
    {
    switch (m.Msg)
    {
    case 0x0084:
    base.WndProc(ref m);
    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)Guying_HTTOPLEFT;
    else if (vPoint.Y >= ClientSize.Height - 5)
    m.Result = (IntPtr)Guying_HTBOTTOMLEFT;
    else m.Result = (IntPtr)Guying_HTLEFT;
    else if (vPoint.X >= ClientSize.Width - 5)
    if (vPoint.Y <= 5)
    m.Result = (IntPtr)Guying_HTTOPRIGHT;
    else if (vPoint.Y >= ClientSize.Height - 5)
    m.Result = (IntPtr)Guying_HTBOTTOMRIGHT;
    else m.Result = (IntPtr)Guying_HTRIGHT;
    else if (vPoint.Y <= 5)
    m.Result = (IntPtr)Guying_HTTOP;
    else if (vPoint.Y >= ClientSize.Height - 5)
    m.Result = (IntPtr)Guying_HTBOTTOM;
    break;
    case 0x0201: //鼠标左键按下的消息
    m.Msg = 0x00A1; //更改消息为非客户区按下鼠标
    m.LParam = IntPtr.Zero; //默认值
    m.WParam = new IntPtr(2);//鼠标放在标题栏内
    base.WndProc(ref m);
    break;
    default:
    base.WndProc(ref m);
    break;
    }
    }
    }
    }
    完整代码

  • 相关阅读:
    递归
    正则表达式的理解
    JSP九大置对象
    Cookie的使用
    sql语句按照时间段查询
    文件拷贝 上传下载 输入流输出流个人小结,仅供自己使用
    动态SQL 与sql片段 foreach
    ResultMap
    hibernate
    idea
  • 原文地址:https://www.cnblogs.com/simadi/p/3890577.html
Copyright © 2011-2022 走看看