【MFC】滚动字幕的状态栏
00. 目錄
文章目錄
- 00. 目錄
- 01. 案例概述
- 02. 開(kāi)發(fā)環(huán)境
- 03. 關(guān)鍵技術(shù)
- 04. 程序設(shè)計(jì)
- 05. 秘笈心法
- 06. 源碼下載
- 07. 附錄
01. 案例概述
在火車站、客運(yùn)站等許多公共場(chǎng)所,隨處可以看見(jiàn)一個(gè)大屏幕,上面經(jīng)常會(huì)以滾動(dòng)字幕的形式顯示一些信息。它是如何實(shí)現(xiàn)的呢?本案例實(shí)現(xiàn)了一個(gè)滾動(dòng)字幕的狀態(tài)欄,效果如下圖所示。
02. 開(kāi)發(fā)環(huán)境
系統(tǒng)環(huán)境:Windows 10
開(kāi)發(fā)環(huán)境:Visual Studio 2019
03. 關(guān)鍵技術(shù)
在狀態(tài)欄中實(shí)現(xiàn)滾動(dòng)字幕,可以利用靜態(tài)文本控件實(shí)現(xiàn)。在狀態(tài)欄中顯示一個(gè)靜態(tài)文本控件,然后每隔一段時(shí)間調(diào)整靜態(tài)文本控件的位置,即可實(shí)現(xiàn)滾動(dòng)字幕的效果了。設(shè)置定時(shí)器時(shí),需要使用SetTimer方法來(lái)實(shí)現(xiàn)。
SetTimer方法來(lái)設(shè)置一個(gè)定時(shí)器。語(yǔ)法如下:
返回值: 如果函數(shù)成功,則返回新定時(shí)器的標(biāo)識(shí)符。應(yīng)用程序可以將這個(gè)值傳遞給KillTimer成員函數(shù)以銷毀定時(shí)器。如果成功,則返回非零值;否則返回0。參數(shù): nIDEvent 指定了不為零的定時(shí)器標(biāo)識(shí)符。 nElapse 指定了定時(shí)值;以毫秒為單位。 lpfnTimer 指定了應(yīng)用程序提供的TimerProc回調(diào)函數(shù)的地址,該函數(shù)被用于處理WM_TIMER消息。如果這個(gè)參數(shù)為NULL,則WM_TIMER消息被放入應(yīng)用程序的消息隊(duì)列并由CWnd對(duì)象來(lái)處理。04. 程序設(shè)計(jì)
(1)新建一個(gè)基于對(duì)話框的應(yīng)用程序。
(2)創(chuàng)建CstatusBar類型的變量m_StatusBar;
(3)在對(duì)話框類的OnInitDialog方法中創(chuàng)建狀態(tài)欄,將靜態(tài)文本控件顯示在狀態(tài)欄中。
BEGIN_MESSAGE_MAP(CMy1StatusToolDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_TIMER() END_MESSAGE_MAP()// CMy1StatusToolDlg 消息處理程序BOOL CMy1StatusToolDlg::OnInitDialog() {CDialogEx::OnInitDialog();// 將“關(guān)于...”菜單項(xiàng)添加到系統(tǒng)菜單中。// IDM_ABOUTBOX 必須在系統(tǒng)命令范圍內(nèi)。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設(shè)置此對(duì)話框的圖標(biāo)。當(dāng)應(yīng)用程序主窗口不是對(duì)話框時(shí),框架將自動(dòng)// 執(zhí)行此操作SetIcon(m_hIcon, TRUE); // 設(shè)置大圖標(biāo)SetIcon(m_hIcon, FALSE); // 設(shè)置小圖標(biāo)// TODO: 在此添加額外的初始化代碼UINT array[3];for (int i = 0; i < 3; i++){array[i] = 1000 + i;}//創(chuàng)建狀態(tài)欄窗口m_StatusBar.Create(this);//添加面板m_StatusBar.SetIndicators(array, sizeof(array) / sizeof(UINT));//設(shè)置面板寬度for (int i = 0; i < 3; i++){m_StatusBar.SetPaneInfo(i, array[i], 0, 120);}//設(shè)置面板文本m_StatusBar.SetPaneText(0, TEXT("當(dāng)前用戶"));m_StatusBar.SetPaneText(1, TEXT("滄海一笑"));m_StatusBar.SetPaneText(2, TEXT(" www.qq.com"));//在客戶區(qū)中重定位控制條并改變其大小RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);//設(shè)置定時(shí)器SetTimer(1, 300, NULL);return TRUE; // 除非將焦點(diǎn)設(shè)置到控件,否則返回 TRUE }//擦除背景 BOOL CMy1StatusToolDlg::OnEraseBkgnd(CDC* pDC) {// TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值//IDB_BKBMP//TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值CRect rect;GetWindowRect(&rect);CDC memDC;CBitmap bitmap;CBitmap* bmp = NULL;bitmap.LoadBitmap(IDB_BKBMP);//裝載背景位圖memDC.CreateCompatibleDC(pDC);bmp = memDC.SelectObject(&bitmap);pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);if (bmp) memDC.SelectObject(bmp);//返回為真 設(shè)置背景圖片return TRUE;//return CDialogEx::OnEraseBkgnd(pDC); }(4)啟動(dòng)定時(shí)器,并且動(dòng)態(tài)改變字符串的位置信息。
void CMy1StatusToolDlg::OnTimer(UINT_PTR nIDEvent) {// TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值CString sText, sLeft, sRight;int len;//獲取第三個(gè)面板的字符sText = m_StatusBar.GetPaneText(2);len = sText.GetLength();sRight = sText.Left(1);sLeft = sText.Right(len - 1);sText = sLeft + sRight;m_StatusBar.SetPaneText(2, sText);CDialogEx::OnTimer(nIDEvent); }05. 秘笈心法
滾動(dòng)字幕的狀態(tài)欄
結(jié)合定時(shí)器,定期調(diào)整字符串的位置,然后設(shè)置字符串即可。
06. 源碼下載
下載:【MFC】滾動(dòng)字幕的狀態(tài)欄.rar
07. 附錄
總結(jié)
以上是生活随笔為你收集整理的【MFC】滚动字幕的状态栏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【MFC】自绘对话框动画效果的状态栏
- 下一篇: 【MFC】带下拉菜单的工具栏