gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:42:35 26 4
gpt4 key购买 nike

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

enter image description here

我有两个问题:A。我无法重现手指滑动 Action 。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;
}
}

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

第二期:

一个。我使用鼠标按下事件将 bool 值“Allow”设置为 true,然后当鼠标移动时我尝试获取按钮的文本。就像上图一样。我试着从字母“S”开始,当我移过其他字母时,只有字母“S”保持记录。其他方法的 Mouse Enter 或 Mouse Hover 事件甚至不会发生。

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

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

最佳答案

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

但是如果您要使用 Button 控件并想在这些按钮上绘制,您可以将透明面板放在这些按钮上并在透明面板上绘制滑动路径:

enter image description here

透明面板

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();
}

关于c# - 虚拟键盘(类似 Swype 的键盘)Windows 窗体应用程序 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46503193/

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