虚拟键盘(类似 Swype 键盘)Windows 窗体应用程序 C#

2024-05-03

我正在尝试使用 c# 在 Windows 窗体中创建一个类似 swype 的键盘

我有两个问题: A。我无法重现手指滑动动作。 b.我无法识别不同按键下的字母。

对于第一个问题:

我使用了 Graphics 类和 Pen 类,并像这样使用它:

    bool draw;
    Graphics g;
    Pen p;
    int prevX;
    int prevY;

    private void Form1_Load(object sender, EventArgs e)
    {
        draw = false;
        g = CreateGraphics();
        p = new Pen(Color.Black, 2);
    }

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        draw = true;
        prevX = e.X;
        prevY = e.Y;
    }

    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        draw = false;
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        if (draw)
        {
            g.DrawLine(p, prevX, prevY, e.X, e.Y);
            prevX = e.X;
            prevY = e.Y;
        }
    }

但这里的问题是它从屏幕的左上角开始绘制,而不是从按钮的位置开始绘制。它也不会覆盖按钮。路径中的任何控件都会与该线重叠。

对于第二期:

A。我使用鼠标按下事件将布尔值“允许”设置为 true,然后当鼠标移动时我尝试获取按钮的文本。正如上图所示。我尝试从字母“S”开始,当我移过其他字母时,只有字母“S”继续记录。其他方法的鼠标输入或鼠标悬停事件甚至不会发生。

b.我也尝试过使用拖放事件,但它也不起作用。我不确定,但我假设由于按钮不是可拖动对象,因此拖放事件不起作用。

我不明白或困惑如何实现我的目标。


您可以创建自定义控件并自行处理其绘制。

但是,如果您要使用按钮控件并希望在这些按钮上进行绘制,则可以在这些按钮上放置一个透明面板作为覆盖层,并在透明面板上绘制滑动路径:

透明面板

using System.Windows.Forms;
public class TransparentPanel : Panel
{
    const int WS_EX_TRANSPARENT = 0x20;
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;
            return cp;
        }
    }
    protected override void OnPaintBackground(PaintEventArgs e)
    {
    }
}

表格样本

这只是一个演示透明控制用法的示例。为此,创建一个表单并用以下代码替换其内容就足够了:

