2009-12-04 2 views
0

20ms마다 Top 및 Left 속성을 변경하여 포함 된 컨트롤에서 그림 상자를 이동하려고합니다. 검정색 배경에서는 약간 매끄럽지 만 BackgroundImage를 컨트롤에 할당하면 컨트롤이 몇 초 후에 다시 그려 지거나 갑작스럽게 느려지거나 앞으로 앞으로 움직이거나 지그재그 형 궤적으로 움직이게 될 때까지 그림 상자는 그 뒤에 흔적을 남깁니다.타이머를 사용하여 그림 상자 이동하기

나는 PictureBox 컨트롤을 다시 그릴 때 왼쪽 및 위쪽 속성을 변경하는 스레드가 다시 그릴 때까지 중단되고 그리기가 완료되었을 때 타이머 루프의 반복을 큐에 넣습니다. 완전한.

그림 상자의 움직임을 부드럽게하는 방법이 있습니까?

감사 F

+0

system.timer 또는 form.timer? – Fredou

+0

System.Timers.Timer – Michali

+0

System.Windows.Timer로 바꿨습니다. 움직임이 분명 부드러워졌지만 다른 스레드에서 발생하는 것이 좋습니다. – Michali

답변

3

컨트롤 주위를 움직이는 것과는 대조적으로 한 컨트롤에서 이미지를 그릴 것을 제안합니다.

사용자 지정 컨트롤을 만들고 OnPaint를 재정 의하여 거기에 "그림 상자"를 그립니다. 이렇게하면 버퍼를 백업 할 수 있습니다. Graphics.FromImage()를 호출하여 이미지에서 그래픽 객체를 만듭니다. 그 위에 그림을 그리기 만하면 REAL 그래픽 객체 (eventArgs의)에서 g.DrawImage를 호출 할 수 있습니다.

+0

그건 흔적과 들쭉날쭉 한 동작에 도움이 된 것 같습니다. 그러나 비트 맵이 2 ~ 3 인치 정도 움직여도 움직이지 않는 문제는 계속 남아 있습니다. – Michali

+0

코드에 잘못된 Application.DoEvents()가 있습니까? 그런 지연을 설명 할 것입니다. 당신이 그걸 사용하지 않는다면 나는 그 문제를 일으킬 수있는 것이 무엇인지 궁금합니다. 작지만 완전한 예제로 그것을 추출 할 수 있습니까? – Quibblesome

+0

사용자 지정 컨트롤이 별도의 응용 프로그램에서 실행될 때만 움직임이 명확하고 흔들리는 것이 아니라고 말할 수 있습니다. 내가 실행하고자하는 큰 응용 프로그램은 또 다른 타이머를 가지고 있으며 그 밖의 다른 것들도 수행한다. 스레드에서 동작을 실행 해보고 작동하지 않으면이 문제에 관해 다시 생각해 볼 것입니다. 감사. – Michali

2

나는 (WPF로 전환 이외의) 문제를 해결하는 방법을 정확히 알고하지 않습니다하지만 난 당신이 받고있는 지연이되고있는 지역의 무효에서 오는 말할 수있다 PictureBox를 이동할 때마다 업데이트됩니다. 원하는 것은 GDI를 사용하여 실시간으로 다시 그리기를 수행하는 대신 새로운 위치를 백 버퍼링하고 버퍼로 전환하는 것입니다. HTH.

관련 문제