C# 有关 键盘事件 的问题。

spade24 2009-12-21 10:51:41
1.我现在有个曲线图,想用键盘的上、下、左、右键通过移动去读取每个点的坐标,类似现在的股票软件;

2.于是,我就用picturebox控件画了这样的曲线图,可惜picturebox没有键盘事件;

3.上网查了资料,有的说去重载键盘事件,可发现重载后,其他控件的键盘事件都需要修改或者就不可用;也有的说把picturebox放到另外的可用键盘事件的控件上,可发现除了类似panel这样的容器控件可盛放其他控件外,其他控件都放不了,而panel同样也没有键盘事件;

4.是否做这样的功能,不是用picturebox控件的,那么用什么控件可以呢?或者用其他什么方法可实现这样的功能呢?

O(∩_∩)O谢谢!
...全文
1007 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
shirley_wen 2010-05-24
  • 打赏
  • 举报
回复
太有用了!感谢大牛解决了我的困惑。

自从在窗口加了windows media player控件之后,KeyPress/KeyDown/KeyUp 这件事件通通都没有处理。
原来是KeyPreview呀~

[Quote=引用 3 楼 starj1 的回复:]

把Form的KeyPreview高为true,就可以从Form_KeyPress/KeyDown/KeyUp截获按键了。
[/Quote]
tian_1 2010-01-03
  • 打赏
  • 举报
回复
spade24好,能否把你写的代码给我学习好吗,多谢!我发站内消息给你了
yongningzh 2009-12-21
  • 打赏
  • 举报
回复
关注,也想做类似现在的股票软件。
starj1 2009-12-21
  • 打赏
  • 举报
回复
没键盘事件也一样,可以截获的。
spade24 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 starj1 的回复:]
把Form的KeyPreview高为true,就可以从Form_KeyPress/KeyDown/KeyUp截获按键了。
[/Quote]

是可以截获按键,可是这只局限于有键盘事件的控件,像panel/picturebox这样本身就没键盘事件的,如何截获?
spade24 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ludeli2004 的回复:]
1.在panel上重画image,然后就可以用键盘事件了
2.不要用picturebox控件,非常不好用,制约你的开发
[/Quote]

可是panel没用键盘事件啊。
starj1 2009-12-21
  • 打赏
  • 举报
回复
把Form的KeyPreview高为true,就可以从Form_KeyPress/KeyDown/KeyUp截获按键了。
dqw120 2009-12-21
  • 打赏
  • 举报
回复
不会,关注高手解答....
ludeli2004 2009-12-21
  • 打赏
  • 举报
回复
1.在panel上重画image,然后就可以用键盘事件了
2.不要用picturebox控件,非常不好用,制约你的开发
spade24 2009-12-21
  • 打赏
  • 举报
回复
问题已解决。谢谢大家。
(有关注的同学可向我发消息。)
kolosi 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 spade24 的回复:]
引用 11 楼 kolosi 的回复:
我估计你是没明白重载键盘事件是啥意思吧。
直接把下面这个函数写在
……


我之前就像你这样加了,可加了之后,其他比如菜单栏上的快捷键就不好用了。
[/Quote]

不好使的原因是,你处理完以后,如果你想让其他功能接受到键消息,就要继续把这个消息往下传递才行。。

protected override void ProcessCmdKey(ref Message message, Keys keyData)
{
switch(keyData)
{
case Keys.Up:
// .....
break;
}
base.ProcessCmdKey(ref msg, keyData);
}

wartim 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ludeli2004 的回复:]
1.在panel上重画image,然后就可以用键盘事件了
2.不要用picturebox控件,非常不好用,制约你的开发
[/Quote]

哪里有制约?画在bitmap上再显示出来不是和画其他地方一样么,而且还不用担心刷新问题,
wartim 2009-12-21
  • 打赏
  • 举报
