gpt4 book ai didi

c# - 无边界和可调整大小的表单 (C#)

转载 作者:太空狗 更新时间:2023-10-29 17:43:11 26 4
gpt4 key购买 nike

我在网上找到了一些代码并复制了它,到目前为止我已经能够把所有事情都做对了,除了一件事,我想让表单(窗口)完全无边界。

我使用的是 Visual Studio 2013,这个问题只是关于使表单(窗口)无边界所需的代码。问题是,当你让它无边框时,它就不能再调整大小,但当它有边框时,它就可以调整大小。

我知道使用一些代码可以覆盖并实现两者。这是我目前所拥有的(从另一个网站复制的)。这摆脱了具有程序名称的顶部栏,通过单击和拖动表单使表单可移动,并且可以调整大小。

唯一的问题是边界仍然存在。我可以添加什么代码让边框消失?我想保留当前代码,因为它提供了一些我已经需要的功能。

顺便说一句,我查看了一些具有类似主题的较旧问题,但没有找到我需要的正确代码。

对于将我引导到另一个线程的 mod: 我尝试了那里的代码,虽然它是一个类似的问题,但这并不是我想要实现的。当我尝试该代码时,我无法单击表单(窗口)上的任何位置来移动它。另外,它在右下角有一个可调整大小的角,这不是我要找的。我需要像普通窗口一样在所有角落和侧面调整大小的功能。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BoxHider
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//Next line doesn't seem to be working
this.FormBorderStyle = FormBorderStyle.None;
}
const int WM_NCHITTEST = 0x0084;
const int HTCLIENT = 1;
const int HTCAPTION = 2;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case WM_NCHITTEST:
if (m.Result == (IntPtr)HTCLIENT)
{
m.Result = (IntPtr)HTCAPTION;
}
break;
}
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.Style |= 0x40000;
return cp;
}
}
}
}

What I need

最佳答案

试试这个:

public Form1()
{
InitializeComponent();
this.FormBorderStyle = FormBorderStyle.None;
}

protected override void WndProc(ref Message m)
{
const int RESIZE_HANDLE_SIZE = 10;

switch (m.Msg)
{
case 0x0084/*NCHITTEST*/ :
base.WndProc(ref m);

if ((int)m.Result == 0x01/*HTCLIENT*/)
{
Point screenPoint = new Point(m.LParam.ToInt32());
Point clientPoint = this.PointToClient(screenPoint);
if (clientPoint.Y <= RESIZE_HANDLE_SIZE)
{
if (clientPoint.X <= RESIZE_HANDLE_SIZE)
m.Result = (IntPtr) 13/*HTTOPLEFT*/ ;
else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
m.Result = (IntPtr) 12/*HTTOP*/ ;
else
m.Result = (IntPtr) 14/*HTTOPRIGHT*/ ;
}
else if (clientPoint.Y <= (Size.Height - RESIZE_HANDLE_SIZE))
{
if (clientPoint.X <= RESIZE_HANDLE_SIZE)
m.Result = (IntPtr) 10/*HTLEFT*/ ;
else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
m.Result = (IntPtr) 2/*HTCAPTION*/ ;
else
m.Result = (IntPtr) 11/*HTRIGHT*/ ;
}
else
{
if (clientPoint.X <= RESIZE_HANDLE_SIZE)
m.Result = (IntPtr) 16/*HTBOTTOMLEFT*/ ;
else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
m.Result = (IntPtr) 15/*HTBOTTOM*/ ;
else
m.Result = (IntPtr)17/*HTBOTTOMRIGHT*/ ;
}
}
return;
}
base.WndProc(ref m);
}

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.Style |= 0x20000; // <--- use 0x20000
return cp;
}
}

信息来源:

关于c# - 无边界和可调整大小的表单 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31199437/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com