gpt4 book ai didi

delphi - 如何仅通过知道其句柄来确定 Canvas 尺寸?

转载 作者:行者123 更新时间:2023-12-03 15:28:59 33 4
gpt4 key购买 nike

我想知道 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 引用;那么您只需读取其 HeightWidth 属性即可了解控件的 Canvas 尺寸。

关于delphi - 如何仅通过知道其句柄来确定 Canvas 尺寸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18642349/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com