翻译|其它|编辑:郝浩|2005-09-15 10:45:00.000|阅读 1574 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
BYTE | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | BIT |
1 | 扩展块标识 | Extension Introducer - 标识这是一个扩展块,固定值0x21 | |||||||
2 | 注释块标签 | Comment Label - 标识这是一个注释块,固定值0xFE | |||||||
... |
Comment Data - 一个或多个数据块(Data Sub-Blocks)组成 | ||||||||
注释块 |
|||||||||
... |
|||||||||
块终结器 | Block Terminator - 标识注释块结束,固定值0 |
图形文本扩展(Plain Text Extension)
这一部分是可选的(需要89a版本),用来绘制一个简单的文本图象,这一部分由用来绘制的纯文本数据(7-bit
ASCII字符)和控制绘制的参数等组成。绘制文本借助于一个文本框(Text
Grid)来定义边界,在文本框中划分多个单元格,每个字符占用一个单元,绘制时按从左到右、从上到下的顺序依次进行,
直到最后一个字符或者占满整个文本框(之后的字符将被忽略,因此定义文本框的大小时应该注意到是否可以容纳整个文本),
绘制文本的颜色索引使用全局颜色列表,没有则可以使用一个已经保存的前一个颜色列表。另外,图形文本扩展块也属于图形块(Graphic
Rendering Block),可以在它前面定义图形控制扩展对它的表现形式进一步修改。图形文本扩展的组成:
BYTE | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | BIT |
1 | 扩展块标识 | Extension Introducer - 标识这是一个扩展块,固定值0x21 | |||||||
2 | 图形控制扩展标签 | Plain Text Label - 标识这是一个图形文本扩展块,固定值0x01 | |||||||
3 | 块大小 | Block Size - 块大小,固定值12 | |||||||
4 | 文本框左边界位置 | Text Glid Left Posotion - 像素值,文本框离逻辑屏幕的左边界距离 | |||||||
5 | |||||||||
6 | 文本框上边界位置 | Text Glid Top Posotion - 像素值,文本框离逻辑屏幕的上边界距离 | |||||||
7 | |||||||||
8 | 文本框高度 | Text Glid Width -像素值 | |||||||
9 | |||||||||
10 | 文本框高度 | Text Glid Height - 像素值 | |||||||
11 | |||||||||
12 | 字符单元格宽度 | Character Cell Width - 像素值,单个单元格宽度 | |||||||
13 | 字符单元格高度 | Character Cell Height- 像素值,单个单元格高度 | |||||||
14 | 文本前景色索引 | Text Foreground Color Index - 前景色在全局颜色列表中的索引 | |||||||
15 | 文本背景色索引 | Text Blackground Color Index - 背景色在全局颜色列表中的索引 | |||||||
N | ... |
Plain Text Data - 一个或多个数据块(Data Sub-Blocks)组成,保存要在显示的字符串。 | |||||||
文本数据块 |
|||||||||
... |
|||||||||
N+1 | 块终结 | Block Terminator - 标识注释块结束,固定值0 |
推荐:1.由于文本的字体(Font)和尺寸(Size)没有定义,解码器应该根据情况选择最合适的;
2.如果一个字符的值小于0x20或大于0xF7,则这个字符被推荐显示为一个空格(0x20);
3.为了兼容性,最好定义字符单元格的大小为8x8或8x16(宽度x高度)。
应用程序扩展(Application Extension)
这是提供给应用程序自己使用的(需要89a版本),应用程序可以在这里定义自己的标识、信息等,组成:
BYTE | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | BIT |
1 | 扩展块标识 | Extension Introducer - 标识这是一个扩展块,固定值0x21 | |||||||
2 | 图形控制扩展标签 | Application Extension Label - 标识这是一个应用程序扩展块,固定值0xFF | |||||||
3 | 块大小 | Block Size - 块大小,固定值11 | |||||||
4 | 应用程序标识符 | Application Identifier - 用来鉴别应用程序自身的标识(8个连续ASCII字符) | |||||||
5 | |||||||||
6 | |||||||||
7 | |||||||||
8 | |||||||||
9 | |||||||||
10 | |||||||||
11 | |||||||||
12 | 应用程序鉴别码 | Application Authentication Code - 应用程序定义的特殊标识码(3个连续ASCII字符) | |||||||
13 | |||||||||
14 | |||||||||
N | ... |
应用程序自定义数据块 - 一个或多个数据块(Data Sub-Blocks)组成,保存应用程序自己定义的数据 | |||||||
应用程序数据 |
|||||||||
... |
|||||||||
N+1 | 块终结器 | lock Terminator - 标识注释块结束,固定值0 |
文件结尾部分
文件终结器(Trailer)
这一部分只有一个值为0的字节,标识一个GIF文件结束.
BYTE | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
1 | 文件终结 |
GIF Trailer - 标识GIF文件结束,固定值0x3B |
void CMyWnd::OnPaint() { CPaintDC dc(this); Graphics graphics(&dc); // Create a GDI+ graphics object Image image(L"Test.Gif"); // Construct an image graphics.DrawImage(&image, 0, 0, image.GetWidth(), image.GetHeight()); }Gif分为两种,一种是静态的,对于这种格式的Gif,在GDI+中无需采用任何方法就能够直接显示(上面的代码就属于这种情况)。另一种是动态的, 这种文件能够显示简单的动画。动态的实际上由多幅静态的组成,在显示Gif时,每幅图片按照一定的时间间隔依次进行显示,从而实现了动画效果。
bool ImageEx::TestForAnimatedGIF() { UINT count = 0; count = GetFrameDimensionsCount(); GUID* pDimensionIDs = new GUID[count]; // 得到子帧的对象列表 GetFrameDimensionsList(pDimensionIDs, count); //获取总帧数 m_nFrameCount = GetFrameCount(&pDimensionIDs[0]); // 假设图像具有属性条目 PropertyItemEquipMake. // 获取此条目的大小. int nSize = GetPropertyItemSize(PropertyTagFrameDelay); // 为属性条目分配空间. m_pPropertyItem = (PropertyItem*) malloc(nSize); GetPropertyItem(PropertyTagFrameDelay, nSize, m_pPropertyItem); delete pDimensionIDs; return m_nFrameCount > 1; }m_pPropertyItem->value 是一个长整形数组, 每个长整形代表每帧的延时。由于获取的属性不同,GetPropertyItem会获得不同大小的对象, 因此要由用户来获得的对象大小,开辟与删除 GetPropertyItem相关的内存。对象的大小是通过GetPropertyItemSize 获取的,其参数是你所感兴趣的属性条目。 一旦获取了帧的数量与延时,我们就可生成一个线程来调用 DrawFrameGIF()来显示。
bool ImageEx::DrawFrameGIF() { ::WaitForSingleObject(m_hPause, INFINITE); GUID pageGuid = FrameDimensionTime; long hmWidth = GetWidth(); long hmHeight = GetHeight(); HDC hDC = GetDC(m_hWnd); if (hDC) { Graphics graphics(hDC); graphics.DrawImage(this, m_rc.left, m_rc.top, hmWidth, hmHeight); ReleaseDC(m_hWnd, hDC); } SelectActiveFrame(&pageGuid, m_nFramePosition++); if (m_nFramePosition == m_nFrameCount) m_nFramePosition = 0; long lPause = ((long*) m_pPropertyItem->value)[m_nFramePosition] * 10; DWORD dwErr = WaitForSingleObject(m_hExitEvent, lPause); return dwErr == WAIT_OBJECT_0; }三、效果图
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com