TAboutBox) 作為啟動畫面。WinMain 中:建立啟動畫面 → Show/Update → 建立主表單 → 延遲 → 隱藏/釋放啟動畫面 → Application->Run()。File → New Form,設計外觀 (Logo、版本、進度條、版權資訊)。AboutBox.cpp/h,類別名 TAboutBox。Project → Options → Forms,將 AboutBox 從「Auto-create forms」移至「Available forms」。Project1.cpp)
#include
#pragma hdrstop
#include "AboutBox.h" // 包含啟動畫面標頭
USERES("Project1.res");
USEFORM("Unit1.cpp", Form1); // 主表單
USEFORM("AboutBox.cpp", AboutBox); // 可用但不自動建立
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try {
Application->Initialize();
// 1. 建立並顯示啟動畫面
AboutBox = new TAboutBox(AboutBox); // Owner 為自身或 NULL
AboutBox->Show();
AboutBox->Update(); // 強制立即繪製,避免閃爍
// 2. 記錄開始時間 (模擬載入耗時)
DWORD startTime = GetTickCount();
// 3. 建立主表單 (此時可能執行耗時初始化)
Application->CreateForm(__classid(TForm1), &Form1);
// 4. 確保最小顯示時間 (如 3 秒)
while ((GetTickCount() - startTime) < 3000) {
Application->ProcessMessages(); // 保持啟動畫面回應
Sleep(10);
}
// 5. 關閉啟動畫面
AboutBox->Hide();
delete AboutBox; // 或 AboutBox->Free();
AboutBox = NULL;
// 6. 進入主訊息迴圈
Application->Run();
}
catch (Exception &exception) {
Application->ShowException(&exception);
}
return 0;
}
// AboutBox.h 增加公共方法
void __fastcall SetProgress(int percent, const String &status);
// WinMain 中
AboutBox->SetProgress(10, "正在載入設定...");
Application->CreateForm(__classid(TSettings), &Settings);
AboutBox->SetProgress(40, "正在連接資料庫...");
Database->Connect();
AboutBox->SetProgress(70, "正在載入模組...");
LoadPlugins();
AboutBox->SetProgress(100, "啟動完成");
| 點 | 說明 |
|---|---|
AboutBox->Update() | 強制處理 WM_PAINT,確保啟動畫面立即可見,否則可能卡在主表單建構子中。 |
Application->ProcessMessages() | 在等待迴圈中呼叫,保持啟動畫面可移動、重繪、響應關閉按鈕。 |
| 最小顯示時間 | 避免啟動過快導致畫面一閃而過,體驗差。 |
| Owner 設定 | new TAboutBox(AboutBox) 自己擁有自己,或 new TAboutBox(Application) 由 Application 擁有。 |
| 異常安全 | 建構子拋出異常時,catch 區塊會顯示異常,但 AboutBox 可能洩漏,建議用智慧指標或 try/finally。 |
TSplashScreen,支援淡入淡出、動畫、多執行緒載入。TSplashScreen 開源實作。
// 專案源碼修改
Application->ShowMainForm = false; // 不自動顯示主表單
ShowWindow(Application->Handle, SW_HIDE); // 隱藏應用程式工作列按鈕
// 後續由啟動畫面或托盤圖示決定何時顯示主表單

啟動畫面不僅美化體驗,更能掩蓋主表單複雜初始化的延遲,是專業級桌面應用的標配。