首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ 實現「關於」對話框動態文字播放:全螢幕背景 + 無模式對話框 + 字模動畫控件

     編輯:關於VC++

傳統靜態「關於」視窗單調乏味。本文實作一個全螢幕背景圖片 + 無模式對話框 + 自製 CTitleShow 動畫控件,使版權資訊、授權條款、開發團隊等文字以「電影字幕」方式逐字滾動、淡入淡出、彩色變換播放,大幅提升專業感。

整體架構

  1. 主視窗全螢幕化:CMainFrame::OnCreate 隱藏標題列/選單/工具列/狀態列,MoveWindow 擴展至螢幕解析度,隱藏系統工作列。
  2. View 繪製背景圖:OnPaint 使用 StretchBlt 貼滿客戶區,OnEraseBkgnd 回傳 TRUE 禁止預設擦除。
  3. 無模式對話框載入動畫控件:CShowAboutDlg (Style=Popup, Border=None) 建立於 View 上,客戶區填滿 CTitleShow 控件。
  4. 字模動畫核心:CTitleShow 繼承 CStatic,內建雙緩衝、逐字定時器、顏色/字型/位置關鍵幀插值。

關鍵程式碼片段

1. 主視窗全螢幕化與工作列隱藏


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);
  // ...
}

2. View 背景繪製


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; }

3. 建立並顯示無模式關於對話框


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);
}

4. 攔截 ESC/Enter 關閉對話框


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);
}

5. CTitleShow 動畫控件核心 (簡述)

  • 繼承 CStatic,SS_OWNERDRAW 模式。
  • 成員:vector m_segments (文字、字型、顏色、起迄時間、位置)。
  • OnTimer (50ms) 計算當前時間對應段落、插值 Alpha/位置/顏色,Invalidate()。
  • OnPaint 使用 CDC::DrawText / TextOut 繪製可見段落,雙緩衝防閃爍。
  • 支援關鍵幀腳本 (XML/自訂格式) 載入,實現複雜編排。

效果展示

動態關於對話框演示

總結與擴充建議

  • 全螢幕背景 + 無模式對話框 + 自繪動畫控件,三層架構職責清晰。
  • 動畫腳本外部化 (XML/JSON) 方便非程式人員維護內容。
  • 可擴充:支援圖片/視頻片段穿插、多語系切換、語音旁白同步。
  • 現代替代方案:Direct2D/DirectWrite 高效能繪製、WPF/XAML Storyboard、WebView2 載入 HTML5 動畫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved