6.3 C# 2w字详解用户交互界面(滚动条、定时器、菜单、鼠标事件、简易文本编辑器)


6.3.1 C# 滚动条和进度条

以下是关于C#中滚动条(ScrollBar)和进度条(ProgressBar)控件属性的表格:

属性名称描述
ValueValue值的大小决定了滚动条中滑块的位置,反之亦然。
Minimum设置或获取滚动条的最小值,默认为0。
Maximum设置或获取滚动条的最大值,默认为100。
SmallChange设置或获取滚动条的小变化量,即点击滚动条端点箭头时滑块移动的量。
LargeChange设置或获取滚动条的大变化量,即在滑块与端点之间点击滚动条时滑块移动的量。

滚动条(ScrollBar)

滚动条控件允许用户通过移动滑块在最小值和最大值之间进行选择。

进度条(ProgressBar)

进度条控件用于显示操作进度的百分比完成度。

示例代码

以下是如何使用滚动条和进度条控件的属性的示例:

using System;
using System.Windows.Forms;

public class ScrollBarAndProgressBarExample : Form
{
    private ScrollBar scrollBar1;
    private ProgressBar progressBar1;

    public ScrollBarAndProgressBarExample()
    {
        scrollBar1 = new ScrollBar
        {
            Location = new System.Drawing.Point(10, 10),
            Size = new System.Drawing.Size(100, 20),
            Minimum = 0,
            Maximum = 100,
            SmallChange = 1,
            LargeChange = 10
        };
        scrollBar1.Scroll += ScrollBar1_Scroll;
        
        progressBar1 = new ProgressBar
        {
            Location = new System.Drawing.Point(10, 40),
            Size = new System.Drawing.Size(100, 20),
            Minimum = 0,
            Maximum = 100,
            Value = 50
        };

        Controls.Add(scrollBar1);
        Controls.Add(progressBar1);
    }

    private void ScrollBar1_Scroll(object sender, EventArgs e)
    {
        // 同步滚动条和进度条的Value值
        progressBar1.Value = scrollBar1.Value;
    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new ScrollBarAndProgressBarExample());
    }
}

说明

  1. 滚动条:创建一个ScrollBar对象,并设置其位置、大小、最小值、最大值、小变化量和大变化量。为Scroll事件添加事件处理程序以同步进度条的值。
  2. 进度条:创建一个ProgressBar对象,并设置其位置、大小、最小值、最大值和初始值。
  3. 事件处理:在滚动条的Scroll事件处理程序中,将滚动条的Value值同步到进度条。

这个示例展示了如何使用滚动条和进度条控件的属性来创建一个简单的界面,允许用户通过滚动条控制进度条的进度。

滚动条的事件

滚动条(ScrollBar)事件

以下是滚动条控件中两个常用事件的描述:

  1. ValueChanged事件

    • 描述:当通过Scroll事件或以编程方式更改Value属性时发生。
    • 代码示例
      private void scrollBar1_ValueChanged(object sender, EventArgs e)
      {
          MessageBox.Show($"滚动条的值已更改为:{scrollBar1.Value}");
      }
      
  2. Scroll事件

    • 描述:在通过鼠标或键盘操作移动滚动框后发生。
    • 代码示例
      private void scrollBar1_Scroll(object sender, ScrollEventArgs e)
      {
          // 可以根据e.Type来确定滚动的具体方式
          if (e.Type == ScrollEventType.ThumbPosition)
          {
              MessageBox.Show($"滚动条移动,当前值:{scrollBar1.Value}");
          }
      }
      

示例代码

以下是如何使用滚动条事件的完整示例:

using System;
using System.Windows.Forms;

public class ScrollBarExample : Form
{
    private ScrollBar scrollBar1;
    private Label labelValue;

    public ScrollBarExample()
    {
        scrollBar1 = new ScrollBar
        {
            Location = new System.Drawing.Point(10, 10),
            Size = new System.Drawing.Size(100, 20),
            Minimum = 0,
            Maximum = 100
        };
        scrollBar1.ValueChanged += scrollBar1_ValueChanged;
        scrollBar1.Scroll += scrollBar1_Scroll;

        labelValue = new Label
        {
            Text = "滚动条值:0",
            Location = new System.Drawing.Point(10, 40)
        };

        Controls.Add(scrollBar1);
        Controls.Add(labelValue);
    }

