2010-07-12 7 views
1

나는 나의 쥐TCanvas를 어떻게 지울 수 있습니까? 또는 다른 솔루션

Canv := TCanvas.Create; 
Canv.Handle := GetWindowDC(0); 

.... 이벤트가 문제는 대신 다음과 같은

Bitmap:=TBitmap.Create; 
CursorInfo.cbSize := sizeof(CursorInfo); 
GetCursorInfo(CursorInfo); 

Bitmap.Width := 32; 
Bitmap.Height := 32; 
Bitmap.Transparent:=true; 

DrawIconEx(Bitmap.Canvas.Handle, 0,0, CursorInfo.hCursor, 32,32, 0,0, DI_NORMAL) ; 

Bitmap.Canvas.Brush.Color := RGB(250,250,250); 
Bitmap.Canvas.FloodFill(31,0, clWhite, fsSurface); 
Bitmap.Canvas.FloodFill(0,0, clWhite, fsSurface); 

currentX:=getcurrentxpos; 
currentY:=getcurrentypos; 

Canv.Draw(currentX,currentY,Bitmap); 
Bitmap.Free; 

입니다 않는 모든 쥐를 들어 에 대한 커서를 그리는이 TCanvas와를 사용하고 있습니다 개별 커서를 표시하면 mouse trails이됩니다. 마우스가 움직이는 전체 Canvas Evertime을 지울 수 있습니까? (좋은 생각처럼 들리지는 않는다). 어쩌면 그 코드의 역순으로 (가능하다면) 이전의 Canv.Draw을 지울 수 있습니까? 내가 커서를 보여줄 수있는 방법에 대한 제안이 있습니까?

EDIT : 비트 맵 너비와 높이를 설정 한 직후 다른 Canv.Draw(currentX,currentY,Bitmap);을 삽입 해 보았습니다. 이제 문제는 마우스 흔적보다는 흰색 흔적이 있지만 훨씬 깨끗하지만 여전히 좋지 않습니다.

답변

4

당신은 데스크톱에 그림을 그려야합니다. 신뢰할 수 없기 때문에 절대 수행해서는 안되는 일입니다. 내가 알기에 마우스 커서를 바탕 화면에 페인트하는 방법을 찾고 마우스가 다시 움직이면 마지막 페인트를 "실행 취소"하고 새 좌표에서 마우스를 다시 칠하기를 원합니다. 이것을 상상해보십시오 : 메모 상자 위로 마우스를 옮기고 손을 키보드로 옮기고 무언가를 입력 한 다음 마우스를 다시 움직입니다. 생쥐의 이미지가 바뀌 었습니다!

할 수있는 작업 : 마우스 커서 모양의 양식을 만들려면이를 수행 할 수있는 알려진 기술이 있습니다. pseudo-cursor를 맨 위에 놓으십시오 (Windows는 더 이상 머물러 있지 않기 때문에 약간의 문제가 발생할 것입니다). 이것은 쉬운 일은 아니지만 관리가 쉽고 규칙에 따라 진행됩니다.


내가 그것을 실수라고 생각하고, 당신에 대해 알아야 할 발견 때문에, 지금까지 뭘 찾았는지에 작은 코드 검토. 이 문제를 해결하는 것만으로는 문제가 해결되지 않으면 바탕 화면에 그릴 필요가 없습니다.

투명한 커서 이미지를 포함하는 비트 맵을 해제하지 마십시오. 응용 프로그램 수명 동안 유지하십시오. RAM과 CPU 모두. 이것은 쥐의 움직임에 반응해야하는 무언가에 중요합니다.

+0

오, 그래, 고마워, 나는 FormCreate와 Bitmap.Free에 FormDestroy에 '커서 쉐이핑'코드를 배치하기로 결정했다. 양식을 사용하는 경우 캔버스의 X, Y 좌표가 양식의 왼쪽 위 속성과 동일합니까? – Dian

+0

나는 당신의 질문을 이해하지 못한다. (마우스 용 TForm을 사용할 것을 제안한다.) 보통의 정사각형 TForm으로 시작하고 마우스 커서에 "모양"을 붙인다. 단순히 비트 맵을 캐싱하지 않는다. –

+0

아, 죄송 합니다만 명확하지 않은 경우 양식의 위치를 ​​의미합니다. 어떻게 배치 할 수 있습니까? 상단 및 왼쪽 특성을 사용해야합니까? ? (캔버스 'x'와 y 좌표는 캔버스가 비슷한지 궁금해했기 때문에 언급했습니다.) 커서 모양이 맨 위에 있으면 포커스가 여전히 기본 양식에 있습니까? 도움을 주셔서 감사합니다 : D – Dian

2

내가 이전에 제안한 것과 다른 한 가지 방법을 보여 드리겠습니다.
임시 캔버스에 Canvas.CopyRect을 사용하여 캔버스를 저장합니다. 마우스가 캔버스에서 처음 가리키면
그런 다음 마우스를 움직이면 먼저 임시 캔버스를 대상 캔버스에 복사 한 다음 커서를 그립니다.

+0

어떻게 사용합니까? 유용한 샘플 코드를 찾을 수없는 것 같습니다. – Dian

+0

@Dian 제 대답을 업데이트했습니다. – Himadri

+0

이 솔루션을 시도했지만 모든 마우스 커서와 이전 위치를 추적하는 것은 너무 어려웠습니다. 하지만 답변 해 주셔서 감사합니다. – Dian

1

참조 이미지 (마우스 커서가 그려져 있지 않은 캔버스 모양)를 임시 비트 맵에 복사 한 다음 해당 임시 비트 맵에 커서를 그립니다. 마지막으로 캔버스에 이미지를 그립니다.

또한 더 복잡한 오버레이를 매우 쉽게 만들 수 있습니다. Z- 순서에 따라 참조 비트 맵 위에 그리면됩니다. 그들은 배경을 만지지 않기 때문에 유령을 지우는 것에 대해 걱정할 필요가 없습니다.

+0

배경이 바뀌면 여전히 작동합니까 (A lot)? 배경은 응용 프로그램 자체이므로 사용자는 타이핑 및 기타 작업을 수행하며 마우스가 움직이는 것처럼 자주 변경됩니다. – Dian

+0

이것은 내가 준 솔루션과 같습니다. – Himadri