检测表单的滚动条是否在mdi子项中可见

时间:2010-07-29 01:44:38

标签: delphi mdi

我无法检测表单的滚动条是否可见。 谷歌互联网显示下面的代码应该工作。每个人都使用它:

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,主题

2 个答案:

答案 0 :(得分:1)

试试这个:

function VertScrollBarVisible(Form : TForm) : Boolean;
  begin
    Result:=(Form.Width-Form.ClientWidth>10)
  end;

我不确定它是否有效,但它将表单的“可用”宽度与表单的“总”宽度进行比较(通常它们彼此相差2-3个像素,但带有滚动条,可用宽度应显着降低。)

答案 1 :(得分:1)

  

它始终返回False,即使滚动条可见。一些MDI子窗体可以看到它们,我将它拖出屏幕。

表明您遇到问题的表单是MDI父表单(FormStylefsMDIForm)。

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