程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 創建Borland風格的漂浮式窗口

創建Borland風格的漂浮式窗口

編輯:Delphi

使用過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中的成員。

到此,大功告成了!其他一些細節,如是否允許用戶改變窗口大小,是否可以拖動窗口,都可以通過簡單調節而實現,就全看你的需要了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved