使用過Borland 系列開發工具產品(Delphi, C++Builder, Jbuilder)的朋友一定注意到Borland產品界面風格的特點,即屏棄了MDI(多文檔界面),而采用分離的多窗口,特別是主窗口浮動於屏幕的最上方,當最大化時主窗口並不占滿整個客戶區,而是仍處在屏幕上方,使用戶可以有更多的空間使用。那麼如何才能實現類似於主窗口這樣的效果呢?現在就在此介紹一下用Delphi實現的方法。
要實現上面所說的主窗口的效果,必須要做到三點:1、程序啟動時使主窗口位於屏幕的最上方,且寬度充滿整個屏幕;2、當用戶拖動停靠工具條(Dockable ToolBar/CoolBar)時,窗口能自動調整大小;3、當用戶點擊最大化按鈕時,窗口保持在屏幕最上方,且大小保持不變。
現在假設當前項目的主窗口(frmMain)中含有一個名為cbMain的CoolBar(一般主窗口只包含菜單和工具條)。將TfrmMain的Autosize屬性設為False。
具體步驟如下:
1、 為主窗口添加OnCreate事件,代碼如下:
procedure TfrmMain.FormCreate(Sender: TObject);
begin
Top:=0; //設定主窗口左上角到屏幕左上角
Left:=0; //
Width:=Screen.Width; //設定主窗口寬度為屏幕寬度
end;
Screen為系統預定義的類實例,對應與系統桌面,從其中可獲取屏幕的一些參數。
2、 在TfrmMain的定義部分添加私有成員:
private
H:integer ;
為主窗口添加OnResize事件,代碼如下:
procedure TfrmMain.FormResize(Sender: TObject);
begin
ClIEntHeight:=cbMain.Height; //將窗口客戶區高度設為CoolBar的高度
H:=Height; //將當前的窗口高度保存在變量H中
end;
由於窗口初始化時或點擊最大化按鈕時都會觸發OnResize事件,因此可以保證窗口高度始終正確。
3、 這是最關鍵的一步,我們必須改變Windows默認的最大化例程,來控制最大化後的窗口大小和位置。因此,我們重新映射響應WM_ GETMINMAXINFO的句柄。WM_GETMINMAXINFO消息在lparam中返回一個指向MINMAXINFO結構的指針,MINMAXINFO的結構如下:
tagMINMAXINFO =record
ptReserved : TPoint; //系統保留
ptMaxSize : TPoint; //最大化後的大小
ptMaxPosition : TPoint; //最大化後的位置
ptMinTrackSize : TPoint; //窗口的最小尺寸
ptMaxTrackSize : TPoint; //窗口的最大尺寸
End;
MINMAXINFO : tagMINMAXINFO;
針對我們的目的,只需要ptMaxSize,ptMaxPosition兩個成員就夠了。Windows在最大化窗口通過調用這個結構作為參數,來取代默認的最大化參數。
具體操作如下:
在TfrmMain的定義部分添加私有成員定義:
private
procedure FormMaximum(var Msg:TMessage);Message WM_GETMINMAXINFO;
以定義WM_GETMINMAXINFO的消息處理句柄。
在Implementation部分添加實現代碼:
procedure TfrmMain.FormMaximum(var Msg:TMessage);
var
lpmmi:^tagMINMAXINFO;
begin
lpmmi:=Pointer(Msg.LParam); //獲取指向tagMINMAXINFO的指針
lpmmi^.ptMaxSize:=Point(Screen.width,H); //設定窗口的長寬
lpmmi^.ptMaxPosition:=Point(0,0); //設定窗口左上角的位置
end;
有一點要注意:lpmmi^.ptMaxSize:=Point(Screen.width,H);一句不能寫成lpmmi^.ptMaxSize:=Point(Screen.width,frmMain.Height); 這是由於Tform是VCL控件,在此消息處理句柄中不可以直接引用Tform中的成員。
到此,大功告成了!其他一些細節,如是否允許用戶改變窗口大小,是否可以拖動窗口,都可以通過簡單調節而實現,就全看你的需要了。