首页 > 解决方案 > 如何获取 MessageDlgPos 尺寸?

问题描述

我想将 MessageBox 放置在相对于字符串网格中的活动单元格的特定位置,这没有问题,MessageDlgPos()除了我想防止当活动单元格靠近时框从屏幕的右侧或底部跑出右侧或底部。我需要的是一种获取盒子尺寸的方法,但我看不到获取这些尺寸的简单方法。任何人都知道如何不创建我自己的盒子?

标签: delphimessagebox

解决方案


这些MessageDlg...()功能不支持您的要求。在显示对话框之前,对话框的尺寸是未知的,并且您无法直接访问对话框窗口以查询/重新定位它,除非可能使用WH_CBT来自SetWindowsHookEx().

话虽如此...

在启用了Visual Styles的Windows Vista+ 上Vcl.Dialogs.UseLatestCommonDialogs=true,函数调用 Win32 API 以显示消息框。您无法控制该对话框的尺寸,因此您必须等待该对话框发出通知,然后在显示之前查询其实际尺寸,以便您可以根据需要调整其位置。但是,这些函数不提供对任何通知的访问(在内部使用的,确实有一个事件,以及其他事件)。因此,如果您想重新定位此对话框,则必须使用自定义回调函数调用自己(或者,使用 VCL 的包装器)。MessageDlg...()TaskDialogIndirect()TDN_DIALOG_CONSTRUCTEDMessageDlg...()TaskDialogIndirect()TCustomTaskDialogOnDialogConstructedTaskDialogIndirect()TTaskDialog

在 pre-Vista 上,或者UseLatestCommonDialogs=false禁用或禁用视觉样式时,这些函数会MessageDlg...()显示一个自定义 VCL ,您可以直接调用它,然后几乎可以查询、操作和显示您想要的返回值。当你完成使用它时,一定要确保它。TFormVcl.Dialogs.CreateMessageDialog()TFormFree()


推荐阅读