    private void scrollBar1_ValueChanged(object sender, EventArgs e)
    {
        // 更新标签以显示滚动条的当前值
        labelValue.Text = $"滚动条值:{scrollBar1.Value}";
    }

    private void scrollBar1_Scroll(object sender, ScrollEventArgs e)
    {
        // 可以根据e.Type来确定滚动的具体方式
        if (e.Type == ScrollEventType.ThumbPosition)
        {
            // 滚动条的滑块位置被手动更改
            labelValue.Text = $"滚动条移动,当前值:{scrollBar1.Value}";
        }
    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new ScrollBarExample());
    }
}

说明

  1. ValueChanged事件:当滚动条的值发生变化时,无论是通过用户操作还是程序设置,都会触发此事件。在此事件处理程序中,我们更新了一个标签来显示当前的滚动条值。

  2. Scroll事件:当用户通过鼠标或键盘操作滚动条时,此事件将被触发。在事件处理程序中,我们检查了滚动事件的类型,如果是由于滑块位置的移动(ThumbPosition),则更新标签显示当前值。

这个示例展示了如何使用滚动条的ValueChangedScroll事件来响应用户的操作,并在界面上显示当前的滚动条值。

进度条

在C#的Windows Forms应用程序中,ProgressBar控件用于显示操作进度的百分比完成度。以下是ProgressBar控件的两个重要属性的简单描述:

属性

  1. Maximum

    • 描述:获取或设置进度条的最大计数值。
    • 使用:用于设置进度条可以达到的最高值,通常对应于100%的进度。
    • 代码示例
      progressBar1.Maximum = 100;
      
  2. Minimum

    • 描述:获取或设置进度条的最小计数值。
    • 使用:用于设置进度条的起始值,通常对应于0%的进度。
    • 代码示例
      progressBar1.Minimum = 0;
      
  3. Value

    • 描述:获取或设置进度条的当前计数值。
    • 使用:用于更新进度条以显示当前进度。
    • 代码示例
      progressBar1.Value = 50;
      

【例6-3】滚动条和进度条应用。

在C#的Windows Forms应用程序中,进度条(ProgressBar)控件用于显示操作进度的百分比完成度。以下是进度条控件的一些重要属性:

进度条(ProgressBar)属性

属性名称描述
Maximum获取或设置进度条的最大值。
Minimum获取或设置进度条的最小值。
Value获取或设置进度条的当前值。

示例代码

以下是如何使用滚动条来控制序列长度,并使用进度条显示处理进度的示例:

using System;
using System.Windows.Forms;
using System.Threading.Tasks;

public class ScrollbarAndProgressBarExample : Form
{
    private NumericUpDown sequenceLengthControl;
    private ProgressBar progressBar;
    private Button startButton;

    public ScrollbarAndProgressBarExample()
    {
        InitializeControls();
    }

    private void InitializeControls()
    {
        // 初始化序列长度控制(滚动条)
        sequenceLengthControl = new NumericUpDown
        {
            Location = new System.Drawing.Point(10, 10),
            Minimum = 1,
            Maximum = 100,
            Value = 1
        };

        // 初始化进度条
        progressBar = new ProgressBar
        {
            Location = new System.Drawing.Point(10, 40),
            Size = new System.Drawing.Size(200, 20)
        };

        // 初始化开始处理的按钮
        startButton = new Button
        {
            Text = "开始处理",
            Location = new System.Drawing.Point(10, 70)
        };
        startButton.Click += StartButton_Click;

        // 将控件添加到窗体
        Controls.Add(sequenceLengthControl);
        Controls.Add(progressBar);
        Controls.Add(startButton);
    }

    private async void StartButton_Click(object sender, EventArgs e)
    {
        int length = (int)sequenceLengthControl.Value;
        progressBar.Minimum = 0;
        progressBar.Maximum = length;
        progressBar.Value = 0;

        for (int i = 0; i < length; i++)
        {
            progressBar.Value = i;
            // 模拟处理操作
            await Task.Delay(100); // 模拟耗时操作
        }
    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new ScrollbarAndProgressBarExample());
    }
}

说明

  1. NumericUpDown控件:允许用户选择参与运算的序列的长度。这里我们使用NumericUpDown控件来代替水平滚动条,因为它提供了更精确的数值输入和选择。

  2. 进度条:显示不同长度序列的处理进度。进度条的最大值将被设置为序列长度的值。

  3. 开始按钮:用户点击此按钮后,将开始处理序列,并更新进度条的当前进度。

  4. 异步处理:使用Task.Delay来模拟处理操作的耗时。在实际应用中,这里可以替换为实际的数据处理逻辑。

