- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
初学者问题。
在Win32API中,::GetClientRect
的第二个参数是LPRECT
,但它同时接收CRect
和CRect*
.
我试图查看 LPRECT
是如何定义的,但它似乎只是指向结构的普通指针:
typedef struct tagRECT
{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;
而CRect
继承了tagRECT
:
class CRect :public tagRECT {...}
使用 MFC,CWnd::GetClientRect
的工作方式相同:
CRect rect;
GetClientRect(&rect); // works
GetClientRect(rect); // works too.
这怎么可能?如果我遗漏了一些 C++ 的基本概念,请告诉我。
最佳答案
期间 overload resolution 1 编译器构建一组与参数匹配的候选函数。如果没有函数的签名与参数完全匹配,编译器将尝试应用隐式转换,每个参数最多一个。
这就是使这两种调用成为可能的原因,尽管两种情况下的隐式转换都不同:
GetClientRect(&rect);
在此函数调用表达式中,&rect
的类型为CRect*
,其中CRect
公开派生自RECT
,因此完成了从 CRect*
到 RECT*
(又名 LPRECT
)的隐式指针转换。
GetClientRect(rect);
另一方面,此处 rect
的类型为 CRect
。 C++ 不提供从 CRect
到 RECT*
的任何内置转换,因此考虑用户定义的转换。具体来说,有一个转换运算符 CRect::operator LPRECT
在给定 CRect
对象的情况下生成 RECT*
指针。
理解这两个函数调用表达式做不同的事情是至关重要的。在第二种情况下,编译器会在调用 GetClientRect()
之前注入(inject)对 operator LPRECT()
的调用。语言中没有任何内容强制转换运算符必须以任何给定方式运行,库作者需要提供合理的实现。
在这种情况下,operator LPRECT()
的行为符合预期,并且两个函数调用具有相同的可观察行为。既然您有两种方法来做同一件事,就需要指导以做出明智的选择:
虽然没有关于使用哪个选项的严格规定,但要看个人意见。我推荐 GetClientRect(&rect)
有几个原因:
[out]
实现写入其结果的参数GetClientRect(rect)
看起来 像按值传递,或者对象可能绑定(bind)到一个引用。实际上,两者都不是,而是调用了(不可见的)转换运算符1 重载解析是一项核心语言功能。然而,驱动这部分语言的规则集使其成为基础。这是您最终必须学习的东西,但这是一个非常陡峭的学习曲线。 cppreference.com 链接可让您一窥所涉及的复杂性。
关于c++ - CRect 和 CRect* 如何成为 GetClientRect 的输入参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73710730/
我在 C# 中通过 pinvoke 调用 GetClientRect 来获取我用作 DirectX 渲染目标区域的面板的尺寸(在 WindowsForm 上)。我原以为 WinAPI 会给我未缩放的尺
我正在编写一个在 Windows 上运行的屏幕保护程序。 在预览模式下,Windows 这样调用程序: Screensaver.exe/p ParentWindowHandle 但是,当我在我的程序中
我正在编写一些代码,在给定窗口句柄的情况下,使用 C++ 截取另一个应用程序的屏幕截图。我使用的方法是使用BitBlt。我的应用程序成功截取了屏幕截图,并且我有一个函数可以将该图像数据保存到 bmp
我有下面的代码片段。如果您按“运行代码片段”,那么您将看到以下内容 1 - p.getClientRects().length 2 - span.getClientRects().length 但是如
每次我调用 Element.getClientRects() 时,它都会返回一个仅包含一个 DOMRect 对象的集合。 Element.getClientRects() 何时返回多个 DOMRect
我目前在 IE 11 中遇到文本选择问题(尽管在以前的 IE 中也会发生这种情况)。我的目标是让文本选择工作,它返回给我 getClientRects。我所拥有的是一个简单的设置。我有一个容器 div
在调整窗口大小时,我需要获得窗口客户区的正确大小(宽度/高度)。我尝试使用 GetClientRect,但它总是提供错误的值(请参阅下面的详细信息)。 User32.RECT clientRECT;
我正在尝试通过以下链接在 KendoUI 网格中创建自定义工具栏:http://demos.telerik.com/kendo-ui/grid/toolbar-template但遇到错误。 这就是我想
尝试在 UIWebView 中查找最顶层的可见元素。我使用 JS 方法来执行此操作,该方法在 Safari 中效果很好,但从 UIWebView 执行时永远不会执行超过 getClientRects
我在我的 MFC 应用程序中设置了一个分层窗口。我已经设置了我自己的 CDialog 派生,以允许我自定义窗口呈现方式的各个部分。一切正常,直到我开始担心最小化和最大化。 如果您单击最小化或最大化,则
我无法找到使用这些函数的明确引用:getBBox() 对比 getBoundingClientRect() 对比 getClientRects()。 您能否解释一下它们的作用以及它们返回的坐标(及其引
我正在尝试获取不同元素的边界矩形。我使用 getClientRects 获取元素的矩形,然后在该矩形上绘制一个红色 div。在 Firefox 上它可以工作,但在 chrome 和 safari 中我
初学者问题。 在Win32API中,::GetClientRect的第二个参数是LPRECT,但它同时接收CRect和CRect*. 我试图查看 LPRECT 是如何定义的,但它似乎只是指向结构的普通
初学者问题。 在Win32API中,::GetClientRect的第二个参数是LPRECT,但它同时接收CRect和CRect*. 我试图查看 LPRECT 是如何定义的,但它似乎只是指向结构的普通
在 webkit 浏览器中(这在 IE9 或 Mozilla 中似乎不是问题)当查询 clientRects (getClientRects) 的范围时,返回的 clientrects 包含与所选文本
我试图让 jQuery UI 工作,但它没有。这是发生了什么。 我正在加载依赖项: 那是我的 main.js 文件: $(function () { $("input[typ
我可以让它工作: [] extern bool GetClientRect(nativeint, RECT*) let getClientRect hwnd = let mutable r =
我可以让它工作: [] extern bool GetClientRect(nativeint, RECT*) let getClientRect hwnd = let mutable r =
我正在为 Visual Studio 2003 使用 MFC。我有一个 ID 为 IDC_COMMENT_EDIT 的编辑控件。在下面的代码中,在我第一次调用 GetClientRect 之后,我不希
Uncaught TypeError: elem.getClientRects is not a function at F.fn.init.offset (jquery-3.2.1.js:9
我是一名优秀的程序员,十分优秀!