我无法检测表单的滚动条是否可见。 谷歌互联网显示下面的代码应该工作。每个人都使用它:
function VertScrollBarVisible(WindowHandle: THandle): Boolean;
begin
Result:= (GetWindowlong(WindowHandle, GWL_STYLE) AND WS_VSCROLL) <> 0
end;
我称之为:
procedure TFrmBaser.Button1Click(Sender: TObject);
begin
if VertScrollBarVisible(MainForm.Handle)
then Caption:= 'visible';
end;
它始终返回False,即使滚动条可见。一些MDI子窗体可以看到它们,我将它拖出屏幕。
Delphi 7,Win XP SP3,主题
答案 0 :(得分:1)
试试这个:
function VertScrollBarVisible(Form : TForm) : Boolean;
begin
Result:=(Form.Width-Form.ClientWidth>10)
end;
我不确定它是否有效,但它将表单的“可用”宽度与表单的“总”宽度进行比较(通常它们彼此相差2-3个像素,但带有滚动条,可用宽度应显着降低。)
答案 1 :(得分:1)
此
它始终返回False,即使滚动条可见。一些MDI子窗体可以看到它们,我将它拖出屏幕。
表明您遇到问题的表单是MDI父表单(FormStyle
是fsMDIForm
)。
MDI父表单与普通表单不同,它们创建一个特殊的客户端窗口,填充表单的整个客户区域,并管理MDI子窗口/表单。 MDI客户端窗口永远不会大于其父窗口的客户端区域,因此父窗体永远不会显示滚动条。这解释了问题中的代码总是返回false。
您看到的滚动条是MDI客户端窗口的一部分。修改代码以检查客户端窗口的窗口样式,可以使用MDI父窗体的ClientHandle
属性访问其句柄:
procedure TFrmBaser.Button1Click(Sender: TObject);
begin
if VertScrollBarVisible(MainForm.ClientHandle) then
Caption := 'visible';
end;
有关Windows API级别的MDI的详细信息,请参阅MSDN上的About the Multiple Document Interface。