读取文件匹配代码
1 BOOL CWBPage::LoadFromFile(CFile *pFile, LONGLONG& lOff, ULONGLONG lFileLength) 2 { 3if (pFile == NULL) 4{ 5 return FALSE; 6} 7 8LONGLONG lPageOff = lOff; //页偏移量 9//读取页长度 10ULONGLONG lPageLength; //页内容长度 11 12pFile->Seek(lPageOff, CFile::begin); 13pFile->Read((char *)&lPageLength, sizeof(ULONGLONG)); 14if ((lPageOff + lPageLength) > lFileLength) 15{ 16 return FALSE; 17} 18lPageOff += sizeof(ULONGLONG);//偏移量增加 19 20if (lPageLength <= 1) //如果是空页 21{ 22 lOff = lPageOff; 23 return TRUE; 24} 25 26//读取所有对象 27//int nlayerIndex = 1; //对象图层号 28while ((ULONGLONG)(lPageOff - lOff) < lPageLength) 29{ 30 //读取对象类型 31 char chObjType; 32 pFile->Seek(lPageOff, CFile::begin); 33 pFile->Read(&chObjType, 1); 34 int nObjType = (int)chObjType; 35 36 switch (nObjType) 37 { 38 case WB_OBJ_LINE: //直线 39 { 40 CWBLine *pLine = new CWBLine(); 41 if (NULL == pLine) 42 { 43 return FALSE; 44 } 45 if (!pLine->LoadFromFile(pFile, lPageOff, lFileLength)) 46 { 47 delete pLine; 48 return FALSE; 49 } 50 //pLine->SetLayerIndex(nlayerIndex); //设置对象图层号 51 52 //m_pWBObjList->AddTail(pLine); 53 AddWBObject(pLine, pLine->GetLayerType()); 54 } 55 break; 56 case WB_OBJ_CURVE: //曲线 57 { 58 CWBCurve *pCurve = new CWBCurve(); 59 if (NULL == pCurve) 60 { 61 return FALSE; 62 } 63 if (!pCurve->LoadFromFile(pFile, lPageOff, lFileLength)) 64 { 65 delete pCurve; 66 return FALSE; 67 } 68 //pCurve->SetLayerIndex(nlayerIndex); //设置对象图层号 69 70 //m_pWBObjList->AddTail(pCurve); 71 AddWBObject(pCurve, pCurve->GetLayerType()); 72 } 73 break; 74 case WB_OBJ_ICOCURVE: //图标曲线 75 { 76 CWBIcoCurve *pIcoCurve = new CWBIcoCurve(); 77 if (NULL == pIcoCurve) 78 { 79 return FALSE; 80 } 81 if (!pIcoCurve->LoadFromFile(pFile, lPageOff, lFileLength)) 82 { 83 delete pIcoCurve; 84 return FALSE; 85 } 86 87 AddWBObject(pIcoCurve, pIcoCurve->GetLayerType()); 88 } 89 break; 90 case WB_OBJ_POLYGON: //多边形 91 { 92 CWBPolygon *pPolygon = new CWBPolygon(); 93 if (NULL ==pPolygon) 94 { 95 return FALSE; 96 } 97 if (!pPolygon->LoadFromFile(pFile, lPageOff, lFileLength)) 98 { 99 delete pPolygon;100 return FALSE;101 }102 //pPolygon->SetLayerIndex(nlayerIndex);103 104 //m_pWBObjList->AddTail(pPolygon);105 AddWBObject(pPolygon, pPolygon->GetLayerType());106 }107 break;108 case WB_OBJ_RECT: //矩形109 {110 CWBRectangle *pRect = new CWBRectangle();111 if (NULL == pRect)112 {113 return FALSE;114 }115 if (!pRect->LoadFromFile(pFile, lPageOff, lFileLength))116 {117 delete pRect;118 return FALSE;119 }120 //pRect->SetLayerIndex(nlayerIndex);121 //m_pWBObjList->AddTail(pRect);122 AddWBObject(pRect, pRect->GetLayerType());123 }124 break;125 case WB_OBJ_TEXT: //文本126 {127 CWBText *pText = new CWBText();128 if (NULL == pText)129 {130 return FALSE;131 }132 if(!pText->LoadFromFile(pFile, lPageOff, lFileLength))133 {134 delete pText;135 return FALSE;136 }137 //pText->SetLayerIndex(nlayerIndex);138 139 //m_pWBObjList->AddTail(pText);140 AddWBObject(pText, pText->GetLayerType());141 }142 break;143 case WB_OBJ_PICTURE: //图片144 {145 CWBPicture *pPicture = new CWBPicture();146 if (NULL == pPicture)147 {148 return FALSE;149 }150 if (!pPicture->LoadFromFile(pFile, lPageOff, lFileLength))151 {152 delete pPicture;153 return FALSE;154 }155 //pPicture->SetLayerIndex(nlayerIndex);156 157 //m_pWBObjList->AddTail(pPicture);158 AddWBObject(pPicture, pPicture->GetLayerType());159 }160 break;161 case WB_OBJ_DXF: //dxf162 {163 CWBDxf *pDxf = new CWBDxf();164 if (NULL == pDxf)165 {166 return FALSE;167 }168 if (!pDxf->LoadFromFile(pFile, lPageOff, lFileLength))169 {170 delete pDxf;171 return FALSE;172 }173 AddWBObject(pDxf, pDxf->GetLayerType());174 }175 break;176 case WB_OBJ_FLASH: //flash177 {178 CWBFlash *pFlash = new CWBFlash();179 if (NULL == pFlash)180 {181 return FALSE;182 }183 if (!pFlash->LoadFromFile(pFile, lPageOff, lFileLength))184 {185 delete pFlash;186 return FALSE;187 }188 //pFlash->SetLayerIndex(nlayerIndex);189 190 //m_pWBObjList->AddTail(pFlash);191 AddWBObject(pFlash, pFlash->GetLayerType());192 }193 break;194 195 case WB_OBJ_ELLIPSE: //椭圆196 {197 CWBEllipse *pEllipse = new CWBEllipse();198 if (NULL == pEllipse)199 {200 return FALSE;201 }202 if(!pEllipse->LoadFromFile(pFile, lPageOff, lFileLength))203 {204 delete pEllipse;205 return FALSE;206 }207 //pEllipse->SetLayerIndex(nlayerIndex);208 //m_pWBObjList->AddTail(pEllipse);209 AddWBObject(pEllipse, pEllipse->GetLayerType());210 }211 break;212 case WB_OBJ_TRIANGLE: //三角形213 {214 CWBTriangle *pTriangle = new CWBTriangle();215 if ( NULL == pTriangle)216 {217 return FALSE;218 }219 if (!pTriangle->LoadFromFile(pFile, lPageOff, lFileLength))220 {221 delete pTriangle;222 return FALSE;223 }224 //pTriangle->SetLayerIndex(nlayerIndex);225 226 //m_pWBObjList->AddTail(pTriangle);227 AddWBObject(pTriangle, pTriangle->GetLayerType());228 }229 break;230 case WB_OBJ_RHOMBUS: //菱形231 {232 CWBRhombus *pRhombus = new CWBRhombus();233 if (NULL == pRhombus)234 {235 return FALSE;236 }237 if (!pRhombus->LoadFromFile(pFile, lPageOff, lFileLength))238 {239 delete pRhombus;240 return FALSE;241 }242 //pRhombus->SetLayerIndex(nlayerIndex);243 244 //m_pWBObjList->AddTail(pRhombus);245 AddWBObject(pRhombus, pRhombus->GetLayerType());246 }247 break;248 case WB_OBJ_PENTAGON: //五边形249 {250 CWBPentagon *pPentagon = new CWBPentagon();251 if (NULL == pPentagon)252 {253 return FALSE;254 }255 if (!pPentagon->LoadFromFile(pFile, lPageOff, lFileLength))256 {257 delete pPentagon;258 return FALSE;259 }260 //pPentagon->SetLayerIndex(nlayerIndex);261 262 //m_pWBObjList->AddTail(pPentagon);263 AddWBObject(pPentagon, pPentagon->GetLayerType());264 }265 break;266 case WB_OBJ_HEXAGON: //六边形267 {268 CWBHexagon *pHexagon = new CWBHexagon();269 if (NULL == pHexagon)270 {271 return FALSE;272 }273 if (!pHexagon->LoadFromFile(pFile, lPageOff, lFileLength))274 {275 delete pHexagon;276 return FALSE;277 }278 //pHexagon->SetLayerIndex(nlayerIndex);279 280 //m_pWBObjList->AddTail(pHexagon);281 AddWBObject(pHexagon, pHexagon->GetLayerType());282 }283 break;284 case WB_OBJ_FIVEPOINTSTART: //五角星285 {286 CWBFivepointstart *pFivepointstart = new CWBFivepointstart();287 if (NULL == pFivepointstart)288 {289 return FALSE;290 }291 if (!pFivepointstart->LoadFromFile(pFile, lPageOff, lFileLength))292 {293 delete pFivepointstart;294 return FALSE;295 }296 //pFivepointstart->SetLayerIndex(nlayerIndex);297 298 //m_pWBObjList->AddTail(pFivepointstart);299 AddWBObject(pFivepointstart, pFivepointstart->GetLayerType());300 }301 break;302 case WB_OBJ_TRAPEZIUM: //梯形303 {304 CWBTrapezium *pTrapezium = new CWBTrapezium();305 if (NULL == pTrapezium)306 {307 return FALSE;308 }309 if (!pTrapezium->LoadFromFile(pFile, lPageOff, lFileLength))310 {311 delete pTrapezium;312 return FALSE;313 }314 //pTrapezium->SetLayerIndex(nlayerIndex);315 316 //m_pWBObjList->AddTail(pTrapezium);317 AddWBObject(pTrapezium, pTrapezium->GetLayerType());318 }319 break;320 case WB_OBJ_MEDIA:321 {322 //加载新视频323 CWBMedia* pMedia = new CWBMedia(NULL);324 if (NULL == pMedia)325 {326 return FALSE;327 }328 if (!pMedia->LoadFromFile(pFile, lPageOff, lFileLength))329 {330 delete pMedia;331 pMedia = NULL;332 return FALSE;333 }334 //将新视频的显示状态全部设置为隐藏,否则会在第一页显示出所有的视频335 if (g_pWhiteBoardView->m_bIsCombin)//主要组合和正常打开有点区别问题wangxiaobin336 {337 if (g_PageCount >= 1)338 {339pMedia->HideAndPauseMedia();340 }341 }342 else343 {344 if (g_PageCount > 1)345 {346pMedia->HideAndPauseMedia();347 }348 }349 350 351 AddWBObject(pMedia, pMedia->GetLayerType());352 }353 break;354 case WB_OBJ_DOCUMENT:355 {356 CWBDocument *pDoc = new CWBDocument();357 if (NULL == pDoc)358 {359 return FALSE;360 }361 pDoc->SetPageIndex(g_PageCount);362 if (!pDoc->LoadFromFile(pFile, lPageOff, lFileLength))363 {364 delete pDoc;365 return FALSE;366 }367 //pDoc->SetLayerIndex(nlayerIndex);368 369 //m_pWBObjList->AddTail(pDoc);370 AddWBObject(pDoc, pDoc->GetLayerType());371 }372 break;373 case WB_OBJ_COMBINE:374 {375 CWBCombine *pCombine = new CWBCombine();376 if (NULL == pCombine)377 {378 return FALSE;379 }380 if (!pCombine->LoadFromFile(pFile, lPageOff, lFileLength))381 {382 delete pCombine;383 return FALSE;384 }385 //pCombine->SetLayerIndex(nlayerIndex);386 387 //m_pWBObjList->AddTail(pCombine);388 m_nWBMaxLayerId = pCombine->GetPageLayerIndex();389 AddWBObject(pCombine, pCombine->GetLayerType());390 }391 break;392 case WB_OBJ_ANNOTATIONS:393 {394 CWBAnnotations *pAnnotations = new CWBAnnotations();395 if (NULL == pAnnotations)396 {397 return FALSE;398 }399 if (!pAnnotations->LoadFromFile(pFile, lPageOff, lFileLength))400 {401 delete pAnnotations;402 return FALSE;403 }404 //pAnnotations->SetLayerIndex(nlayerIndex);405 406 //m_pWBObjList->AddTail(pAnnotations);407 AddWBObject(pAnnotations, pAnnotations->GetLayerType());408 }409 break;410 case WB_OBJ_BAFFLE:411 {412 CWBBafflePlate *pBafflePlate = new CWBBafflePlate();413 if (NULL == pBafflePlate)414 {415 return FALSE;416 }417 if (!pBafflePlate->LoadFromFile(pFile, lPageOff, lFileLength))418 {419 delete pBafflePlate;420 return FALSE;421 }422 //pBafflePlate->SetLayerIndex(nlayerIndex);423 424 //m_pWBObjList->AddTail(pBafflePlate);425 AddWBObject(pBafflePlate, pBafflePlate->GetLayerType());426 }427 break;428 default:429 return FALSE;430 }431}432 433//m_dwCurObjLayerIndex = nlayerIndex - 1; //设置当前图层号434lOff = lPageOff;435return TRUE;436 }
View Code
老版本对象枚举类型代码
1 enum WB_OBJ_TYPE 2 { 3WB_OBJ_NORMAL = 0, 4WB_OBJ_LINE, //直线 5WB_OBJ_CURVE, //曲线 6WB_OBJ_ICOCURVE,//图标曲线 7WB_OBJ_POLYGON, //多边形 8WB_OBJ_RECT, //矩形 9WB_OBJ_SELECTRECT, //选择框10WB_OBJ_PICTURE, //图片11WB_OBJ_MOVIE, //视频12WB_OBJ_MEDIA, //新视频13WB_OBJ_FLASH, //FLASH14WB_OBJ_DOCUMENT, //文档15WB_OBJ_TEXT, //文字16WB_OBJ_ELLIPSE, //椭圆17WB_OBJ_TRIANGLE, //三角形18WB_OBJ_RHOMBUS, //菱形19WB_OBJ_BAFFLE, //挡板20WB_OBJ_COMBINE, //组合21WB_OBJ_MAQN,//放大镜22WB_OBJ_SPOTLIGHT, //聚光灯23WB_OBJ_ANNOTATIONS, //标注24WB_OBJ_CAMERA, //摄像头25WB_OBJ_DUSTBIN, //垃圾箱26WB_OBJ_RULER,//直尺27WB_OBJ_PROTRACTOR,//量角器28WB_OBJ_ANGLE, //生成刻度29WB_OBJ_SETSQUARE,//三角板30WB_OBJ_COMPASS, //圆规31WB_OBJ_ARC, //圆弧32WB_OBJ_SECTOR,//扇形33WB_OBJ_ARBITRARYTRIANGLE, //任意三角形34WB_OBJ_PALLELOGAM,//平行四边形35WB_OBJ_PENTAGON,//五边形36WB_OBJ_HEXAGON,//六边形37WB_OBJ_FIVEPOINTSTART, //五角星38WB_OBJ_TRAPEZIUM,//梯形39WB_OBJ_DXF //DXF40 };
View Code
新版本对象枚举类型代码
1 enum WB_OBJ_TYPE 2 { 3WB_OBJ_NORMAL = 0, 4 WB_OBJ_TRAPEZIUM,//梯形 5WB_OBJ_LINE, //直线 6WB_OBJ_CURVE, //曲线 7WB_OBJ_ICOCURVE,//图标曲线 8WB_OBJ_POLYGON, //多边形 9WB_OBJ_RECT, //矩形10WB_OBJ_SELECTRECT, //选择框11WB_OBJ_PICTURE, //图片12WB_OBJ_MOVIE, //视频13WB_OBJ_MEDIA, //新视频14WB_OBJ_FLASH, //FLASH15WB_OBJ_DOCUMENT, //文档16WB_OBJ_TEXT, //文字17WB_OBJ_ELLIPSE, //椭圆18WB_OBJ_TRIANGLE, //三角形19WB_OBJ_RHOMBUS, //菱形20WB_OBJ_BAFFLE, //挡板21WB_OBJ_COMBINE, //组合22WB_OBJ_MAQN,//放大镜23WB_OBJ_SPOTLIGHT, //聚光灯24WB_OBJ_ANNOTATIONS, //标注25WB_OBJ_CAMERA, //摄像头26WB_OBJ_DUSTBIN, //垃圾箱27WB_OBJ_RULER,//直尺28WB_OBJ_PROTRACTOR,//量角器29WB_OBJ_ANGLE, //生成刻度30WB_OBJ_SETSQUARE,//三角板31WB_OBJ_COMPASS, //圆规32WB_OBJ_ARC, //圆弧33WB_OBJ_SECTOR,//扇形34WB_OBJ_ARBITRARYTRIANGLE, //任意三角形35WB_OBJ_PALLELOGAM,//平行四边形36WB_OBJ_PENTAGON,//五边形37WB_OBJ_HEXAGON,//六边形38WB_OBJ_FIVEPOINTSTART, //五角星39WB_OBJ_DXF //DXF40 };
View Code
在新版本中由于有人把WB_OBJ_TRAPEZIUM, //梯形
放在了第二行,原来第二行是WB_OBJ_LINE, //直线
保存老版本的时候1代表的是WB_OBJ_LINE, //直线
新版本中1代表的是WB_OBJ_TRAPEZIUM, //梯形
char chObjType;
pFile->Seek(lPageOff, CFile::begin);
pFile->Read(&chObjType, 1);
int nObjType = (int)chObjType;
由于Read()中nOjbType得到的是枚举类型中的对应的整形数,因此在读取老版本中保存的直线时候,匹配到的对象是新版本中的梯形,会去梯形类中读取,导致读取文件失败。