Рисование линии на рабочем столе очень медленно на Win 7 - PullRequest
5 голосов
/ 13 ноября 2011

Я использую этот код, чтобы нарисовать линию с помощью мыши поверх всех окон. Я использую мышь, чтобы получить координаты мыши, и при каждом движении мыши, когда правая кнопка мыши нажата, я рисую линию. Я использую NOTXORPEN, поэтому я смогу удалить линию, только нарисовав ее снова.

Init:

ScreenDC := GetDcEx(GetDesktopWindow,0,DCX_LOCKWINDOWUPDATE);

PenHandle := CreatePen(PS_SOLID,HitStorage.GetPenWidth,10);

SelectObject(ScreenDC ,PenHandle);
OldPenMode := SetRop2(ScreenDC, R2_NOTXORPEN);  // Setting the PenMode to NotXor

MoveToEx(ScreenDC, X, Y, Nil); //Move The Pen Position to the Cursor Position

Я использую этот код при каждом движении мыши:

LineTo(ScreenDC, X, Y); // Draw a Line between the prev Point to Current Point

Этот код работал для Windows 95, 98, 2000 и XP, но теперь с Windows 7 он очень медленный.

Я написал программу для жестов мыши (написанную в 1999 году) в Delphi 3, используя ТОЛЬКО Windows API (ловушка мыши была написана в VC из-за ошибки Delphi BUG в версии 3). Эта программа делает именно то, что StrokeIt делает, но каким-то образом StrokeIt удалось найти решение этой проблемы.

Мой код написан на Delphi, но мы будем благодарны за ответы на любом языке!

Я объясню более подробно, что именно я пытаюсь построить. Моя заявка разделена на три части:

  1. Отслеживание и сохранение жестов мыши при нажатии правой кнопки мыши
  2. Распознавание жестов на основе ограниченного числа фигур
  3. Активация макроса на основе распознанного жеста и приложения, которое находилось под курсором при запуске жеста

У меня проблемы с тем, чтобы Part1 работала на Windows7 (Vista), и, как написал Мартын в своем ответе, думаю, мне нужно изменить концепцию. Теперь я выполняю отслеживание, перехватывая сообщения мыши и рисование жестов с помощью кода, который я прикрепил выше ... Я понял основы многослойных окон, но что будет работать для меня? Как вы думаете, создание полноэкранного верхнего прозрачного окна и рисование на нем будет работать? Может ли кто-нибудь помочь мне написать код для этого?

1 Ответ

10 голосов
/ 13 ноября 2011

До Windows Vista рабочий стол рисовался как фактическая поверхность GDI, и поэтому этот вид работы работал, хотя скорость его работы зависела от ускорения вашего драйвера GDI.

В Vista и более поздних версиях диспетчер окон рабочего стола использует DX для объединения нескольких окон (некоторые из которых могут использовать GDI, а некоторые нет) в одну финальную сцену, которая отображается в более новой модели драйвера.В результате прямое нажатие на пиксели экрана становится намного медленнее.

Более важно, что это не способ добиться цели.Мне не совсем понятно, что вы пытаетесь создать, но вы, вероятно, хотите узнать о многоуровневой Windows: http://msdn.microsoft.com/en-us/library/ms997507.aspx, которая обеспечивает поддерживаемый и подходящий способ создания более сложных сцен поверх реальных приложений.Они также должны помочь вам избежать использования крючка для мыши, что также является плохой идеей.

Martyn

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