2008-12-19 71 views
5

我有沒有標題的形式,使用上雙擊最大化:代碼如下:正確的方式來最大限度地提高德爾福(無字幕)形式

procedure xxxxxx; 
begin 
    if Form1.WindowState=wsNormal then 
     begin 
     Form1.WindowState:=wsMaximized; 
     Form1.SetBounds(0,0,screen.Width,screen.Height-getHeightOfTaskBar); 
     end 
     else 
     begin 
     Form1.WindowState:=wsNormal; 
     end; 

     ShowTrayWindow; 
end; 
function getHeightOfTaskBar : integer; 
var hTaskBar:HWND; 
    rect : TRect; 
begin 
    hTaskbar := FindWindow('Shell_TrayWnd', Nil); 
    if hTaskBar<>0 then 
     GetWindowRect(hTaskBar, rect); 

    Result:=rect.bottom - rect.top; 
end; 

這工作不錯,但我有圖在哪裏是任務欄重置SetBounds ...

什麼是正確的方法來做到這一點?

謝謝。

回答

9

聽起來不錯,但像Drejc指出,在任務欄可以出現在任何地方,所以也能額外停靠的側邊欄像谷歌桌面,AOL的Winamp等

相反或許使用類似Screen.WorkAreaRect得到客戶區屏幕。例如。

with Screen.WorkAreaRect do 
    Form1.SetBounds(Left, Top, Right - Left, Bottom - Top); 
+2

好,但這隻適用於主監視器。要在當前監視器上最大化它,您需要執行以下操作:使用Screen.MonitorFromWindow(Form1.Handle).WorkAreaRect執行Form1.SetBounds(左,頂部,右 - 左,底部 - 頂部); – Name 2013-06-03 13:07:22

0

一個額外的提示。任務欄也可以位於屏幕的右側或左側(不僅是頂部和底部)。所以你必須另外找出任務欄的位置。

我建議你看一下SetWidnowState的Delphi實現。在Delphi7的它是這部分代碼:

procedure TCustomForm.SetWindowState(Value: TWindowState); 
const 
    ShowCommands: array[TWindowState] of Integer = 
    (SW_SHOWNORMAL, SW_MINIMIZE, SW_SHOWMAXIMIZED); 
begin 
    if FWindowState <> Value then 
    begin 
    FWindowState := Value; 
    if not (csDesigning in ComponentState) and Showing then 
     ShowWindow(Handle, ShowCommands[Value]); 
    end; 
end; 

的的ShowWindow是一個Win32庫調用:

function ShowWindow; external user32 name 'ShowWindow'; 

其中USER32 = 'USER32.DLL';如果我沒有錯。 因此深入研究這個庫,也許有一些TaskBar的某個地方的信息。