【发布时间】:2017-09-30 13:29:43
【问题描述】:
我正在尝试使用 c# 在 Windows 窗体中创建类似键盘的 swype
我有两个问题: 一种。我无法重现手指滑动动作。 湾。我无法识别不同键下的字母。
对于第一个问题:
我使用了 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;
}
}
但这里的问题是它从屏幕的左上角开始绘制,而不是从按钮的位置开始绘制。它也不会在按钮上绘制。路径中的任何控件都与该线重叠。
第二期:
一个。我使用鼠标按下事件将布尔值“允许”设置为 true,然后当鼠标移动时,我尝试获取按钮的文本。就像上图一样。我尝试从字母“S”开始,当我移过其他字母时,只有字母“S”继续记录。其他方法的 Mouse Enter 或 Mouse Hover 事件甚至都不会发生。
b.我也尝试过使用拖放事件,但它也不起作用。我不确定,但我假设按钮不是可拖动的对象,因此拖放事件不起作用。
我不明白或困惑如何实现我的目标。
【问题讨论】:
-
我假设当您开始绘制时,您会从左上角到鼠标位置得到一条线?这可能是因为您的 prevx/prevy 变量是默认值 (0),在这种情况下,您希望将绘图推迟到第二个鼠标移动事件,这应该会给您正确的结果。不过,我无法对问题的其余部分发表评论
-
这是非常基本的。您不能使用 Button 控件,它们会剪切您绘制的任何内容并拥有自己的鼠标处理。您必须通过 Paint 事件使它们看起来像按钮。
-
@HansPassant 有没有办法在做动作时检测字母?
-
您首先需要一个可以从普通鼠标点击中选择正确字母的 hittest 方法。一旦你有了它,“动态”做就不会成为障碍。
-
@Akhil 看看this post中的解决方案2。
标签: c# .net winforms windows-forms-designer