2011-12-20 1 views
1

화면에 눈금자를 표시하는 프로그램이 있고 Xlib이 커서 위치를 100ms마다 폴링하여 업데이트합니다 디스플레이. 디스플레이는 숫자/행 등으로 구성되며 특히 커서의 위치를 ​​나타내는 행 (업데이트 이유)입니다.커서로 움직이는 선을 그려야하지만, 100ms마다 전체 창을 다시 그리지 않으려 고합니다.

문제는 이전 줄을 지우고 내용을 복원해야하므로 위치 변경을 반영하기 위해 전체 창을 다시 그려야한다는 것입니다. 이것을 10 번 반복하면 매우 깜박 거리는 프로그램이됩니다.

내가 커서 (즉 통치자의 범위 이내) 표시 줄을 변경 할 수있는 위치에 있음을 확인 후에 나는 는 눈금자를 다시 그릴 수 있지만 때 여전히 아주 나쁜 깜박 것 업데이트 중.

GTK와 Xlib에 대한 멍청한 의견과 모든 조언은 인정 될 것입니다.

코드 https://github.com/zjmichen/zRuler 당신이 커서가 구현되는 때 직면하는 최초의 문제 중 하나에 도착했습니다 잘

+0

당신은 gtk-demos app, 당신을 도울 수있는 몇몇 낙서 예제를 점검해야합니다. – erick2red

답변

2

에있다! 커서 변경 사항은 너무 자주 발생하므로 매번 다시 전체 창을 다시 그려야 의미가 없습니다. 문제가 발생하면 정확히 무엇을하고 있는지를 &에서 확인하십시오. 커서가 움직일 때 전체 창을 업데이트해야합니까? 아니요. 창의 일부분 만 업데이트해야하므로 전체 창을 업데이트하지 마십시오. 상단에서 깜박임을 줄이는 2 가지 방법을 생각해 볼 수 있습니다.
1. 간단한 방법은 GdkCursor을 사용하는 것입니다. 픽스맵 (개발자 페이지에서 제공되는 샘플)에서 필요에 따라 모양을 바꾸고 새 커서를 만듭니다. 응용 프로그램의 기본 창의 GdkWindow이있는 Associate 커서가 있습니다. 이렇게하면 커서를 추적 할 필요가 없습니다 & 선을 그립니다. 커서 자체가 선으로 표시됩니다 (따라서 &을 다시 그리는 것에 대해 걱정할 필요가 없습니다). 이제 전체 윈도우를 다시 그리는 타이머 콜백에서 커서 위치 변경시 업데이트해야하는 구성 요소 만 다시 그립니다. 이렇게하면 모든 구성 요소를 그리지 않아도 플리커가 줄어들 수 있습니다.
2. GdkCursor을 사용하지 않으려면 커서 전용 응용 프로그램 창 상단에 별도의 투명 창 을 만들 수 있습니다. 이 접근법에서는 커서 위치의 변경시 업데이트 할 응용 프로그램 창의 구성 요소 인 커서 창 & 만 업데이트 할 수 있습니다. 이 방법으로 응용 프로그램 창의 다른 구성 요소가 다시 그려지 지 않을 때마다 &이 플 래커를 줄일 수 있어야합니다.
희망이 도움이됩니다.

+0

답장을 보내 주셔서 감사합니다! GdkCursor를 정확하게 이해할 수 있을지 확신 할 수 없습니다. 표준 화살표를 다른 픽스맵으로 바꾸는 것으로 생각했습니다. 커서가 창 밖으로 나왔을 때 도움이되지 않습니다. 당신이 말한 것에서는 커서가 창 위에 있었더라도 창에 나타나는 것처럼 들립니다. 이게 옳은 거니? 문제는 커서가 눈금자 위에 있지만 눈금자의 끝 사이에있는 경우에도 위치 줄을 업데이트해야합니다. 나는 또한 방법 2와 같은 것을 생각해 냈습니다. 그러나 솔직히 말해서 더 간단한 방법이 있다면 그 문제에 가지 않을 것입니다. –

+0

네 말이 맞습니다. 윈도우 내의 커서를 대체합니다. 커서가 응용 프로그램 창 밖에있을 때에도 줄을 업데이트해야한다는 것을 알지 못했습니다. 두 번째 방법은 작동해야합니다. 내가 더 나은 것을 생각할 수 있는지, 아니면 다른 누군가가 더 나은 대안을 제공 할 수 있는지 알아 봅시다. 행운을 빕니다! –