TransparentPanel overlay;
TableLayoutPanel table;
List<Point> points = new List<Point>();
List<String> keys = new List<string>();
public Form1()
{
    overlay = new TransparentPanel() { Dock = DockStyle.Fill };
    this.Controls.Add(overlay);

    table = new TableLayoutPanel()
    { ColumnCount = 6, RowCount = 4, Dock = DockStyle.Fill };
    this.Controls.Add(table);

    var list = Enumerable.Range('A', 'Z' - 'A' + 1)
        .Select(x => ((char)x).ToString()).ToList();

    list.ForEach(x => table.Controls.Add(new Button()
    { Text = x, Width = 32, Height = 32 }));

    overlay.MouseDown += OverlayMouseDown;
    overlay.MouseMove += OverlayMouseMove;
    overlay.MouseUp += OverlayMouseUp;
    overlay.Paint += OverlayPaint;
}
void OverlayMouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
        ProccessPoint(e.Location);
}
void OverlayMouseDown(object sender, MouseEventArgs e)
{
    Clear();
    ProccessPoint(e.Location);
}
void OverlayMouseUp(object sender, MouseEventArgs e)
{
    if (points.Count > 0)
        MessageBox.Show(string.Join(",", keys));
    Clear();
}
void OverlayPaint(object sender, PaintEventArgs e)
{
    if (points.Count >= 3)
        e.Graphics.DrawCurve(Pens.Red, points.ToArray());
}
void ProccessPoint(Point p)
{
    points.Add(p);
    var c = table.Controls.Cast<Control>()
        .Where(x => table.RectangleToScreen(x.Bounds)
        .Contains(overlay.PointToScreen(p))).FirstOrDefault();
    if ((c != null) && (keys.Count == 0 || keys[keys.Count - 1] != c.Text))
        keys.Add(c.Text);
    overlay.Invalidate();
}
void Clear()
{
    keys.Clear();
    points.Clear();
    this.Refresh();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

虚拟键盘(类似 Swype 键盘)Windows 窗体应用程序 C# 的相关文章

  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 如何在.NET Core上直接调用F#编译器?

    UPD 我想直接从 NET Core SDK 调用 F 编译器 即 fsc 我了解 dotnet build co 但当我只需要编译一个简单的问题时 即 fsc file fs 就足够的情况下 我不想涉及它们 我尝试在 NET Core S
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr

随机推荐

  • 继承自 NumPy 数组的类如何更改其自身的值?

    我有一个继承自 NumPy n 维数组的简单类 我想要该类的两个方法可以更改该类实例的数组值 其中一种方法应将类实例的数组设置为类实例的列表数据属性的值 另一种方法应将一些列表值附加到类实例的数组中 我不确定如何实现这一点 但我的尝试如下
  • 如何让 AppBar 组件填充所有 div 的宽度和高度的 10%?

    class MyStupidComponent extends React Component render return div div div div
  • Rust 中函数调用中的临时对象何时被删除?

    Rust 中函数调用内临时对象的作用域规则是什么 我真正感兴趣的是以下操作是否安全 fn foo gt CString fn bar arg const libc c char bar foo as ptr 我创建了最小的示例 它按照我想要
  • 使用 php 将 HTML 输出转换为纯文本

    我正在尝试将示例 HTML 输出转换为纯文本 但我不知道如何操作 我使用 file get contents 但我尝试转换的页面返回的结果最相似 raw http localhost guestbook profiles php file
  • Git Visual Studio 与 Bitbucket confluence 连接到现有项目错误/获取失败

    如何使用 Visual Studio 17 从现有 Bitbucket GIT 存储库中提取数据 Error git 因致命错误而失败 找不到 xyz 存储库 I added 这个迷雾 https marketplace visualstu
  • C# - 平移光标

    我正在 PictureBox 控件中实现大图像的平移 并且设置适当的方向平移光标没有问题 但是 我似乎找不到用于平底锅原点的图像 内部带有箭头的圆圈 我在哪里可以找到它 我觉得image您正在寻找的内容未包含在框架中 每个应用程序都使用自己
  • 无法使用 Spring.NET 将依赖项注入到 Azure WorkerRole 对象

    我在使用 spring net 4 0 和 nhibernate 3 0 开发基于 ASP net 的 Web 应用程序方面拥有一定的经验 最近我遇到了一种情况 我需要使用 spring net 来注入我的服务依赖项 这些依赖项属于Work
  • 无法从 setup-jest.js 找到模块

    我有一个 Angular 库 正在努力将其从 Angular 11 更新到 13 Jest 在 11 和 12 中运行良好 但现在我在 v13 中遇到了很多麻烦 我已经按照此处概述的步骤 https thymikee github io j
  • createNativeQuery 设置参数

    我有以下内容 其中包含 NativeQuery 我需要在其中设置参数 但有些事情是错误的 因为未设置参数 因此查询是 SELECT movieId title genres FROM movies where title like 所以返回
  • Perl 命令或模块,如 Linux“文件”命令

    我有一个下载文件的脚本 但这些文件在下载之前没有任何有关它们的信息 在为 Linux 编写代码时 我刚刚调用了qx file filename 查看它是否是 JPEG 图像 如果不是则将其删除 然而 我现在正尝试重写为独立于平台的纯 Per
  • 如何更改 Xcode 上的导航器字体大小

    有什么办法可以改变xcode中导航器面板的字体大小吗 我已设法使用 首选项 gt 字体和颜色 更改编辑窗口中的字体大小 但这不会更改导航器的字体大小 适用于 Xcode 12 及以上版本 Its default value is match
  • 每行中最后一次出现 True 的索引

    我有一个二维数组 a False False False False False True True True True True True True True True True True True True True True True
  • 使用 Jackson 作为 Jersey 客户端序列化器

    使用 Jersey Client API 时 是否可以使用 Jackson 作为 JSON 数据的序列化器 编组器而不是 JAXB 如果可以的话该如何配置呢 好吧 我发现了 原来很简单 ClientConfig cc new Default
  • oracle 计算两个字符串中连续匹配的单词

    我想要一个返回两个字符串中单词的顺序匹配数的查询 例子 Table Id column1 column2 result 1 foo bar live foo bar 2 2 foo live tele foo tele 1 3 bar fo
  • 参数为动态的 Spark 滞后函数

    我需要在spark中实现lag函数 我可以像下面这样做 使用 hive temp Spark 表中的一些数据 假设 DF 有这些行 lagno value 0 100 0 200 2 null 3 null 其中第一列是您要使用的实际滞后数
  • onActivityresult 数据为空

    这是我的相机应用程序 我想在其中捕获图像并裁剪它 但它拍照保存在我的 myimage 目录中 但不执行裁剪功能 请我需要帮助 我是这个领域的新人 这是我的相机开源代码 Intent intent new Intent MediaStore
  • 网站性能衡量

    我需要一个免费的工具来测量网站的性能 并且不需要对代码 jsp asp 页面 进行任何更改 感谢所有帮助 对于绩效衡量 我建议您YSlow http developer yahoo com yslow 它是一个 Firefox 插件 集成了
  • ORA-01741: 非法的零长度标识符

    您好 我在 shell 脚本中使用删除查询 并且遇到了这个问题 delete from WHITELIST CLI where filecode like Line Index condense Error ERROR ORA 01741
  • 有没有办法在 .NET Core 库中包含 .NET Framework 代码?

    我们有一个商业库 我正在努力将其移植到 NET Core 我想保留其中的几个调用 以便仅在以 NET 标准运行时使用 出于好奇 一组是读取 Windows 服务器上需要凭据才能访问的文件 有没有 该调用将告诉我是否在 NET Standar
  • 虚拟键盘(类似 Swype 键盘)Windows 窗体应用程序 C#

    我正在尝试使用 c 在 Windows 窗体中创建一个类似 swype 的键盘 我有两个问题 A 我无法重现手指滑动动作 b 我无法识别不同按键下的字母 对于第一个问题 我使用了 Graphics 类和 Pen 类 并像这样使用它 bool