c# 关于画出实心圆出现在屏幕中央,而且可以移动

qq_41969735 2018-04-09 10:25:48
写一个编程时实心圆出现在屏幕中央且可以通过键盘的方向键实现移动
我的编码的问题是固定死了,没法移动,该怎么解决?
public Form1()
{
InitializeComponent();
KeyPreview = true;
}
int size = 30;
int A = 255;
public void panel1_Paint(object sender, PaintEventArgs e)
{
Graphics gc = e.Graphics;
/// 设置绘图的颜色
Brush Brush = new SolidBrush(Color.FromArgb(A, 255, 255, 255));
int X = 683;
int Y = 384;
int x = X - size;
int y = Y - size;
Point p = new Point(x, y);
e.Graphics.FillEllipse(new SolidBrush(Color.FromArgb(A, 255, 255, 255)),
new RectangleF(p, new Size(size * 2, size * 2)));
base.OnPaint(e);
}
PointF p = new PointF(683 ,384);
private void Form1_KeyDown(object sender, KeyEventArgs e)
{switch (e.KeyCode)
{
case Keys.A:
p.X -= 10 ;
break;
case Keys.D:
p.X += 10;
break;
case Keys.W:
p.Y -= 10;
break;
case Keys.S:
p.Y += 10;
break;
default:
break;

}
Invalidate(); ;
}
...全文
522 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-04-09
  • 打赏
  • 举报
回复
Point p = new Point(x, y); 删去这句 e.Graphics.FillEllipse(new SolidBrush(Color.FromArgb(A, 255, 255, 255)), new RectangleF(p, new Size(size * 2, size * 2)));
qq_41969735 2018-04-09
  • 打赏
  • 举报
回复
[quote=引用 8 楼 qq_38977664 的回复:] 我知道这个方法,但是我注释掉以后,我所画的圆心已经不再屏幕中央了
qq_38977664 2018-04-09
  • 打赏
  • 举报
回复
可以了麻烦给下分
qq_38977664 2018-04-09
  • 打赏
  • 举报
回复
大哥,你这里都错啦public void panel1_Paint(object sender, PaintEventArgs e) { Graphics gc = e.Graphics; /// 设置绘图的颜色 Brush Brush = new SolidBrush(Color.FromArgb(A, 255, 255, 255)); int X = 683; int Y = 384; int x = X - size; int y = Y - size; Point p = new Point(x, y); e.Graphics.FillEllipse(new SolidBrush(Color.FromArgb(A, 255, 255, 255)), new RectangleF(p, new Size(size * 2, size * 2))); base.OnPaint(e); } 你重新new了一个pen肯定不行啊,你增减的是全局的pen,却又new了一个局部的,把那个pen注释掉就搞定了, //Point p = new Point(x, y);,注释掉就能wsad移动了
qq_41969735 2018-04-09
  • 打赏
  • 举报
回复
[quote=引用 1 楼 wddw1986 的那请问该如何实现呢,我就是想让它在运行的时候实现移动,该怎么办
qq_41969735 2018-04-09
  • 打赏
  • 举报
回复
该怎么用编码实现?我是新手,有太多的不太懂
  • 打赏
  • 举报
回复
qq_41969735 2018-04-09
  • 打赏
  • 举报
回复
[quote=引用 3 楼 starfd 的回复:] 看不太懂
  • 打赏
  • 举报
回复
分两部分说: 1、什么是“移动”: 事实上gdi对象是没有“移动”这个动作的,或者说gdi对象是没有动作的,动作是“动态渲染”的结果。也就是说,“移动”这个动作实际上是每隔多少毫秒擦除原有图像在新位置绘制新图像利用暂留视觉效应和高速图像变化产生的“动态渲染”。 2、按下键盘怎么监听: 如果你的窗口在激活状态,只要监听窗口上的按键按下即可,如果窗口不是激活状态,就需要向系统注册快捷键。方法二楼说的很清楚了。 所以你先看看你现在的不移动是什么原因造成的。
cheng2005 2018-04-09
  • 打赏
  • 举报
回复
Form的输入事件只有在窗口激活时才会响应,你这个需求应该要用钩子,监听键盘的按键,这样不需要激活窗口也可以响应案件。类似于系统全局快捷键的意思。
qq_38977664 2018-04-09
  • 打赏
  • 举报
回复
public Form1() { InitializeComponent(); pen = new Point(panel1.Size.Width/2, panel1.Size.Height/2); KeyPreview = true; } int size = 30; int A = 255; Point pen; private void panel1_Paint(object sender, PaintEventArgs e) { Graphics gc = e.Graphics; Point p = new Point(pen.X - size, pen.Y - size); e.Graphics.FillEllipse(new SolidBrush(Color.FromArgb(A, 255, 255, 255)), new RectangleF(p, new Size(size * 2, size * 2))); base.OnPaint(e); }
qq_38977664 2018-04-09
  • 打赏
  • 举报
回复
我有点不下去了,你这代码本身可以写的简单很多,而且你现在的写法只要随便变化下控件的大小,你的圆根本就不会在正中间,我修改了下你的paint和初始化那里,你参考下吧
qq_38977664 2018-04-09
  • 打赏
  • 举报
回复
那你就利用那个全局的pen啊,你上面的int X和int Y的坐标就是利用你最开始的坐标683,384定义的,那么下面的int x=X-size,size是固定的,变化的是这个X,你改成int x=p.x -size不就可以了

110,535

社区成员

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

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

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