You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForm中两个PictureBox调用FillEllipse()仅第一个可绘制问题求助

问题分析与解决办法

嘿,我一眼就瞅出你代码里的问题啦!你在绘制椭圆的时候踩了个坐标系的坑:

  • 每个PictureBox的Graphics对象用的是控件自身的内部坐标系,控件左上角就是坐标原点(0,0)。
  • 但你现在用的是pictureBox1.Location和pictureBox2.Location,这个属性是控件相对于窗体的位置坐标。用这个值计算绘制位置,相当于在第二个PictureBox里从它在窗体上的偏移处开始画,这早就超出了控件的可视范围,自然看不到图形。

修正后的代码

方案1:修改原有两个Paint方法

只需要把绘制坐标改成相对于控件内部的,去掉p1.X、p1.Y这类窗体级坐标就行:

public Form1() 
{ 
    InitializeComponent(); 
    pictureBox1.Paint += new PaintEventHandler(this.pictureBox1_Paint); 
    pictureBox2.Paint += new PaintEventHandler(this.pictureBox2_Paint); 
} 

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics gr = e.Graphics;
    // 直接使用控件内部坐标,左上角为(0,0)
    gr.FillEllipse(new SolidBrush(Color.Red), new Rectangle(40, 40, 20, 20)); 
    gr.FillEllipse(new SolidBrush(Color.Red), new Rectangle(40, 80, 20, 20)); 
    gr.FillEllipse(new SolidBrush(Color.Red), new Rectangle(80, 40, 20, 20)); 
    gr.FillEllipse(new SolidBrush(Color.Red), new Rectangle(80, 80, 20, 20)); 
} 

private void pictureBox2_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics br = e.Graphics;
    // 同样使用控件内部坐标
    br.FillEllipse(new SolidBrush(Color.Red), new Rectangle(40, 40, 20, 20)); 
    br.FillEllipse(new SolidBrush(Color.Red), new Rectangle(40, 80, 20, 20)); 
    br.FillEllipse(new SolidBrush(Color.Red), new Rectangle(80, 40, 20, 20)); 
    br.FillEllipse(new SolidBrush(Color.Red), new Rectangle(80, 80, 20, 20)); 
}

方案2:合并Paint事件(更优雅)

既然两个PictureBox的绘制逻辑完全一样,你可以只写一个Paint方法,通过sender参数获取当前触发事件的控件,避免重复代码:

public Form1() 
{ 
    InitializeComponent(); 
    pictureBox1.Paint += PictureBox_Paint; 
    pictureBox2.Paint += PictureBox_Paint; 
} 

private void PictureBox_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics g = e.Graphics;
    // 不管是哪个PictureBox,都用内部坐标绘制
    g.FillEllipse(new SolidBrush(Color.Red), new Rectangle(40, 40, 20, 20)); 
    g.FillEllipse(new SolidBrush(Color.Red), new Rectangle(40, 80, 20, 20)); 
    g.FillEllipse(new SolidBrush(Color.Red), new Rectangle(80, 40, 20, 20)); 
    g.FillEllipse(new SolidBrush(Color.Red), new Rectangle(80, 80, 20, 20)); 
}

这样修改后,两个PictureBox里都会正常显示四个红色椭圆啦!

内容的提问来源于stack exchange,提问作者Andrian Babii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:23:30