这个示例展示了如何使用滚动条(在这里我们使用了NumericUpDown控件)和进度条来控制和显示数据处理的进度。

6.3.2 C# 定时器

在C#的Windows Forms应用程序中,定时器(Timer)控件用于在指定的时间间隔后执行操作。

定时器(Timer)属性

属性名称描述
Enabled获取或设置定时器是否激活。
Interval获取或设置触发Tick事件的时间间隔(毫秒)。

定时器事件

事件名称描述
Tick当达到设置的时间间隔时触发。

定时器方法

方法名称描述
Start开始计时。
Stop停止计时。

示例代码:实时时钟

以下是使用定时器控件创建实时时钟的示例:

using System;
using System.Windows.Forms;

public class RealTimeClock : Form
{
    private Timer timer1;
    private Label timeLabel;

    public RealTimeClock()
    {
        InitializeComponent();
    }

    private void InitializeComponent()
    {
        timer1 = new Timer
        {
            Interval = 1000, // 设置定时器的时间间隔为1秒
            Enabled = true    // 启动定时器
        };
        timer1.Tick += Timer1_Tick;

        timeLabel = new Label
        {
            Location = new System.Drawing.Point(10, 20),
            Size = new System.Drawing.Size(200, 30),
            Text = DateTime.Now.ToString("HH:mm:ss")
        };

        Controls.Add(timeLabel);
    }

    private void Timer1_Tick(object sender, EventArgs e)
    {
        timeLabel.Text = DateTime.Now.ToString("HH:mm:ss"); // 更新时间
    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new RealTimeClock());
    }
}

说明

  1. 初始化定时器:创建一个Timer对象,并设置其Interval属性为1000毫秒(1秒),并将其Enabled属性设置为true以启动定时器。

  2. 事件处理:为定时器的Tick事件添加事件处理程序Timer1_Tick。每次定时器触发时,都会调用该事件处理程序。

  3. 更新时间:在Timer1_Tick事件处理程序中,更新标签timeLabel的文本以显示当前时间。

  4. 标签:创建一个Label控件来显示时间,并将其添加到窗体。

这个示例展示了如何使用定时器控件创建一个简单的实时时钟,定时器每秒更新一次时间,并显示在标签上。

6.3.3菜单设计

在C#的Windows Forms应用程序中,菜单为用户提供了一种方便的方式来访问应用程序的功能。以下是菜单设计的概述以及如何使用MenuStripContextMenuStrip控件。

菜单设计概述

菜单是用户界面中的一种工具条,它列出了可以执行的命令。菜单项可以包含子菜单,从而创建分层的命令结构。

MenuStrip的常见属性

属性名称描述
Items获取菜单项的集合。
DockStyle获取或设置MenuStrip停靠在父控件的哪个边缘。
RenderMode获取或设置用于绘制MenuStrip的样式。

MenuStrip的常用事件

事件名称描述
ItemClicked当用户单击菜单项时触发。

菜单项ToolStripMenuItem

ToolStripMenuItemMenuStrip中每个菜单项的类型。

属性名称描述
Text获取或设置菜单项的显示文本。
ShortcutKeys获取或设置菜单项的快捷键。
Image获取或设置显示在菜单项旁边的图像。
Checked获取或设置一个值,该值指示菜单项是否被勾选。
DropDownItems获取菜单项的子菜单项集合。

弹出菜单ContextMenuStrip

ContextMenuStrip用于创建在用户右击控件时显示的弹出菜单。

属性名称描述
Items获取弹出菜单项的集合。
SourceControl获取或设置弹出菜单关联的控件。

示例代码:创建菜单

以下是如何使用MenuStripContextMenuStrip控件的示例:

using System;
using System.Windows.Forms;

public class MenuExample : Form
{
    private MenuStrip menuStrip;
    private ToolStripMenuItem fileMenuItem;
    private ToolStripMenuItem editMenuItem;
    private ContextMenuStrip contextMenuStrip;

    public MenuExample()
    {
        InitializeMenuStrip();
        InitializeContextMenuStrip();
    }

