【MFC】滚动字幕的状态栏
00. 目录
文章目录
- 00. 目录
- 01. 案例概述
- 02. 开发环境
- 03. 关键技术
- 04. 程序设计
- 05. 秘笈心法
- 06. 源码下载
- 07. 附录
01. 案例概述
在火车站、客运站等许多公共场所,随处可以看见一个大屏幕,上面经常会以滚动字幕的形式显示一些信息。它是如何实现的呢?本案例实现了一个滚动字幕的状态栏,效果如下图所示。

02. 开发环境
系统环境:Windows 10
开发环境:Visual Studio 2019
03. 关键技术
在状态栏中实现滚动字幕,可以利用静态文本控件实现。在状态栏中显示一个静态文本控件,然后每隔一段时间调整静态文本控件的位置,即可实现滚动字幕的效果了。设置定时器时,需要使用SetTimer方法来实现。
SetTimer方法来设置一个定时器。语法如下:
返回值:
如果函数成功,则返回新定时器的标识符。应用程序可以将这个值传递给KillTimer成员函数以销毁定时器。如果成功,则返回非零值;否则返回0。参数: nIDEvent 指定了不为零的定时器标识符。
nElapse 指定了定时值;以毫秒为单位。
lpfnTimer 指定了应用程序提供的TimerProc回调函数的地址,该函数被用于处理WM_TIMER消息。如果这个参数为NULL,则WM_TIMER消息被放入应用程序的消息队列并由CWnd对象来处理。
04. 程序设计
(1)新建一个基于对话框的应用程序。
(2)创建CstatusBar类型的变量m_StatusBar;
(3)在对话框类的OnInitDialog方法中创建状态栏,将静态文本控件显示在状态栏中。
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();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。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);}}// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动// 执行此操作SetIcon(m_hIcon, TRUE); // 设置大图标SetIcon(m_hIcon, FALSE); // 设置小图标// TODO: 在此添加额外的初始化代码UINT array[3];for (int i = 0; i < 3; i++){array[i] = 1000 + i;}//创建状态栏窗口m_StatusBar.Create(this);//添加面板m_StatusBar.SetIndicators(array, sizeof(array) / sizeof(UINT));//设置面板宽度for (int i = 0; i < 3; i++){m_StatusBar.SetPaneInfo(i, array[i], 0, 120);}//设置面板文本m_StatusBar.SetPaneText(0, TEXT("当前用户"));m_StatusBar.SetPaneText(1, TEXT("沧海一笑"));m_StatusBar.SetPaneText(2, TEXT(" www.qq.com"));//在客户区中重定位控制条并改变其大小RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);//设置定时器SetTimer(1, 300, NULL);return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}//擦除背景
BOOL CMy1StatusToolDlg::OnEraseBkgnd(CDC* pDC)
{// TODO: 在此添加消息处理程序代码和/或调用默认值//IDB_BKBMP//TODO: 在此添加消息处理程序代码和/或调用默认值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);//返回为真 设置背景图片return TRUE;//return CDialogEx::OnEraseBkgnd(pDC);
}
(4)启动定时器,并且动态改变字符串的位置信息。
void CMy1StatusToolDlg::OnTimer(UINT_PTR nIDEvent)
{// TODO: 在此添加消息处理程序代码和/或调用默认值CString sText, sLeft, sRight;int len;//获取第三个面板的字符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. 秘笈心法
滚动字幕的状态栏
结合定时器,定期调整字符串的位置,然后设置字符串即可。
06. 源码下载
下载:【MFC】滚动字幕的状态栏.rar
07. 附录
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
