假設(shè)您要將模式窗口為主的桌面程序改成融合窗口,原子窗口為TForm類型窗口。
用到的組件:Raize 5.x (不要問我為什么不用TFrame)
目前流行用Raize的RzPageControl來做融合窗口,因為它自帶TabSheet的關(guān)閉按鈕和
事件,所以大家都用這個了。
我的實現(xiàn)方法是放一個RzTabSheet當(dāng)首頁,上面顯示一些通知通告、待辦事項提醒的
項目,然后所有子模塊的窗口直接動態(tài)創(chuàng)建到RzPageControl里去,創(chuàng)建代碼如下:
procedure TfrmMain.N13Click(Sender: TObject);
var
f : TfrmCallTask;//需要給子模塊傳遞變量,所以這樣定義
TabCtrl : TRzTabSheet;//容器
i : Integer;
begin
for i := 0 to RzPageControl1.PageCount - 1 do
if RzPageControl1.Pages[i].Caption = '任務(wù)列表' then
begin
RzPageControl1.Pages[i].Show;
exit;
end;//這里是根據(jù)子模塊窗口的標題來區(qū)分有沒有生成,有生成就激活顯示
TabCtrl := TRzTabSheet.Create(RzPageControl1);//創(chuàng)建容器
TabCtrl.PageControl := RzPageControl1;//容器歸屬
RzPageControl1.ActivePageIndex := TabCtrl.PageIndex;//激活容器頁
f := TfrmCallTask.Create(TabCtrl);//創(chuàng)建窗口
//我這里用的是TForm而不是TFrame,所以是有窗口標題這些屬性的
TabCtrl.Caption := f.Caption;//用窗口標題當(dāng)標簽頁名稱
f.ManualDock(TabCtrl);//將窗口融合到容器里
f.Align := alClient;//窗口自適應(yīng)
f.vU := vU;//這里是設(shè)置窗口模塊里的變量,當(dāng)然也可以操作組件
f.vN := vN;
f.Show;
f.SetFocus;//窗口顯示后做個聚焦
end;
關(guān)于窗口中的按鍵事件,也就是onKeyPress,因為我用的是TForm,所以可以直接使
用這個事件,只是切換組件時,需要以消息的形式來處理,代碼如下:
procedure TfrmCallList.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if (Key = #13) then
begin
Key := #0;
PostMessage(Handle, WM_KEYDOWN, VK_TAB, 0);//模擬按下Tab鍵
//Perform(WM_NEXTDLGCTL, 1, 0);//模式窗口時有效,融合窗口時無效
end;
end;
關(guān)于融合窗口的關(guān)閉,也簡單的,只要在RzPageControl的Close事件里設(shè)置
AllowClose為真即可,代碼如下:
procedure TfrmMain.RzPageControl1Close(Sender: TObject;
var AllowClose: Boolean);
begin //因為我不想關(guān)閉“首頁”這個RzTabSheet,所以這樣判斷就行。
AllowClose := RzPageControl1.ActivePage.Caption <> '首頁'
end;
其他事項呢,不要忘記設(shè)置RzPageControl的幾個相關(guān)屬性來顯示標簽頁樣式和關(guān)閉
按鈕就行了,比如ShowCloseButtonOnActiveTab為真,ShowCloseButton這個為假。