马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

winform实现窗口大化小化关闭功能(FormBorderStyle)

  [复制链接]
查看11940 | 回复12 | 2013-1-14 19:43:15 | 显示全部楼层 |阅读模式
为了界面好看,我们有时候会设置窗体的FormBorderStyle属性为NONE.

这时,我们的窗体就没了标题栏,我们就没办法实现窗口小化大化关闭功能。

现在我们可以自定义三个漂亮的按钮 来实现这项工作。

首先,引用命名空间

using System.Windows.Forms;
using System.Runtime.InteropServices;


二:申明win32方法,放在Form类里面

[DllImport("user32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto)]
        
public static extern int GetWindowLong(HandleRef hWnd, int nIndex);

        [DllImport(
"user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)]
        
public static extern IntPtr SetWindowLong(HandleRef hWnd, int nIndex, int dwNewLong);


三:在Form的Load事件中添加以下代码

//无标题窗体右键菜单
            int WS_SYSMENU = 0x00080000; // 系统菜单
            int WS_MINIMIZEBOX = 0x20000; // 最大最小化按钮
            int windowLong = (GetWindowLong(new HandleRef(this, this.Handle), -16));
            SetWindowLong(
new HandleRef(this, this.Handle), -16, windowLong | WS_SYSMENU | WS_MINIMIZEBOX);



第四步,把以下代码添加到Form的类中

protected override CreateParams CreateParams
{
    get
    {
        const int WS_MINIMIZEBOX = 0x00020000;  // Winuser.h中定义   
        CreateParams cp = base.CreateParams;
        cp.Style = cp.Style | WS_MINIMIZEBOX;   // 允许最小化操作   
        return cp;
    }
}



还有一种方法可以实现。 下节会讲解到。
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
金贤重 | 2013-1-14 19:49:12 | 显示全部楼层
支持~~~顶!
尹兴飞 | 2013-1-14 22:33:19 | 显示全部楼层
顶起来
ibcadmin | 2013-1-14 23:08:53 | 显示全部楼层
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
尹兴飞 | 2013-1-16 19:31:19 | 显示全部楼层
发现问题,public static extern IntPtr SetWindowLong(HandleRef hWnd, int nIndex, int dwNewLong);

默认这个在form类是没有自动using System;
大家记得先添加!
IoveBC | 2013-2-24 20:18:14 | 显示全部楼层
今天试了试,好像没有什么变化啊,大化小化关闭是不是这样:
namespace Winform大化小化关闭
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto)]
           public static extern int GetWindowLong(HandleRef hWnd, int nIndex);
        [DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)]
           public static extern IntPtr SetWindowLong(HandleRef hWnd, int nIndex, int dwNewLong);
        public Form1()
        {
            InitializeComponent();

        }
        protected override CreateParams CreateParams
        {
            get
            {
                const int WS_MINIMIZEBOX = 0x00020000;  // Winuser.h中定义   
                CreateParams cp = base.CreateParams;
                cp.Style = cp.Style | WS_MINIMIZEBOX;   // 允许最小化操作   
                return cp;
            }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //无标题窗体右键菜单
            int WS_SYSMENU = 0x00080000; // 系统菜单
            int WS_MINIMIZEBOX = 0x20000; // 最大最小化按钮
            int windowLong = (GetWindowLong(new HandleRef(this, this.Handle), -16));
            SetWindowLong(new HandleRef(this, this.Handle), -16, windowLong | WS_SYSMENU | WS_MINIMIZEBOX);
        }
    }
}
ibcadmin | 2013-2-24 21:25:35 | 显示全部楼层
IoveBC 发表于 2013-2-24 20:18
今天试了试,好像没有什么变化啊,大化小化关闭是不是这样:
namespace Winform大化小化关闭
{

我记得我有发过一篇简单实现这种方法的帖子  这种方法我自己也没用过,
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
IoveBC | 2013-2-25 08:38:14 | 显示全部楼层
不是啊,因为窗口的默认大小就是可以调节的,这个大化小化关闭的已经是默认了
ibcadmin | 2013-2-25 19:12:47 | 显示全部楼层
IoveBC 发表于 2013-2-25 08:38
不是啊,因为窗口的默认大小就是可以调节的,这个大化小化关闭的已经是默认了

你没有懂意思,  当你把窗体标题去掉的时候,就是改变窗体无标题样式的时候,窗体就没有办法动了,这时候就用到了这个
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
IoveBC | 2013-2-27 18:02:33 | 显示全部楼层
那个我也是试了的,的确,但是我在去除了标题样式的时候加了这段代码也是没有用的啊
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则