Как я могу очистить TCanvas?Или любое другое решение - PullRequest
1 голос
/ 12 июля 2010

Я использую этот 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;

Проблема заключается не только в показе отдельных курсоров, а в следах мыши . Могу ли я очистить весь Canvas, когда мышь движется? (не похоже на хорошую идею). Может быть, я мог бы очистить свой предыдущий Canv.Draw, выполнив обратный код (если это возможно)? Любые предложения о том, как я могу показать курсоры?

EDIT: попытался вставить еще один Canv.Draw(currentX,currentY,Bitmap); сразу после установки ширины и высоты растрового изображения ... и теперь проблема в том, что у меня есть белый след (а не след мыши), намного чище, но все равно не годится.

Ответы [ 3 ]

4 голосов
/ 12 июля 2010

Вы рисуете на DESKTOP, и это то, что вы никогда не должны делать, потому что это ненадежно.Насколько я понимаю, вы надеетесь найти способ нарисовать курсор мыши на рабочем столе, и когда мыши снова начнут двигаться, «отмените» вашу последнюю краску и перекрасьте мыши в новые координаты.Представьте себе: вы перемещаете мышку где-нибудь над блоком «Мемо», подносите руки к клавиатуре, что-то печатаете, а затем снова перемещаете мышь.Изображение под мышами изменилось!

Что вы можете сделать: Создайте форму в форме курсора мыши, для этого существуют известные методы.Сделайте так, чтобы ваш псевдо-курсор оставался на вершине (с этим вы тоже столкнетесь с небольшой проблемой, потому что Windows больше не любит «оставаться на вершине»).Это не будет легко, но это управляемо, и ИГРАЕТ ПО ПРАВИЛАМ.


Небольшой обзор кода того, что у вас есть, потому что я заметил, что я думаю, что этоошибка, и вы должны знать о.Исправления этого недостаточно, чтобы решить вашу проблему, вам нужно остановить рисование на рабочем столе:

Не освобождайте растровое изображение, содержащее изображение с прозрачным курсором, сохраняйте его на весь срок службы приложения:Вы сэкономите как оперативную память, так и процессор.Это очень важно для того, что должно реагировать на движение мышей.

2 голосов
/ 12 июля 2010

Я покажу вам один путь, который отличается от того, что я ранее предлагал вам.
Вы сохраняете свой холст, используя Canvas.CopyRect в некотором временном холсте. когда ваша мышь впервые зависла на холсте.
Затем при перемещении мыши сначала скопируйте временный холст на целевой холст, а затем наведите курсор.

1 голос
/ 12 июля 2010

Имейте эталонное изображение (как должен выглядеть ваш холст без нарисованного курсора мыши), скопируйте его во временное растровое изображение и затем наведите курсор на это временное растровое изображение. Наконец, нарисуйте свое изображение на холсте.

Это также позволит вам очень легко создавать более сложные временные наложения: вам просто нужно нарисовать их поверх эталонного растрового изображения в соответствии с их Z-порядком. Так как они не касаются фона, вам не нужно беспокоиться об очищении призраков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...