---- 用過DreamWeaver的人都會發現DreamWeaver將每一個編輯的文件顯示在任務欄上,並且用戶任意關閉一窗口而不影響其他窗口,好象每一個窗口間沒有關聯,沒有主窗口似的。但我們也能發現其實這些窗口間也有數據是共享的,如存盤的路徑。
---- 經過研究我發現其實這些窗口其實是屬於同一程序的,並且實現方法也非常的簡單。下面我用Inprise公司的C++ Builder為大家舉一個簡單的例子。
---- 首先我們創建一個普通的應用程序。在這個程序中包含兩個Form,其中Form1為主窗口,我們將Form2設為不由應用程序自動創建。
---- 在Form1中加入一新的Public的屬性:
---- int FormCount;
---- 此屬性用於記錄系統建立的From2的實例的個數,在Form1的OnCreate事件中加入如下代碼:
int i=GetWindowLong(this- >Handle,GWL_STYLE);
TForm2 *F,*G;
F=new TForm2(NULL);
G=new TForm2(NULL);
F- >ParentWindow=GetDesktopWindow();
F- >Caption="F";
G- >ParentWindow=GetDesktopWindow();
G- >Caption="G";
this- >FormCount=2;
SetWindowLong(G- >Handle,GWL_STYLE,i);
SetWindowLong(F- >Handle,GWL_STYLE,i);
F- >Show();
G- >Show();
---- 其中GetWindowLong,SetWindowLong為獲取/設置Window屬性的API函數,具體請看C++ Builder帶的Win32幫助。然後運行程序,我們就能發現程序在任務欄上顯示了屬於此程序的三個任務條。
---- 接下來我們要做的事情有兩個:
---- 1、 隱藏Form1及Application
---- 2、 讓Form2的實例關閉應用程序
---- 實現第一件事情的方法在網上很多地方都提到了,即修改WinMain函數下面是具體的代碼(粗斜體為加入的代碼):
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application- >Initialize();
Application- >CreateForm(
__classid(TForm1), &Form1);
Application- >ShowMainForm=false;
ShowWindow(Application- >Handle, SW_HIDE);
Application- >Run();
}
catch (Exception &exception)
{
Application- >ShowException(&exception);
}
return 0;
}
---- 在這個地方要注意的是光用“Application->ShowMainForm=false;”是不能隱藏主Form(Form1)的,必須將Form1的Visibled屬性變為false。
---- 實現第二件事情需要用到Application的Terminate方法(結束應用程序)。我們只要在TForm2的OnClose事件中簡單加入以下幾句程序:
if (Form1- >FormCount>1)
Form1- >FormCount--;
else
Application- >Terminate();
---- 運行程序,你就能發現程序在有任務攔上有兩個提示,窗口F及窗口G,而且這兩個窗口看起來就象獨立的應用程序。
---- 至此,一個DreamWeaver風格的程序就做完了,是不是很簡單呢。