내 클래스 중 하나를 내 창에 10 초 동안 깜박이는 빨간색 선을 그려려고했지만 System.ArgumentException: parameter is not valid
오류가 발생했습니다. 내 graphics.DrawLine
. 문제를 찾으려고 노력하면서, 나는 최소한의 부품을 포함하여 그것을 재창조하는 한까지 갔다. red
및 dark
함수는 타이머의 aTick
이벤트 외부에서 선을 완벽하게 그릴 수 있지만이 함수로 활성화되는 동안 언급 된 오류를 제공합니다. 그래픽이나 펜 객체가 유효하지 않을 때이 오류가 발생하는 경우도 있지만, 여기서는 그렇지 않습니다.'System.ArgumentException 매개 변수가 유효하지 않습니다.'graphics.DrawLine 타이머에
내 코드에 대해 : 나는 아주 최근에 프로그래밍을 시작했으며, 데이터 바인딩에 대한 전설 만 들었고 코드를 간소화 할 수는 있었지만 실제로는 내 능력 밖이므로, bool이 true로 바뀌면 (다시 거짓으로 돌아서는) 작업을 수행하는 작업이 거의 불가능할 수도 있습니다. 그게 내가 깜박이 시작하고 또한 타이머의 각 진드기에서 내 그래픽을 다시 그리기 위해 사용하는거야. 또한 aTick
이벤트가 끝날 때 redraw
을 변경하려고 시도했을 때 Cannot use ref or out parameter 'redraw' inside an anonymous method, lambda expression, or query expression
이라고 했으므로 두 번째 Redraw
bool이 필요했습니다. 내가 볼 수 있듯이 두 번째 부울을 추가하여 그 주위를 돌아 다니며 작업했지만, 왜 그런 일이 일어나고 더 나은 해결 방법이 무엇인지 설명 할 수 있다면 좋을 것입니다. 여기
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace GrafikaTeszt
{
public partial class Form1 : Form
{
bool flash = false; //can we draw the line?
bool redraw = false; //should we redraw?
public Form1()
{
InitializeComponent();
}
Class1 classic = new Class1();
private void Form1_Paint(object sender, PaintEventArgs e)
{
if (flash)
{
classic.makeitflash(e.Graphics, out redraw);
if (redraw)
{
Invalidate();
}
}
}
private void button1_Click(object sender, EventArgs e)
{
flash = true;
Invalidate();
}
}
}
그리고 여기에 내가 선을 그어야하는 것을 시도하고있는 클래스의 코드입니다 :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;
namespace GrafikaTeszt
{
class Class1
{
Timer clock;
int ticks;
public void makeitflash(Graphics g, out bool redraw)
{
redraw = false;
bool Redraw = false;
ticks = 0;
clock.Start();
clock.Tick += new EventHandler(aTick);
void aTick(object sender, EventArgs e)
{
if (ticks % 2 == 0)
{
red(); //draw a red line
}
else
{
dark(); //draw a darkred line
}
if (ticks == 20)
{
clock.Stop();
}
ticks++;
Redraw = true;
}
void red() { g.DrawLine(Pens.Red, 100, 100, 500, 500); }
void dark() { g.DrawLine(Pens.DarkRed, 100, 100, 500, 500); }
redraw = Redraw;
}
public Class1()
{
clock = new Timer();
clock.Interval = 200;
}
}
}
최근에 추가 된 C# 언어 기능이 스파게티 코드를 작성하는 데 얼마나 익숙했는지 보아도 놀랍습니다. Paint 이벤트가 발생한 후 e.Graphics 객체가 더 이상 유효하지 않기 때문에 충돌이 발생합니다. Winforms 프로그래밍에 대한 훌륭한 입문서 또는 입문서가 도움이 될 것입니다. –