    private void InitializeMenuStrip()
    {
        menuStrip = new MenuStrip();
        fileMenuItem = new ToolStripMenuItem("文件(F)", null, new EventHandler(MenuItem_Click));
        editMenuItem = new ToolStripMenuItem("编辑(E)", null, new EventHandler(MenuItem_Click));

        menuStrip.Items.Add(fileMenuItem);
        menuStrip.Items.Add(editMenuItem);
        Controls.Add(menuStrip);
        menuStrip.Dock = DockStyle.Top;
    }

    private void InitializeContextMenuStrip()
    {
        contextMenuStrip = new ContextMenuStrip();
        ToolStripMenuItem openItem = new ToolStripMenuItem("打开(O)");
        ToolStripMenuItem exitItem = new ToolStripMenuItem("退出(Q)");

        contextMenuStrip.Items.Add(openItem);
        contextMenuStrip.Items.Add(exitItem);

        // 关联到窗体
        this.ContextMenuStrip = contextMenuStrip;
    }

    private void MenuItem_Click(object sender, EventArgs e)
    {
        ToolStripMenuItem clickedItem = sender as ToolStripMenuItem;
        MessageBox.Show("你点击了:" + clickedItem.Text);
    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MenuExample());
    }
}

说明

  1. MenuStrip:创建一个MenuStrip对象,并添加两个菜单项:文件和编辑。

  2. ContextMenuStrip:创建一个ContextMenuStrip对象,并添加两个弹出菜单项:打开和退出。

  3. 事件处理:为菜单项的点击事件添加事件处理程序MenuItem_Click

这个示例展示了如何创建一个带有菜单和弹出菜单的窗体,并为菜单项添加事件处理程序。当用户点击菜单项时,会显示一个消息框。

创建主菜单 【例6-5】文本编辑器。

创建一个简单的文本编辑器应用程序的主菜单,我们将使用MenuStrip控件来实现。以下是主菜单的设计,包括文件、编辑和视图三个主要菜单项,以及它们各自的子菜单项。

主菜单设计

  1. 文件

    • 新建
    • 打开
    • 保存
    • 另存为…
    • 退出
  2. 编辑

    • 撤销
    • 重做
    • 剪切
    • 复制
    • 粘贴
    • 删除
    • 查找…
    • 替换…
  3. 视图

    • 工具栏
    • 状态栏

示例代码

以下是如何实现上述文本编辑器主菜单的代码示例:

using System;
using System.Windows.Forms;

public class TextEditor : Form
{
    private MenuStrip menuStrip;
    private ToolStripMenuItem fileMenuItem;
    private ToolStripMenuItem editMenuItem;
    private ToolStripMenuItem viewMenuItem;
    private ToolStripMenuItem exitMenuItem;
    private ToolStripMenuItem newMenuItem;
    private ToolStripMenuItem openMenuItem;
    private ToolStripMenuItem saveMenuItem;
    private ToolStripMenuItem saveAsMenuItem;
    private ToolStripMenuItem undoMenuItem;
    private ToolStripMenuItem redoMenuItem;
    private ToolStripMenuItem cutMenuItem;
    private ToolStripMenuItem copyMenuItem;
    private ToolStripMenuItem pasteMenuItem;
    private ToolStripMenuItem deleteMenuItem;
    private ToolStripMenuItem findMenuItem;
    private ToolStripMenuItem replaceMenuItem;
    private ToolStripMenuItem toolbarMenuItem;
    private ToolStripMenuItem statusBarMenuItem;
    private RichTextBox richTextBox;
    private ToolStrip toolStrip;
    private StatusStrip statusStrip;
    private ToolStripButton newToolStripButton;
    private ToolStripButton openToolStripButton;
    private ToolStripButton saveToolStripButton;
    private ToolStripButton cutToolStripButton;
    private ToolStripButton copyToolStripButton;
    private ToolStripButton pasteToolStripButton;

    public TextEditor()
    {
        InitializeMenuStrip();
        InitializeToolStrip();
        InitializeStatusStrip();
        InitializeRichTextBox();
    }

