傳統靜態「關於」視窗單調乏味。本文實作一個全螢幕背景圖片 + 無模式對話框 + 自製 CTitleShow 動畫控件,使版權資訊、授權條款、開發團隊等文字以「電影字幕」方式逐字滾動、淡入淡出、彩色變換播放,大幅提升專業感。
CMainFrame::OnCreate 隱藏標題列/選單/工具列/狀態列,MoveWindow 擴展至螢幕解析度,隱藏系統工作列。OnPaint 使用 StretchBlt 貼滿客戶區,OnEraseBkgnd 回傳 TRUE 禁止預設擦除。CShowAboutDlg (Style=Popup, Border=None) 建立於 View 上,客戶區填滿 CTitleShow 控件。CTitleShow 繼承 CStatic,內建雙緩衝、逐字定時器、顏色/字型/位置關鍵幀插值。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCS) {
if (CFrameWnd::OnCreate(lpCS) == -1) return -1;
FindWindow(_T("Shell_TrayWnd"), NULL)->ShowWindow(SW_HIDE); // 隱藏工作列
return 0;
}
void CMainFrame::OnClose() {
FindWindow(_T("Shell_TrayWnd"), NULL)->ShowWindow(SW_SHOW); // 還原
CFrameWnd::OnClose();
}
BOOL CMyApp::InitInstance() {
// ...
m_pMainWnd->SetMenu(NULL);
m_pMainWnd->ModifyStyle(WS_THICKFRAME|WS_CAPTION, 0);
m_pMainWnd->MoveWindow(CRect(0,0,
GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)), TRUE);
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
// ...
}
void CAboutView::OnPaint() {
CPaintDC dc(this);
HBITMAP hBmp = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BACKBMP));
HDC hMemDC = CreateCompatibleDC(NULL);
SelectObject(hMemDC, hBmp);
StretchBlt(dc.m_hDC, 0,0, 1024,768, hMemDC, 0,0, 1024,768, SRCCOPY);
DeleteDC(hMemDC); DeleteObject(hBmp);
}
BOOL CAboutView::OnEraseBkgnd(CDC* pDC) { return TRUE; }
CShowAboutDlg* m_pAboutDlg = NULL;
void CAboutView::OnInitialUpdate() {
CView::OnInitialUpdate();
m_pAboutDlg = new CShowAboutDlg();
m_pAboutDlg->Create(IDD_ABOUT_DLG);
CRect rc;
m_pAboutDlg->MoveWindow(CRect(18,18,
GetSystemMetrics(SM_CXSCREEN)-13,
GetSystemMetrics(SM_CYSCREEN)-16), TRUE); // 預留背景圖邊框
m_pAboutDlg->GetClientRect(&rc);
m_pAboutDlg->m_TitleShow.MoveWindow(rc, TRUE); // 動畫控件填滿
m_pAboutDlg->ShowWindow(SW_SHOW);
}
BOOL CShowAboutDlg::PreTranslateMessage(MSG* pMsg) {
if (pMsg->message == WM_KEYDOWN) {
if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)
return TRUE; // 吞掉按鍵,防止預設關閉行為
}
return CDialog::PreTranslateMessage(pMsg);
}
CStatic,SS_OWNERDRAW 模式。vector m_segments (文字、字型、顏色、起迄時間、位置)。OnTimer (50ms) 計算當前時間對應段落、插值 Alpha/位置/顏色,Invalidate()。OnPaint 使用 CDC::DrawText / TextOut 繪製可見段落,雙緩衝防閃爍。