- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道 Canvas 的宽度和高度,但我只知道它的 HDC。
我尝试过这段代码:
procedure TForm92.Button1Click(Sender: TObject);
var
hBitmap: HGDIOBJ;
Header: TBitmapInfoHeader;
begin
hBitmap := GetCurrentObject(PaintBox1.Canvas.Handle, OBJ_BITMAP);
GetObject(hBitmap, sizeof(TBitmapInfoHeader), @Header);
ShowMessage(IntToStr(Header.biWidth));
end;
但是它不会返回 PaintBox1 Canvas 的尺寸,而是获取放置 PaintBox1
的表单的尺寸。
我做错了什么?
最佳答案
仅给定设备上下文的句柄,通常不可能确定与其关联的 TCanvas
对象的尺寸。 TGraphicControl
的后代都共享其父控件的 DC,因为只有窗口控件才能拥有设备上下文,而 TGraphicControl
对象不是窗口控件。
当 TGraphicControl
后代(包括 TPaintBox
)需要 Canvas 时,TControlCanvas
回调控件的 GetDeviceContext
方法。该方法返回父控件的 DC 句柄,但在返回之前,它会稍微修改 DC:
Result := Parent.GetDeviceContext(WindowHandle);
SetViewportOrgEx(Result, Left, Top, nil);
IntersectClipRect(Result, 0, 0, Width, Height);
也就是说,它会移动原点以匹配当前控件的左上角,并更新剪切区域以排除当前控件边框之外的任何内容。
在某些情况下,您也许能够通过检查 DC 的剪切区域(使用 GetClipRgn
)来确定 Canvas 的尺寸,但前提是该区域尚未在任何其他区域中进行调整方法。剪切区域可能小于控件的尺寸。 (由于调用了上面所示的 IntersectClipRect
,它永远不会变大。)
正如您所看到的,您需要的不仅仅是 DC 句柄来获取您想要的信息。理想情况下,这将包括一个 TControl
引用;那么您只需读取其 Height
和 Width
属性即可了解控件的和 Canvas 尺寸。
关于delphi - 如何仅通过知道其句柄来确定 Canvas 尺寸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18642349/
我设置了 Helm 柄和 Helm 柄。我有tiller-deploy。昨天,我可以定期运行了。但今天我收到此错误消息 Error: could not find a ready tiller pod
我以前已将分er安装到特定的 namespace 中。 我设置了一个环境变量来设置'tiller'命名空间-但我不记得该环境变量的名称-而且似乎无法通过网络搜索找到它。 这是什么 key ? 最佳答案
当我在 View 模型中使用如下界面时 class MainViewModel @ViewModelInject constructor( private val trafficImagesR
我正在尝试找到如何在某个 fragment 相关场景中定义 Hilt 的解决方案。我有以下设置: Activity 父 fragment 1 子 fragment 1 子 fragment 2 ...
Hilt 指出如果没有@Provides 注解就不能提供这个接口(interface): interface PlannedListRepository { fun getAllLists()
我的问题非常简单明了:两个注释/示例之间有什么区别: 例子一 @Singleton class MySingletonClass() {} @Module @InstallIn(FragmentCom
我是一名优秀的程序员,十分优秀!