    private void InitializeMenuStrip()
    {
        menuStrip = new MenuStrip();
        fileMenuItem = new ToolStripMenuItem("文件(F)");
        editMenuItem = new ToolStripMenuItem("编辑(E)");
        viewMenuItem = new ToolStripMenuItem("视图(V)");

        exitMenuItem = new ToolStripMenuItem("退出(X)", null, Exit_Click);
        newMenuItem = new ToolStripMenuItem("新建(N)", null, New_Click);
        openMenuItem = new ToolStripMenuItem("打开(O)", null, Open_Click);
        saveMenuItem = new ToolStripMenuItem("保存(S)", null, Save_Click);
        saveAsMenuItem = new ToolStripMenuItem("另存为...(A)", null, SaveAs_Click);
        undoMenuItem = new ToolStripMenuItem("撤销(U)", null, Undo_Click);
        redoMenuItem = new ToolStripMenuItem("重做(R)", null, Redo_Click);
        cutMenuItem = new ToolStripMenuItem("剪切(T)", null, Cut_Click);
        copyMenuItem = new ToolStripMenuItem("复制(C)", null, Copy_Click);
        pasteMenuItem = new ToolStripMenuItem("粘贴(P)", null, Paste_Click);
        deleteMenuItem = new ToolStripMenuItem("删除(L)", null, Delete_Click);
        findMenuItem = new ToolStripMenuItem("查找...(F)", null, Find_Click);
        replaceMenuItem = new ToolStripMenuItem("替换...(R)", null, Replace_Click);
        toolbarMenuItem = new ToolStripMenuItem("工具栏(T)");
        statusBarMenuItem = new ToolStripMenuItem("状态栏(S)");

        fileMenuItem.DropDownItems.Add(newMenuItem);
        fileMenuItem.DropDownItems.Add(openMenuItem);
        fileMenuItem.DropDownItems.Add(saveMenuItem);
        fileMenuItem.DropDownItems.Add(saveAsMenuItem);
        fileMenuItem.DropDownItems.Add(new ToolStripSeparator());
        fileMenuItem.DropDownItems.Add(exitMenuItem);

        editMenuItem.DropDownItems.Add(undoMenuItem);
        editMenuItem.DropDownItems.Add(redoMenuItem);
        editMenuItem.DropDownItems.Add(new ToolStripSeparator());
        editMenuItem.DropDownItems.Add(cutMenuItem);
        editMenuItem.DropDownItems.Add(copyMenuItem);
        editMenuItem.DropDownItems.Add(pasteMenuItem);
        editMenuItem.DropDownItems.Add(deleteMenuItem);
        editMenuItem.DropDownItems.Add(new ToolStripSeparator());
        editMenuItem.DropDownItems.Add(findMenuItem);
        editMenuItem.DropDownItems.Add(replaceMenuItem);

        viewMenuItem.DropDownItems.Add(toolbarMenuItem);
        viewMenuItem.DropDownItems.Add(statusBarItem);

        menuStrip.Items.Add(fileMenuItem);
        menuStrip.Items.Add(editMenuItem);
        menuStrip.Items.Add(viewMenuItem);

        Controls.Add(menuStrip);
        menuStrip.Dock = DockStyle.Top;
    }

    private void InitializeToolStrip()
    {
        toolStrip = new ToolStrip();
        newToolStripButton = new ToolStripButton("新建", null, New_Click);
        openToolStripButton = new ToolStripButton("打开", null, Open_Click);
        saveToolStripButton = new ToolStripButton("保存", null, Save_Click);
        cutToolStripButton = new ToolStripButton("剪切", null, Cut_Click);
        copyToolStripButton = new ToolStripButton("复制", null, Copy_Click);
        pasteToolStripButton = new ToolStripButton("粘贴", null, Paste_Click);

        toolStrip.Items.Add(newToolStripButton);
        toolStrip.Items.Add(openToolStripButton);
        toolStrip.Items.Add(saveToolStripButton);
        toolStrip.Items.Add(new ToolStripSeparator());
        toolStrip.Items.Add(cutToolStripButton);
        toolStrip.Items.Add(copyToolStripButton);
        toolStrip.Items.Add(pasteToolStripButton);

        Controls.Add(toolStrip);
        toolStrip.Dock = DockStyle.Top;
    }

    private void InitializeStatusStrip()
    {
        statusStrip = new StatusStrip();
        Controls.Add(statusStrip);
        statusStrip.Dock = DockStyle.Bottom;
    }

    private void InitializeRichTextBox()
    {
        richTextBox = new RichTextBox();
        richTextBox.Dock = DockStyle.Fill;
        Controls.Add(richTextBox);
    }

    private void New_Click(object sender, EventArgs e)
    {
        richTextBox.Clear();
    }

    private void Open_Click(object sender, EventArgs e)
    {
        // 实现打开文件的逻辑
    }

