【问题标题】:DS_ABSALIGN style to avoid calculationsDS_ABSALIGN 样式以避免计算
【发布时间】:2015-03-31 11:56:02
【问题描述】:

我有一个带触控笔的平板电脑,在正常操作中很容易绘制并找出触控笔的位置,因为硬件会提供正确的坐标。然后我通过 ChangeDisplaySettingsEx API 将显示器旋转 90 度,在这种情况下,我必须应用我想避免的平移(第二个显示器)+ 旋转。然后我在 MSDN 中读到了这种风格的 DS_ABSALIGN:

表示对话框的坐标是屏幕 坐标。如果未指定此样式,则坐标为 客户坐标。

我想在屏幕坐标中绘制一个 DC,这是我正在接收的内容,而不是客户端坐标,但定义该样式没有任何区别。

//unaffected by the style
DrawIcon(hDevCtx, m_Point.x, m_Point.y, LoadCursor(NULL, IDC_ARROW));

有没有办法在屏幕坐标中绘制图标?

编辑:最后我别无选择,只能对每一轮进行计算,所以我关闭了问题

【问题讨论】:

  • 我的直觉告诉我DS_ABSALIGN 仅适用于您的对话模板中指定的坐标,不适用于后来创建的 DC;那些仍然在客户空间。我不确定。你为什么关心计算? MapWindowPoints() 将为您完成屏幕/客户端转换工作。
  • 只是为了节省时间:)
  • 写代码的时间?还是在绘图代码中运行时间?如果是后者,那么它真的不会有什么不同(程序在绘图处理程序中开始做更复杂的事情)。
  • DS_ABSALIGN 只影响对话框本身的位置;如果您使用所有者窗口创建对话框,它通常会相对于该窗口定位,但使用DS_ABSALIGN 您可以指定绝对坐标。它不会影响您在对话框中执行的任何控件或渲染。

标签: windows winapi gdi


【解决方案1】:

您传递给 DrawIcon() 的坐标取决于您拥有的 DC 类型。例如,假设您使用 GetDC() 来获取 DC。如果你传递一个窗口句柄,你传递给 DrawIcon() 的坐标将是相对于该窗口的客户区的。如果将 0 传递给 GetDC(),则坐标将相对于桌面屏幕。如果您想在桌面屏幕上绘图,请使用 GetDC(0) 或更好的方法(如果有的话)。如果您只想将屏幕坐标转换为客户端坐标,反之亦然,请使用 ScreenToClient() 或 ClientToScreen()

【讨论】:

  • 我不知道这个功能,一旦我可以测试它,我会接受它作为答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 2016-02-10
  • 1970-01-01
  • 2022-01-25
  • 2018-08-26
  • 1970-01-01
相关资源
最近更新 更多