gpt4 book ai didi

.net - Winforms:在用户控件中添加关闭 "x"按钮

转载 作者:行者123 更新时间:2023-12-05 00:53:59 26 4
gpt4 key购买 nike

我需要在用户控件的左上角添加一个关闭“x”按钮。我希望该按钮具有与通常的 Winforms 关闭按钮相似的样式(XP 样式中的蓝色等)。

有可能做这样的事情吗?

最佳答案

这是一个如何制作模拟按钮的例子。它在表单本身上这样做,但在自定义控件上的工作方式相同。

它还展示了如何使用 VisualStyleRenderer 获得“花式”按钮样式,以防 ControlPaint 样式太“旧”。

已更新经过六次编辑,我觉得我很满意。

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;

class Form1 : Form
{
[STAThread]
static void Main()
{
//Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}

public Form1()
{
SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.Opaque | ControlStyles.AllPaintingInWmPaint, true);
}

Rectangle buttonRect = new Rectangle(10, 10, 50, 20);
ButtonState buttonState = ButtonState.Normal;

protected override void OnMouseMove(MouseEventArgs e)
{
if (buttonRect.Contains(e.Location))
buttonState = Capture ? ButtonState.Pushed : ButtonState.Checked;
else
buttonState = ButtonState.Normal;
Invalidate(buttonRect);

base.OnMouseMove(e);
}

protected override void OnMouseDown(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && buttonRect.Contains(e.Location))
{
Capture = true;
buttonState = ButtonState.Pushed;
Invalidate(buttonRect);
}

base.OnMouseDown(e);
}

protected override void OnMouseUp(MouseEventArgs e)
{
if (Capture)
{
Capture = false;
Invalidate(buttonRect);
if (buttonRect.Contains(e.Location))
{
// The button was clicked

MessageBox.Show("You clicked the button.");
}
}

base.OnMouseUp(e);
}

protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.FillRectangle(SystemBrushes.Window, e.ClipRectangle);

VisualStyleRenderer renderer = null;
if (Application.RenderWithVisualStyles)
{
switch (buttonState)
{
case ButtonState.Checked:
if (VisualStyleRenderer.IsElementDefined(VisualStyleElement.Window.CloseButton.Hot))
renderer = new VisualStyleRenderer(VisualStyleElement.Window.CloseButton.Hot);
break;
case ButtonState.Pushed:
if (VisualStyleRenderer.IsElementDefined(VisualStyleElement.Window.CloseButton.Pressed))
renderer = new VisualStyleRenderer(VisualStyleElement.Window.CloseButton.Pressed);
break;
default:
if (VisualStyleRenderer.IsElementDefined(VisualStyleElement.Window.CloseButton.Normal))
renderer = new VisualStyleRenderer(VisualStyleElement.Window.CloseButton.Normal);
break;
}
}

if (renderer != null)
renderer.DrawBackground(e.Graphics, buttonRect);
else
ControlPaint.DrawCaptionButton(e.Graphics, buttonRect, CaptionButton.Close, buttonState);

base.OnPaint(e);
}
}

扩展评论

扩展操作是从用户按下鼠标按钮开始的,(可选)移动鼠标,然后释放该按钮。单击 UI 按钮始终是扩展操作。捕获鼠标的目的是防止它在操作过程中与其他窗口交互。

您现在可以看到这个演示:

首先请注意,当您将鼠标移到此页面上的元素(如评论)上时,它们如何改变背景颜色。

现在打开 Windows 运行对话框 (Win+R)。

单击“取消”或“浏览...”按钮并按住该按钮。

将鼠标移动到浏览器窗口,注意它不再记录您的鼠标移动。

这就是所有按钮的设计方式。虽然几乎没有人注意到它,因为您通常在不移动鼠标(太多)的情况下单击和释放。

将鼠标从按钮上移开并释放是一种提供给用户的机制,允许他们改变主意而不是“单击”按钮。这就是为什么您在按钮弹起事件中再次测试以确保在确定用户已执行点击之前它们仍在按钮上。

所以捕获鼠标的原因有以下三个:

首先,您不希望其他窗口执行突出显示之类的操作,因为用户正忙于与您的窗口交互,让其他窗口在操作期间执行操作会分散注意力并可能造成混淆。

其次,如果用户将鼠标一直移动到另一个窗口,您不希望将用户释放鼠标按钮的操作发送到另一个窗口。没有伴随按下的虚假鼠标释放可能会混淆编写不佳的应用程序。

第三,对于某些扩展操作,如绘画或“wrangling”,您想知道鼠标的坐标,即使它们在您的窗口边界之外。您可以通过单击并按住桌面并四处移动鼠标来查看争论的示例。请注意,即使将鼠标移到其他窗口上,矩形也会发生变化。

关于.net - Winforms:在用户控件中添加关闭 "x"按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6018980/

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