    private void Save_Click(object sender, EventArgs e)
    {
        // 实现保存文件的逻辑
    }

    private void SaveAs_Click(object sender, EventArgs e)
    {
        // 实现另存为的逻辑
    }

    private void Undo_Click(object sender, EventArgs e)
    {
        richTextBox.Undo();
    }

    private void Redo_Click(object sender, EventArgs e)
    {
        richTextBox.Redo();
    }

    private void Cut_Click(object sender, EventArgs e)
    {
        richTextBox.Cut();
    }

    private void Copy_Click(object sender, EventArgs e)
    {
        richTextBox.Copy();
    }

    private void Paste_Click(object sender, EventArgs e)
    {
        richTextBox.Paste();
    }

    private void Delete_Click(object sender, EventArgs e)
    {
        richTextBox.SelectedText = "";
    }

    private void Find_Click(object sender, EventArgs e)
    {
        // 实现查找的逻辑
    }

    private void Replace_Click(object sender, EventArgs e)
    {
        // 实现替换的逻辑
    }

    private void Exit_Click(object sender, EventArgs e)
    {
        Close();
    }

    private void ToggleToolbar.CheckedChanged(object sender, EventArgs e)
    {
        toolStrip.Visible = toolbarMenuItem.Checked;
    }

    private void ToggleStatusBar.CheckedChanged(object sender, EventArgs e)
    {
        statusStrip.Visible = statusBarMenuItem.Checked;
    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new TextEditor());
    }
}

说明

  1. 初始化主菜单:创建一个MenuStrip对象,并添加文件、编辑和视图三个菜单项及其子菜单项。

  2. 初始化工具栏:创建一个ToolStrip对象,并添加与文件和编辑菜单项对应的工具栏按钮。

  3. 初始化状态栏:创建一个StatusStrip对象。

  4. 初始化富文本框:创建一个RichTextBox对象,用于文本编辑。

  5. 事件处理:为菜单项和工具栏按钮的点击事件添加事件处理程序。

  6. 切换工具栏和状态栏:为视图菜单中的“工具栏”和“状态栏”菜单项添加了CheckedChanged事件处理程序,以切换工具栏和状态栏的可见性。

这个示例展示了如何创建一个带有完整主菜单的简单文本编辑器应用程序,包括文件操作、编辑操作和视图切换。

6.3.4 鼠标事件

在C#的Windows Forms应用程序中,鼠标事件允许您响应用户与鼠标的交互。以下是常见的鼠标事件以及它们的描述:

事件名称描述
MouseClick当鼠标左键单击控件时触发。
MouseDoubleClick当鼠标左键双击控件时触发。
MouseDown当鼠标任一按钮在控件的某个位置按下时触发。
MouseUp当鼠标任一按钮在控件的某个位置释放时触发。
MouseEnter当鼠标进入控件的界限时触发。
MouseLeave当鼠标离开控件的界限时触发。
MouseHover当鼠标悬停在控件上时触发。
MouseMove当鼠标在控件的某个位置移动时触发。
MouseWheel当鼠标滚轮在控件的某个位置滚动时触发。

示例代码

以下是如何使用鼠标事件的示例:

using System;
using System.Windows.Forms;

public class MouseEventsForm : Form
{
    private Label labelMousePosition;

    public MouseEventsForm()
    {
        labelMousePosition = new Label
        {
            Location = new System.Drawing.Point(10, 10),
            Size = new System.Drawing.Size(200, 20),
            Text = "鼠标位置:X = 0, Y = 0"
        };

        this.MouseClick += MouseEventsForm_MouseClick;
        this.MouseDoubleClick += MouseEventsForm_MouseDoubleClick;
        this.MouseDown += MouseEventsForm_MouseDown;
        this.MouseUp += MouseEventsForm_MouseUp;
        this.MouseEnter += MouseEventsForm_MouseEnter;
        this.MouseLeave += MouseEventsForm_MouseLeave;
        this.MouseHover += MouseEventsForm_MouseHover;
        this.MouseMove += MouseEventsForm_MouseMove;
        this.MouseWheel += MouseEventsForm_MouseWheel;

        Controls.Add(labelMousePosition);
    }

    private void MouseEventsForm_MouseClick(object sender, MouseEventArgs e)
    {
        MessageBox.Show("MouseClick");
    }

