26.2 多媒体应用
使用多媒体可以增加程序功能,实现多种效果。本节介绍几个有关多媒体的应用。26.2.1小节和26.2.2小节介绍屏幕保护程序的创建,包括滚动字体的屏幕保护程序和相册屏幕保护程序的编写。26.2.3小节介绍如何编写画图程序。通过本节的学习,应该能根据自己的需求编写适合的应用程序。
26.2.1 滚动字体的屏幕保护
通过设置程序的窗体的样式和定时器机制以及GDI的图形绘制功能,可以实现屏幕保护的功能。本节介绍如何实现滚动字体的屏幕保护程序。步骤如下:
(1)创建实现屏幕保护功能的对话框类CPhotoScreenWnd,此对话框类在Create()函数中,创建全屏显示的黑色背景对话框,并且启动定时器。代码如下:
- BOOL CPhotoScreenWnd::Create() // 创建图片屏保
- {
- if (lpszClassName==NULL) // 判断类名
是否为NULL,如果为NULL,注册类 - {
- lpszClassName=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,
- ::LoadCursor(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDC_NOCURSOR))); - }
- // 获取屏幕分辨率
- CRect rect(0,0,::GetSystemMetrics(SM_CXSCREEN),
::GetSystemMetrics - (SM_CYSCREEN));
- // 创建顶层窗口
- CreateEx(WS_EX_TOPMOST,lpszClassName,_T(""),
WS_VISIBLE|WS_POPUP, - rect.left,rect.top,rect.right-rect.left,
rect.bottom-rect.top, - GetSafeHwnd(),NULL,NULL);
- SetTimer(m_idTimer, 500, NULL); // 开启定时器
- return true;
- }
上面函数会启动定时器,定时器的处理会在屏幕上显示文字,并增加文字的位置偏移量。在屏幕上显示文字的函数代码如下:
- void CPhotoScreenWnd::DrawText(CDC& dc, int nIndex)
// 绘制文本函数 - {
- RedrawWindow(); // 重绘窗体
- int width = ::GetSystemMetrics(SM_CXSCREEN);
- int height = ::GetSystemMetrics(SM_CYSCREEN);
// 获取屏幕分辨率 - int colWidth = width/m_nTextCount; // 设置列宽
- dc.TextOut(nIndex*colWidth, height/2,
"欢迎进入屏保测试"); -
// 在指定位置输出文本内容 - }
上面函数会根据当前显示的次数来确定本次显示文字的横坐标位置,实现文字的水平滚动。如果要实现文字的垂直滚动,则需要根据当前显示的次数来确定本次显示文字的纵坐标位置。屏幕保护程序在接收到用户输入时,会退出屏幕保护程序。因此,需要处理键盘按键和鼠标单击事件,当接收到这些输入时,会退出屏保程序。代码如下:
- void CPhotoScreenWnd::OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags)
- {
- PostMessage(WM_CLOSE);
// 鼠标按下时,退出屏保程序 - }
上面代码只显示了当按下键盘键时,会发送WM_CLOSE消息,退出屏幕保护程序,其他输入事件的处理是相同。
(2)在应用程序类CPhotoScreenSaverApp的InitInstance()函数中,调用屏幕保护对话框,代码如下。
- BOOL CPhotoScreenSaverApp::InitInstance()
// 应用程序示例化函数 - { …
- CPhotoScreenWnd* pWnd=new CPhotoScreenWnd;
// 创建屏保窗体句柄 - pWnd->Create();
// 创建窗体 - m_pMainWnd=pWnd;
// 记录句柄 - …
- }
上面代码会创建屏幕保护对话框类CPhotoScreenWnd,并调用其Create()函数,显示屏保对话框。
(3)编译、链接、生成应用程序,将生成的屏幕保护程序的EXE文件的扩展名修改为SCR,并将其放置在Windows系统目录下。这样在设置屏保的对话框中就可以预览自定义的滚动字体的屏幕保护程序,如图26-1所示。
|
| 图26-1 设置屏幕保护程序 |