VC实现卡拉OK字幕叠加
2010-05-25 20:36:36 来源:WEB开发网一. GDI编程基础
字幕叠加,应当是属于图形、图像处理的范畴。在Windows平台上,图形、图像处理的方法当然首选GDI(Graphics Device Interface,图形设备接口)。GDI是什么?GDI其实是一套API函数;它们功能丰富,使用起来简单、灵活。下面,我们首先来介绍一些GDI编程的基础知识。
GDI函数有很多,我们大致可以把它们分成如下几类:
· 设备上下文(Device Context,简称DC)函数,如GetDC、CreateDC、DeleteDC等;
· 画线函数,如LineTo、Polyline、Arc等;
· 填充画图函数,如Ellipse、FillRect、Pie等;
· 画图属性函数,如SetBkColor、SetBkMode、SetTextColor等;
· 文本、字体函数,如TextOut、GetTextExtentPoint32、GetFontData等;
· 位图函数,如SetPixel、BitBlt、StretchBlt等;
· 坐标函数,如DPtoLP、LPtoDP、ScreenToClient、ClientToScreen等;
· 映射函数,如SetMapMode、SetWindowExtEx、SetViewportExtEx等;
· 元文件(MetaFile)函数,如PlayMetaFile、SetWinMetaFileBits等;
· 区域(Region)函数,如FillRgn、FrameRgn、InvertRgn等;
· 路径(Path)函数,如BeginPath、EndPath、StrokeAndFillPath等;
· 裁剪(Clipping)函数,如SelectClipRgn、SelectClipPath等。
上述这些函数可以完成绘制用户界面中的各个部分,包括我们在Windows平台上司空见惯的窗口、菜单、工具条、按钮等。除了完成显示操作功能外,GDI还提供了一些绘图对象,用以渲染显示。这些GDI对象包括:
设备上下文(DC)——具有如显示器或打印机等输出设备的绘图属性信息的数据结构;
画笔(Pen)——用于绘制线条;
画刷(Brush)——用于图案的填充;
字体(Font)——用于确定文本字符的样式;
位图(Bitmap)——用于存储图像;
调色板(Palette)——屏幕上画图时可以使用的一些颜色的集合。
DC在GDI中是一个非常重要的概念。在MSDN上查看各个GDI函数的使用说明,我们会发现大部分GDI函数都有一个HDC类型的参数;HDC就是DC句柄。Windows应用程序进行图形、图像处理的一般操作步骤如下:
1. 取得指定窗口的DC;
2. 确定使用的坐标系及映射方式;
3. 进行图形、图像或文字处理;
4. 释放所使用的DC。
为了进一步简化GDI函数的使用,或者说为了适应面向对象的程序设计风格,微软的MFC类库提供了几个DC的封装类。这些类的继承关系如下:
图1 关于DC的几个MFC类的继承关系
我们知道,绝大部分MFC类都是从CObject类派生的,CDC类也不例外。我们看到,CDC类是最基本的DC封装类;它几乎对应封装了所有的GDI函数。另外,CDC类的各个派生类各有专门的用途:
CClientDC——在窗口的客户区画图的DC;
CMetaFileDC——用于操作Windows元文件的DC;
CPaintDC——响应WM_PAINT消息时画图使用的DC,多见于MFC程序的OnDraw函数中;
CWindowDC——在整个窗口范围(包括框架、工具条等)中画图的DC。
MFC除了对DC进行类封装外,对其它GDI对象也进行了类封装。这些类的继承关系如下:
图2 GDI对象的MFC封装类的继承关系
CGdiObject——GDI对象的父类,定义了GDI对象封装类的一些公有函数接口;
CBitmap——位图相关操作的封装类,包括位图的装入或创建等;
CBrush——画刷对象的封装类;
CFont——字体属性及相关操作的封装类;
CPalette——调色板的封装类;
CPen——画笔对象的封装类;
CRgn——区域对象以及区域相关操作的封装类。
通过上述介绍,相信读者对GDI编程有了一定的了解。接下去,我们就来讨论卡拉OK字幕叠加的实现原理。
更多精彩
赞助商链接