    private void MouseEventsForm_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        MessageBox.Show("MouseDoubleClick");
    }

    private void MouseEventsForm_MouseDown(object sender, MouseEventArgs e)
    {
        MessageBox.Show("MouseDown");
    }

    private void MouseEventsForm_MouseUp(object sender, MouseEventArgs e)
    {
        MessageBox.Show("MouseUp");
    }

    private void MouseEventsForm_MouseEnter(object sender, EventArgs e)
    {
        labelMousePosition.Text = "MouseEnter";
    }

    private void MouseEventsForm_MouseLeave(object sender, EventArgs e)
    {
        labelMousePosition.Text = "MouseLeave";
    }

    private void MouseEventsForm_MouseHover(object sender, EventArgs e)
    {
        labelMousePosition.Text = "MouseHover";
    }

    private void MouseEventsForm_MouseMove(object sender, MouseEventArgs e)
    {
        labelMousePosition.Text = $"鼠标位置:X = {e.X}, Y = {e.Y}";
    }

    private void MouseEventsForm_MouseWheel(object sender, MouseEventArgs e)
    {
        MessageBox.Show("MouseWheel");
    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MouseEventsForm());
    }
}

说明

  1. MouseClick:响应鼠标左键单击事件。
  2. MouseDoubleClick:响应鼠标左键双击事件。
  3. MouseDown:响应鼠标任一按钮按下事件。
  4. MouseUp:响应鼠标任一按钮释放事件。
  5. MouseEnter:响应鼠标进入控件界限事件。
  6. MouseLeave:响应鼠标离开控件界限事件。
  7. MouseHover:响应鼠标悬停在控件上事件。
  8. MouseMove:响应鼠标在控件内移动事件。
  9. MouseWheel:响应鼠标滚轮滚动事件。

这个示例展示了如何使用鼠标事件来响应用户的鼠标操作,并在标签上显示鼠标的位置或显示消息框。

【例6-6】在窗体中的指定区域,单击或双击鼠标左键或右键,用Label控件显示鼠标的事件和位置。

为了响应在窗体中的指定区域,单击或双击鼠标左键或右键的事件,并用Label控件显示鼠标的事件和位置,我们可以创建一个Windows Forms应用程序,并为窗体添加鼠标事件处理程序。以下是实现这个功能的代码示例:

using System;
using System.Windows.Forms;

public class MouseEventForm : Form
{
    private Label labelInfo;
    private const int labelWidth = 200;
    private const int labelHeight = 20;
    private const int labelX = 10;
    private const int labelY = 10;

    public MouseEventForm()
    {
        this.Width = labelWidth + (labelX * 2);
        this.Height = labelHeight + (labelY * 2) + 50; // 留出空间显示鼠标位置信息

        labelInfo = new Label
        {
            Width = labelWidth,
            Height = labelHeight,
            Location = new System.Drawing.Point(labelX, labelY),
            Text = "鼠标位置:X = 0, Y = 0",
            AutoSize = false,
            TextAlign = ContentAlignment.MiddleCenter
        };

        this.Controls.Add(labelInfo);

        // 订阅鼠标事件
        this.MouseClick += new MouseEventHandler(MouseEventForm_MouseEvent);
        this.MouseDoubleClick += new MouseEventHandler(MouseEventForm_MouseEvent);
        this.MouseDown += new MouseEventHandler(MouseEventForm_MouseEvent);
        this.MouseUp += new MouseEventHandler(MouseEventForm_MouseEvent);
    }

    private void MouseEventForm_MouseEvent(object sender, MouseEventArgs e)
    {
        // 根据事件类型确定要显示的文本
        string eventType = "事件: ";
        switch (e.EventName)
        {
            case "MouseClick":
                eventType += "单击";
                break;
            case "MouseDoubleClick":
                eventType += "双击";
                break;
            case "MouseDown":
                eventType += "按下";
                break;
            case "MouseUp":
                eventType += "释放";
                break;
        }

        // 判断鼠标按钮
        string button = e.Button == MouseButtons.Left ? "左键" : "右键";

        // 更新标签文本
        labelInfo.Text = $"{eventType} {button}, 位置:X = {e.X}, Y = {e.Y}";
    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MouseEventForm());
    }
}

