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

系統動態顯示資訊的實作方法:打造電影字幕般的視覺體驗

     編輯:關於VC++

前言

傳統系統說明檔顯示資訊多採靜態方式,介面單調乏味。專案開發過程中,筆者在各大技術網站搜尋後發現一個優秀的字模顯示控制元件類別,經過擴充實現動態顯示功能,完成後的說明資訊能如電影播放般動態呈現,效果極佳。現將製作流程、程式碼與示範效果分享,期望對相關研究者有所助益。文中顯示的文字內容可依專案需求自行修改。

全螢幕顯示架構設計

採用全螢幕顯示方式,但傳統 View 全螢幕效果不佳,改採:主框架移動至螢幕解析度大小 → 移除標題列、功能表列、工具列、狀態列 → 貼上背景圖片 → 載入功能顯示元件。簡單做法是在背景圖上動態建立 CStatic 控制元件,但因系統涉及多功能介面,採用無模式對話方塊形式,建立後 MoveWindow 至指定位置。

具體實作步驟

1. 修改 App 的 InitInstance() 實現全螢幕框架

// 唯一視窗已初始化,顯示與更新
m_pMainWnd->SetMenu(NULL);  // 移除功能表
m_pMainWnd->ModifyStyle(WS_THICKFRAME | WS_CAPTION, NULL);  // 修改視窗屬性
m_pMainWnd->MoveWindow(CRect(0, 0,
    ::GetSystemMetrics(SM_CXSCREEN),
    ::GetSystemMetrics(SM_CYSCREEN)), TRUE);  // 移至螢幕解析度大小
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
m_pMainWnd->UpdateWindow();

2. 修改 MainFrame 移除工具列與狀態列

修改 PreCreateWindow(CREATESTRUCT& cs) 函式:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    FindWindow("Shell_TrayWnd", NULL)->ShowWindow(SW_HIDE);  // 隱藏工作列
    return 0;
}

3. 程式結束時恢復工作列

攔截 WM_CLOSE 訊息恢復狀態:

void CMainFrame::OnClose()
{
    FindWindow("Shell_TrayWnd", NULL)->ShowWindow(SW_SHOW);  // 恢復工作列
    CFrameWnd::OnClose();
}

4. 貼上背景點陣圖

對應 View 的 WM_PAINT 訊息繪製背景,對應 WM_ERASEBKGND 處理螢幕清除,回傳 TRUE:

void CAboutDemoView::OnPaint()
{
    CPaintDC dc(this);
    HBITMAP hbitmap = ::LoadBitmap(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BACKBMP));
    HDC hMenDC = ::CreateCompatibleDC(NULL);
    SelectObject(hMenDC, hbitmap);
    ::StretchBlt(dc.m_hDC, 0, 0, 1024, 768, hMenDC, 0, 0, 1024, 768, SRCCOPY);
    ::DeleteDC(hMenDC);
    ::DeleteObject(hbitmap);
}

5. 建立資訊顯示無模式對話方塊

  • 建立對話方塊資源,屬性設定:Style→Popup, Border→None
  • 建立對話方塊類別 CShowAboutDlg
  • 放置 CStatic 控制元件並調整位置
  • 在 View 中建立並顯示:
CShowAboutDlg* m_pAboutDlg = new CShowAboutDlg();
m_pAboutDlg->Create(IDD_ABOUT);
m_pAboutDlg->MoveWindow(CRect(18, 18,
    ::GetSystemMetrics(SM_CXSCREEN)-13,
    ::GetSystemMetrics(SM_CYSCREEN)-16), TRUE);
CRect rect;
m_pAboutDlg->GetClientRect(&rect);
m_pAboutDlg->m_AboutCtrl.MoveWindow(rect, TRUE);  // 圖片控制元件佔滿客戶區
m_pAboutDlg->ShowWindow(SW_SHOW);

6. 整合字模顯示控制元件類別

加入專案檔案:ZgMemDC、ZgDraw.h/.cpp、TitleShow.h/.cpp、PublicClass.h/.cpp、AutoFont.h/.cpp。在原作者基礎上修改文字顯示相關程式碼,調整字體符合系統顯示需求。

7. 對話方塊類別中載入顯示訊息

定義顯示 CStatic 類別物件 TitleShow,在初始化中加入顯示內容。

8. 攔截 Enter 與 ESC 鍵防止對話方塊意外關閉

BOOL CShowAboutDlg::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYDOWN)
    {
        switch (pMsg->wParam)
        {
            case VK_RETURN:
            case VK_ESCAPE:
                return TRUE;  // 攔截不傳遞預設處理
        }
    }
    return CDialog::PreTranslateMessage(pMsg);
}

編譯執行與效果預覽

完成上述步驟後編譯執行專案,即可看到如電影字幕般動態呈現的系統說明資訊。此法將枯燥的靜態文字轉化為生動的視覺體驗,大幅提升使用者介面的專業度與吸引力。

技術要點總結

  • 全螢幕模擬:透過視窗樣式修改與位置調整實現,而非真正獨佔模式
  • 背景繪製優化:WM_ERASEBKGND 回傳 TRUE 避免閃爍,StretchBlt 適應不同解析度
  • 無模式對話方塊:不阻塞主執行緒,支援複雜介面互動
  • 字模動畫引擎:基於時間軸的字元逐漸顯示/滾動/淡入效果
  • 按鍵攔截:PreTranslateMessage 過濾特定按鍵防止誤觸關閉
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved