【问题标题】:Drawing line on desktop very slow on Win 7Win 7 在桌面上画线很慢
【发布时间】:2011-12-27 20:23:46
【问题描述】:

我正在使用此代码在所有窗口顶部用鼠标绘制一条线。我正在使用鼠标钩子来获取鼠标坐标,并且在鼠标右键按下时每次鼠标移动我都在画线。我正在使用NOTXORPEN,所以我只能通过再次绘制它来删除它。

初始化:

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 上运行速度非常慢。

我只使用 Windows API 在 Delphi 3 中编写了一个鼠标手势程序(写于 1999 年)(鼠标钩子是用 VC 编写的,因为版本 3 中的 Delphi BUG)。这个程序正在做 StrokeIt 正在做的事情,但不知何故 StrokeIt 设法找出解决这个问题的方法。

我的代码在 Delphi 中,但我们将不胜感激!

我将更详细地解释我正在尝试构建的内容。我的申请分为三个部分:

  1. 单击鼠标右键时跟踪和存储鼠标手势
  2. 基于有限形状的手势识别
  3. 基于识别的手势和启动手势时光标下的应用程序的宏激活

我无法让 Part1 在 Windows7 (Vista) 上运行,正如 Martyn 在他的回答中所写的那样,我想我必须改变概念。现在我通过上面附加的代码挂钩鼠标消息和手势绘制来进行跟踪......我了解分层窗口的基础知识,但什么对我有用?你认为制作一个全屏最上面的透明窗口并在上面绘图可以完成这项工作吗?有人可以帮我写代码吗?

【问题讨论】:

    标签: windows delphi winapi windows-7 windows-7-x64


    【解决方案1】:

    在 Windows Vista 之前,桌面被绘制为实际的 GDI 表面,因此这种活动有效 - 尽管它的工作速度取决于 GDI 驱动程序的加速。

    在 Vista 和更高版本中,桌面窗口管理器使用 DX 将多个窗口(其中一些可能使用 GDI,而另一些可能不使用)合成到一个最终场景,然后渲染到更新的驱动程序模型。因此直接戳屏幕像素会慢很多。

    从根本上说,这不是完成工作的方式。我不太清楚您要构建什么,但您可能想了解分层 Windows:http://msdn.microsoft.com/en-us/library/ms997507.aspx,它提供了一种受支持且适当的方式来在实际应用程序之上创建更复杂的场景。它们还应该帮助您避免使用鼠标钩,这也是一个坏主意。

    马丁

    【讨论】:

    • 我在我的问题中添加了一些解释,你能复习一下吗?
    • 看起来下一步是下载一些分层的 Window 示例代码并了解它们在实践中是如何工作的。没时间给你写代码,抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    相关资源
    最近更新 更多