回复
那就给你写一段
上-圆弧
下-圆
左-直线
右-方框


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication247
{
public partial class Form1 : Form
{
PictureBox PB = new PictureBox();

public Form1()
{
InitializeComponent();

PB.Parent = this;
PB.BackColor = Color.Black;

this.KeyDown += new KeyEventHandler(Form1_KeyDown);
}

void Form1_KeyDown(object sender, KeyEventArgs e)
{
Bitmap Bmp = new Bitmap(PB.ClientRectangle.Width, PB.ClientRectangle.Height);

using (Graphics G = Graphics.FromImage(Bmp))
{
G.Clear(Color.Black);

switch (e.KeyCode)
{
case Keys.Up: G.DrawArc(Pens.Red, new Rectangle(0, 0, 50, 50), 0, 300); break;
case Keys.Down: G.DrawEllipse(Pens.Green, new Rectangle(0, 0, 50, 50)); break;
case Keys.Left: G.DrawLine(Pens.Blue, new Point(0, 0), new Point(50, 50)); break;
case Keys.Right: G.DrawRectangle(Pens.Yellow, new Rectangle(0, 0, 50, 50)); break;
}
}

PB.Image = Bmp;
GC.Collect();
}
}
}
nashina 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ludeli2004 的回复:]
1.在panel上重画image,然后就可以用键盘事件了
2.不要用picturebox控件,非常不好用,制约你的开发
[/Quote]

也可以直接在form上面画
spade24 2009-12-21
  • 打赏
  • 举报
回复
各位,我LV一LV,貌似有思路了。有关注的同学,敬请继续关注,我们今天一定要把这个问题消灭掉。
wsbyd4122 2009-12-21
  • 打赏
  • 举报
回复
你可以考虑直接在Form里面画图,然后抓Form的事件,
如果你要用Picture,当事件触发后,你要让事件上升就可以了
如果你也可以在最底层使用抓事件,使用API的消息勾子也可以

另外:

public partial class NewPanel : UserControl
{
int Oldx, Oldy, Newx, Newy;
public NewPanel()
{
InitializeComponent();
Oldx = this.Width / 2;
Oldy = this.Height / 2;
Newx = Oldx;
Newy = Oldy;
}

private void NewPanel_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawRectangle(new Pen(Color.Green), new Rectangle(0, 0, this.Width - 1, this.Height - 1));
g.DrawLine(new Pen(Color.Red, 20), new Point(Oldx, Oldy), new Point(Newx, Newy));
Oldx = Newx;
Oldy = Newy;

}

private void NewPanel_KeyUp(object sender, KeyEventArgs e)
{
bool bDraw = false;
if (e.KeyCode == Keys.Left)
{
Newx = Oldx - 1;
bDraw = true;
}
else if (e.KeyCode == Keys.Right)
{
Newx = Oldx + 1;
bDraw = true;
}
else if (e.KeyCode == Keys.Up)
{
Newy = Oldy - 1;
bDraw = true;
}
else if (e.KeyCode == Keys.Down)
{
Newy = Oldy + 1;
bDraw = true;
}
if(bDraw == true) this.Invalidate();
}
}

cykevin 2009-12-21
  • 打赏
  • 举报
回复
既然线已经画出来了,还有什么功能不能实现?
spade24 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 cykevin 的回复:]


没有出现是因为坐标设置得不对。你可以先用固定的数值试试,C#默认以左上角为原点。
[/Quote]

我刚才又试了下,没出现是因为form里的控件把画出来的线覆盖掉了。也就是说,这个方法虽然实现了键盘事件,但并没实现我上面的功能。
mjp1234airen4385 2009-12-21
  • 打赏
  • 举报
回复
写了一个简单的控件。

public partial class NewPanel : UserControl
{
int Oldx, Oldy, Newx, Newy;
public NewPanel()
{
InitializeComponent();
Oldx = this.Width / 2;
Oldy = this.Height / 2;
Newx = Oldx;
Newy = Oldy;
}

private void NewPanel_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawRectangle(new Pen(Color.Green), new Rectangle(0, 0, this.Width - 1, this.Height - 1));
g.DrawLine(new Pen(Color.Red, 20), new Point(Oldx, Oldy), new Point(Newx, Newy));
Oldx = Newx;
Oldy = Newy;

}

private void NewPanel_KeyUp(object sender, KeyEventArgs e)
{
bool bDraw = false;
if (e.KeyCode == Keys.Left)
{
Newx = Oldx - 1;
bDraw = true;
}
else if (e.KeyCode == Keys.Right)
{
Newx = Oldx + 1;
bDraw = true;
}
else if (e.KeyCode == Keys.Up)
{
Newy = Oldy - 1;
bDraw = true;
}
else if (e.KeyCode == Keys.Down)
{
Newy = Oldy + 1;
bDraw = true;
}
if(bDraw == true) this.Invalidate();
}
}
spade24 2009-12-21
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 cykevin 的回复:]

没有出现是因为坐标设置得不对。你可以先用固定的数值试试,C#默认以左上角为原点。
[/Quote]

我分别试过(0,0)到
(10,10),
(100,100)

画笔是红色,可是没画出东西。
加载更多回复(15)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