图形编辑器之保存打开(Open & Save of Pattern Editor)
来源:互联网 发布:淘宝红包图片素材 编辑:程序博客网 时间:2024/04/30 14:54
由于考虑到保存后的文件,当下次再被打开时,还能进行一系列的操作,因此要进行一定的结构化定义。一方面由于知道的知识有限,另一方面由于时间的限制,我们想到了一个办法(但可能不是最优,或者最好的办法),对每一个图元都设计一个write,read接口,负责各自的读写操作!图元管理器类中也分别定义一个read,write接口,根据它读 / 写到的图元的标记,来调用相应的图元进行读 / 写,来实现初始化 / 保存数据 !
考虑到保存之后可以当图片使用,也实现了保存为bmp图片格式(至于jpeg以后有时间去实现一下),因为之前用得是双缓冲来进行绘图的,所以程序中始终有一个HBITMAP句柄,表示当前场景的状态,因此只需对它进行一些操作,根据它的信息来对BITMAPFILEHEADER,BITMAPINFOHEADER,BUFFER等内容进行赋值就行了!
大概过程如下:
//当前分辨率下每象素所占字节数
int iBits;
//位图中每象素所占字节数
WORD wBitCount;
//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hDib, hPal,hOldPal=NULL;
//fh为CreateFile(...)返回的文件句柄
//计算位图文件每个像素所占字节数
hDC = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); //每个颜色的位数*每个象素的颜色数
DeleteDC(hDC);
if (iBits <= 1) wBitCount = 1;
else if (iBits <= 4) wBitCount = 4;
else if (iBits <= 8) wBitCount = 8;
else wBitCount = 24;
GetObject(hExistGraph, sizeof(Bitmap), (LPSTR)&Bitmap);
//这里对BITMAPINFOHEADER结构体进行初始化
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = ::GetDC(NULL);
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
GetDIBits(hDC, hExistGraph, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
+dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS); //设置象素
//恢复调色板
if (hOldPal)
{
::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
}
//这里设置文件头
//写入位图文件头信息
//写入位图其他信息
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
- 图形编辑器之保存打开(Open & Save of Pattern Editor)
- Eclipse GEF 开发之:当图形editor被更改时Enable "Save" action
- UVa Problem 10267 Graphical Editor (图形化编辑器)
- UVa Problem 10267 Graphical Editor (图形化编辑器)
- PC/Uva 11015/10267 图形编辑器(Graphical Editor)
- 1.6.5 图形化编辑器 Graphical Editor
- could not open the editor: invalid thread access (Eclipse编辑器打不开转)
- Easyui之Datagrid编辑器Editor扩展(timespinner)
- Unity编辑器扩展(自动保存当前打开的场景)
- QImage的save函数保存的bmp图像无法打开
- Editor编辑器学习(2)
- GMF中,如何不打开editor保存图片
- 编程技巧之:VC6.0在打开ResourceView 时,无法打开,报This file is already open in an editor.怎么办?
- 编程技巧之:VC6.0在打开ResourceView 时,无法打开,报This file is already open in an editor.怎么办? .
- (翻译)自动保存(Auto Save)
- Fidder—Fidde保存会话(save)
- Could not open the editor: URLDecoder: Illegal hex characters in escape (%) pattern - For input stri
- canvas之图形的变化(保存,平移,缩放,旋转)
- 对公车的态度 2006-12-16
- 关于女权
- 法律究竟是什么
- 应用框架的设计与实现——.NET平台(4.3 SAF代码分析)
- 得沉下来了
- 图形编辑器之保存打开(Open & Save of Pattern Editor)
- 寻找必败态:博弈问题的快速解法
- Socket编程相关数据类型定义
- 人的性格成因
- 绝对好用的注册表技
- 互联网真的是"天网灰灰"吗?
- 墨菲定律肆虐的日子
- UCOS-II移植ARM的读书笔记(12.16)续
- 修改Slickedit