说明

  1. 初始化Label控件:我们创建了一个Label控件,用于显示鼠标事件和位置信息。

  2. 订阅鼠标事件:我们为窗体订阅了MouseClickMouseDoubleClickMouseDownMouseUp事件。

  3. 事件处理程序MouseEventForm_MouseEvent是所有鼠标事件的通用处理程序。它根据事件类型和鼠标按钮更新Label控件的文本。

  4. 判断鼠标按钮:我们使用e.Button属性来判断是鼠标左键还是右键触发了事件。

  5. 显示事件和位置信息:在Label控件中显示事件类型、鼠标按钮和位置信息。

这个示例展示了如何在窗体中的指定区域响应鼠标事件,并在Label控件中显示事件和位置信息。

6.3.5 对话框设计

在C#的Windows Forms应用程序中,对话框设计是用户界面交互的重要部分。以下是一些常用的对话框类以及它们的简短描述:

对话框类名描述
OpenFileDialog用于选择文件的对话框。
SaveFileDialog用于保存文件的对话框。
FolderBrowserDialog用于选择文件夹的对话框。
ColorDialog用于选择颜色的对话框。
FontDialog用于选择字体的对话框。
PrintDialog用于打印任务设置的对话框。
PageSetupDialog用于页面设置的对话框。

示例代码:简易文本编辑器

以下是实现一个简易文本编辑器的代码示例,它包括新建、打开、保存和退出功能:

using System;
using System.Windows.Forms;
using System.IO;

public class SimpleTextEditor : Form
{
    private MenuStrip menuStrip;
    private ToolStripMenuItem fileMenuItem;
    private RichTextBox richTextBox;
    private OpenFileDialog openFileDialog;
    private SaveFileDialog saveFileDialog;

    public SimpleTextEditor()
    {
        InitializeComponents();
    }

    private void InitializeComponents()
    {
        // 初始化菜单
        menuStrip = new MenuStrip();
        fileMenuItem = new ToolStripMenuItem("文件(F)");
        
        ToolStripMenuItem newMenuItem = new ToolStripMenuItem("新建(N)", null, NewFile);
        ToolStripMenuItem openMenuItem = new ToolStripMenuItem("打开(O)", null, OpenFile);
        ToolStripMenuItem saveMenuItem = new ToolStripMenuItem("保存(S)", null, SaveFile);
        ToolStripMenuItem exitMenuItem = new ToolStripMenuItem("退出(X)", null, Exit);

        fileMenuItem.DropDownItems.Add(newMenuItem);
        fileMenuItem.DropDownItems.Add(openMenuItem);
        fileMenuItem.DropDownItems.Add(saveMenuItem);
        fileMenuItem.DropDownItems.Add(new ToolStripSeparator());
        fileMenuItem.DropDownItems.Add(exitMenuItem);

        menuStrip.Items.Add(fileMenuItem);
        Controls.Add(menuStrip);
        menuStrip.Dock = DockStyle.Top;

        // 初始化富文本框
        richTextBox = new RichTextBox();
        richTextBox.Dock = DockStyle.Fill;
        Controls.Add(richTextBox);

        // 初始化打开文件对话框
        openFileDialog = new OpenFileDialog();

        // 初始化保存文件对话框
        saveFileDialog = new SaveFileDialog();
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        this.Text = "简易文本编辑器";
    }

    private void NewFile(object sender, EventArgs e)
    {
        richTextBox.Clear();
    }

    private void OpenFile(object sender, EventArgs e)
    {
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            string filePath = openFileDialog.FileName;
            richTextBox.LoadFile(filePath, RichTextBoxStreamType.PlainText);
        }
    }

    private void SaveFile(object sender, EventArgs e)
    {
        if (saveFileDialog.ShowDialog() == DialogResult.OK)
        {
            string filePath = saveFileDialog.FileName;
            richTextBox.SaveFile(filePath, RichTextBoxStreamType.PlainText);
        }
    }

    private void Exit(object sender, EventArgs e)
    {
        this.Close();
    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new SimpleTextEditor());
    }
}

说明

  1. 初始化菜单:创建一个包含文件菜单项的MenuStrip控件,并添加新建、打开、保存和退出的子菜单项。

  2. 事件处理:为新建、打开、保存和退出菜单项添加事件处理程序。

  3. 新建文件:清空RichTextBox中的文本。

  4. 打开文件:使用OpenFileDialog对话框选择文件并加载到RichTextBox中。

  5. 保存文件:使用SaveFileDialog对话框保存RichTextBox中的文本到文件。

  6. 退出:关闭应用程序。

这个示例展示了如何创建一个简易的文本编辑器,包括基本的文件操作功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值