Windows Template Library (WTL) 以模板實現極輕量級 GUI 框架,無需 MFC DLL,執行檔最小僅 24KB。本文記錄 WTL 7.0 AppWizard 安裝、SDI 專案建立、核心類別架構解析,並實作多欄位狀態列(含圖示與文字)。
WTL70_AppWizard.msi,VC6 File → New 出現 ATL/WTL AppWizard。.h 複製至 VC98/Include 或專案目錄。_Module 全域模組實例對應 MFC theApp,型別 CAppModule,維護訊息迴圈 Map。
_tWinMainint WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE, LPTSTR lpCmd, int nShow) {
CoInitialize(NULL);
DefWindowProc(NULL,0,0,0); // MSLU 相容
AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES);
_Module.Init(NULL, hInst);
int nRet = Run(lpCmd, nShow);
_Module.Term(); CoUninitialize(); return nRet;
}
Runint Run(LPTSTR lpCmd = NULL, int nShow = SW_SHOWDEFAULT) {
CMessageLoop theLoop; _Module.AddMessageLoop(&theLoop);
CMainFrame wndMain;
if (wndMain.CreateEx() == NULL) return 0;
wndMain.ShowWindow(nShow);
int nRet = theLoop.Run();
_Module.RemoveMessageLoop(); return nRet;
}
匯入三個圖示資源:IDR_DEFAULT、IDR_DATE、IDR_TIME。
class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame> {
CMultiPaneStatusBarCtrl m_Mstatus; // 多欄狀態列
// ...
};
OnCreate 初始化static int panes[] = { IDR_DEFAULT, IDR_DATE, IDR_TIME };
static int widths[] = { 450, 200, 600 };
int CMainFrame::OnCreate(LPCREATESTRUCT lpCS) {
CreateSimpleStatusBar(); // 建立基本狀態列
m_Mstatus.SubclassWindow(m_hWndStatusBar); // 子類別化
m_Mstatus.SetPanes(panes, _countof(panes), FALSE);
m_Mstatus.SetPaneWidth(IDR_DEFAULT, 400);
m_Mstatus.SetPaneWidth(IDR_DATE, 200);
m_Mstatus.SetPaneWidth(IDR_TIME, 900);
m_Mstatus.SetPaneIcon(IDR_DEFAULT, AtlLoadIconImage(IDR_DEFAULT, LR_DEFAULTCOLOR));
m_Mstatus.SetPaneIcon(IDR_DATE, AtlLoadIconImage(IDR_DATE, LR_DEFAULTCOLOR));
m_Mstatus.SetPaneIcon(IDR_TIME, AtlLoadIconImage(IDR_TIME, LR_DEFAULTCOLOR));
m_Mstatus.SetPaneText(IDR_DATE, _T("WTL is very wonderful!"), 0);
m_Mstatus.SetPaneText(IDR_TIME, _T("WWW.VCKBASE.COM"), 0);
return 0;
}
CString、CRect、CWindow 等常用封裝。