john1990_1 Ответов: 1

Я рисую линии на рабочем столе и хочу удалить старые, чтобы сделать поворот похожим на линии?


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

Что я уже пробовал:

[DllImport("User32.dll")]
public static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("User32.dll")]
public static extern void ReleaseDC(IntPtr hwnd, IntPtr dc);
//Get a Graphics object for the entire screen and draw a rectangle with it:

int currentLine = 0, totalNumOfLines=12;

Point point = new Point(60, 60);

private void FormSettings_Load(object sender, EventArgs e)
{
    desktopPtr = GetDC(IntPtr.Zero);
    g = Graphics.FromHdc(desktopPtr);
}

IntPtr desktopPtr;

Graphics g;

private void FormSettings_FormClosed(object sender, FormClosedEventArgs e)
{
    g.Dispose();
    ReleaseDC(IntPtr.Zero, desktopPtr);
}

private void timerDraw_Tick(object sender, EventArgs e)
{
    g.Dispose();
    ReleaseDC(IntPtr.Zero, desktopPtr);

    desktopPtr = GetDC(IntPtr.Zero);
    g = Graphics.FromHdc(desktopPtr);

    currentLine++;

    if (currentLine == totalNumOfLines) currentLine = 0;

    g.DrawLine(new Pen(Color.Yellow, 2), point.X, point.Y
        , point.X + (int)(50 * Math.Cos((currentLine / (double)totalNumOfLines) * Math.PI * 2))
        , point.Y + (int)(50 * Math.Sin((currentLine / (double)totalNumOfLines) * Math.PI * 2)));
}

Gerry Schmitz

Я использую вращающийся тайцзи, но это замедляет меня.

https://social.msdn.microsoft.com/Forums/vstudio/en-US/8de8b6e9-94ef-4e7d-950a-19ec68715982/how-to-continously-spin-or-rotate-an-image?форум=wpf

john1990_1

Thx, но я понимаю только C#, я вообще не понимал ссылку!

Gerry Schmitz

Это C#, WPF, XAML ... это была часть XAML. Поместите его в окно WPF. Жить немного.

1 Ответов

Рейтинг:
2

Dave Kreskowiak

Если ваш код рисует линии, вы должны постоянно обновлять позиции конечных точек линий и перерисовывать линии, используя эти новые значения.

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

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


john1990_1

Thx много, это проблематично, потому что то, что было за нарисованной линией, может измениться, и рисование рисунка сохраненного снимка происходит медленно в C# .Net VS 2017 для 50X50 пикселей, я думаю.

Dave Kreskowiak

Медленно? Все зависит от того, как вы снимаете изображение и рисуете его обратно.

john1990_1

Может быть, я делаю форму без полей с "TopMost=true;", с TransparentKey таким же, как и его Backolor, но я боюсь, что пользователь потеряет нажатия мыши, если он нажмет на строку/форму?

Dave Kreskowiak

Вы могли бы, но как только пользователь нажимает Win-D, ваша форма сворачивается.

Кроме того, самый верхний является преходящим. В ту секунду, когда другое приложение устанавливает окно на самый верх, ваше окно больше не находится в верхней части z-порядка.

О! И Цвет.Прозрачное-это не прозрачное.