⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scemfgdiparser.cpp

📁 Source code for EMFexplorer 1.0
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	SCPlayRecord(); // required for ROP management
#endif

	EMRSCALEWINDOWEXTEX *pRec = (EMRSCALEWINDOWEXTEX*)m_pRecord;
	m_pRenderer->SCScaleWindow(pRec->xNum, pRec->xDenom, pRec->yNum, pRec->yDenom);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfSAVEDC()
{
	// TRACE0("**EMR_SAVEDC\n");
	ASSERT(m_pRenderer);

	SCPlayRecord();

	m_pRenderer->SCOnDCSaved();
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfRESTOREDC()
{
	// TRACE0("**EMR_RESTOREDC\n");
	ASSERT(m_pRenderer);

	SCPlayRecord();
	
	// Be careful : sometimes we get bad values from the record.
	// Some documents contain values like 30,
	// though there is only one DC state on the stack
	m_pRenderer->SCOnDCRestored(((EMRRESTOREDC*)m_pRecord)->iRelative);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfSETWORLDTRANSFORM()
{
	// TRACE0("**EMR_SETWORLDTRANSFORM\n");
	ASSERT(m_pRenderer);

#ifndef SC_RENDERER_CAN_DOROP
	SCPlayRecord(); // required for ROP management
#endif

	m_pRenderer->SCSetWorldTransform(((EMRSETWORLDTRANSFORM*)m_pRecord)->xform);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfMODIFYWORLDTRANSFORM()
{
	// TRACE0("**EMR_MODIFYWORLDTRANSFORM\n");
	ASSERT(m_pRenderer);

#ifndef SC_RENDERER_CAN_DOROP
	SCPlayRecord(); // required for ROP management
#endif

	m_pRenderer->SCModifyWorldTransform(((EMRMODIFYWORLDTRANSFORM*)m_pRecord)->xform,
										((EMRMODIFYWORLDTRANSFORM*)m_pRecord)->iMode);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfSELECTOBJECT()
{
	// TRACE0("**EMR_SELECTOBJECT\n");
	ASSERT(m_pRenderer);

	// First, play the record to realize GDI objects
	SCPlayRecord();

	// Then extract objects characteristics
	EMRSELECTOBJECT *pRec = (EMRSELECTOBJECT*)m_pRecord;
	HGDIOBJ hGdiObj;
	// Is the high order bit set?
	if (pRec->ihObject & 0x80000000)
	{
		// High order bit is set - its a stock object
		// Strip the high bit to get the index
		DWORD dwIndex = pRec->ihObject & 0x7fffffff;
		// Pass the index to GetStockObject()
		hGdiObj = GetStockObject( dwIndex );
	} else
		// High order bit isn't set - not a stock object
		hGdiObj = (HGDIOBJ)m_lpEnumHandleTable->objectHandle[pRec->ihObject];

	long lType = GetObjectType(hGdiObj);
	switch(lType)
	{
		case OBJ_EXTPEN:
			m_pRenderer->SCOnChangeExtPen((HPEN)hGdiObj);
			break;

		case OBJ_PEN:
			m_pRenderer->SCOnChangePen((HPEN)hGdiObj);
			break;

		case OBJ_BRUSH:
			m_pRenderer->SCOnChangeBrush((HBRUSH)hGdiObj);
			break;
			
		case OBJ_FONT:
			m_pRenderer->SCOnChangeFont((HFONT)hGdiObj);
			break;
			
		//case OBJ_PAL:
		// unlikely to occur (The SelectObject function does not work with palettes)
		//m_pRenderer->SCOnChangePalette((HPALETTE)hGdiObj);
		//break;								
	}

	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfCREATEPEN()
{
	// TRACE0("**EMR_CREATEPEN\n");
	ASSERT(m_pRenderer);

	SCPlayRecord();

	// Object creation: do nothing
	// EMRCREATEPEN *pRec = (EMRCREATEPEN*)m_pRecord;
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfCREATEBRUSHINDIRECT()
{
	// TRACE0("**EMR_CREATEBRUSHINDIRECT\n");
	ASSERT(m_pRenderer);

	// Note: due to dithering, Windows may change BS_SOLID in BS_PATTERN
	SCPlayRecord();

	// Object creation: do nothing
	// EMRCREATEBRUSHINDIRECT *pRec = (EMRCREATEBRUSHINDIRECT*)m_pRecord;
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfDELETEOBJECT()
{
	// TRACE0("**EMR_DELETEOBJECT\n");
	ASSERT(m_pRenderer);

	SCPlayRecord();

	// Object deletion: do nothing
	// EMRDELETEOBJECT *pRec = (EMRDELETEOBJECT*)m_pRecord;
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfANGLEARC()
{
	// TRACE0("**EMR_ANGLEARC\n");
	ASSERT(m_pRenderer);

	EMRANGLEARC *pRec = (EMRANGLEARC*)m_pRecord;
	m_pRenderer->SCDrawAngleArc((LPPOINT)&pRec->ptlCenter, pRec->nRadius, pRec->eStartAngle, pRec->eSweepAngle);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfELLIPSE()
{
	// TRACE0("**EMR_ELLIPSE\n");
	ASSERT(m_pRenderer);

	m_pRenderer->SCDrawEllipse((LPCRECT)&((EMRELLIPSE*)m_pRecord)->rclBox);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfRECTANGLE()
{
	// TRACE0("**EMR_RECTANGLE\n");
	ASSERT(m_pRenderer);

	m_pRenderer->SCDrawRectangle((LPCRECT)&((EMRRECTANGLE*)m_pRecord)->rclBox);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfROUNDRECT()
{
	// TRACE0("**EMR_ROUNDRECT\n");
	ASSERT(m_pRenderer);

	m_pRenderer->SCDrawRoundRectangle((LPCRECT)&((EMRROUNDRECT*)m_pRecord)->rclBox,
												((EMRROUNDRECT*)m_pRecord)->szlCorner);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfARC()
{
	// TRACE0("**EMR_ARC\n");
	ASSERT(m_pRenderer);

	m_pRenderer->SCDrawArc(&((EMRARC*)m_pRecord)->rclBox,
						   &((EMRARC*)m_pRecord)->ptlStart,
						   &((EMRARC*)m_pRecord)->ptlEnd);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfCHORD()
{
	// TRACE0("**EMR_CHORD\n");
	ASSERT(m_pRenderer);

	m_pRenderer->SCDrawChord(&((EMRCHORD*)m_pRecord)->rclBox,
							 &((EMRCHORD*)m_pRecord)->ptlStart,
							 &((EMRCHORD*)m_pRecord)->ptlEnd);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfPIE()
{
	// TRACE0("**EMR_PIE\n");
	ASSERT(m_pRenderer);

	m_pRenderer->SCDrawPie(&((EMRPIE*)m_pRecord)->rclBox,
						   &((EMRPIE*)m_pRecord)->ptlStart,
						   &((EMRPIE*)m_pRecord)->ptlEnd);
	return SC_BRK_NOERROR;

}

SC_BRKRESULT CSCEMFgdiParser::OnEmfSELECTPALETTE()
{
	// TRACE0("**EMR_SELECTPALETTE\n");
	ASSERT(m_pRenderer);

	SCPlayRecord();

	m_pRenderer->SCOnChangePalette((HPALETTE)((EMRSELECTPALETTE*)m_pRecord)->ihPal);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfCREATEPALETTE()
{
	// TRACE0("**EMR_CREATEPALETTE\n");
	ASSERT(m_pRenderer);

	SCPlayRecord();

	// Object creation: do nothing
	// EMRCREATEPALETTE *pRec = (EMRCREATEPALETTE*)m_pRecord;
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfSETPALETTEENTRIES()
{
	// TRACE0("**EMR_SETPALETTEENTRIES\n");
	ASSERT(m_pRenderer);

	SCPlayRecord();

	// Object creation: do nothing
	// EMRSETPALETTEENTRIES *pRec = (EMRSETPALETTEENTRIES*)m_pRecord;
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfRESIZEPALETTE()
{
	// TRACE0("**EMR_RESIZEPALETTE\n");
	ASSERT(m_pRenderer);

	SCPlayRecord();

	// Object creation: do nothing
	// EMRRESIZEPALETTE *pRec = (EMRRESIZEPALETTE*)m_pRecord;
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfREALIZEPALETTE()
{
	// TRACE0("**EMR_REALIZEPALETTE\n");
	ASSERT(m_pRenderer);

	SCPlayRecord();

	// Object creation: do nothing
	// EMRREALIZEPALETTE *pRec = (EMRREALIZEPALETTE*)m_pRecord;
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfEXTFLOODFILL()
{
	// TRACE0("**EMR_EXTFLOODFILL\n");
	ASSERT(m_pRenderer);

	m_pRenderer->SCFloodFill(((EMREXTFLOODFILL*)m_pRecord)->ptlStart,
							 ((EMREXTFLOODFILL*)m_pRecord)->crColor,
							 ((EMREXTFLOODFILL*)m_pRecord)->iMode);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfLINETO()
{
	// TRACE0("**EMR_LINETO\n");
	ASSERT(m_pRenderer);

	m_pRenderer->SCDrawLinesTo((LPPOINT)&((EMRLINETO*)m_pRecord)->ptl, 1);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfARCTO()
{
	// TRACE0("**EMR_ARCTO\n");
	ASSERT(m_pRenderer);

	m_pRenderer->SCDrawArcTo(&((EMRARCTO*)m_pRecord)->rclBox,
							 &((EMRARCTO*)m_pRecord)->ptlStart,
							 &((EMRARCTO*)m_pRecord)->ptlEnd);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfPOLYDRAW()
{
	// TRACE0("**EMR_POLYDRAW\n");
	ASSERT(m_pRenderer);

	EMRPOLYDRAW *pRec = (EMRPOLYDRAW*)m_pRecord;

	BYTE* pTypes = (BYTE*)((POINTL*)pRec->aptl + pRec->cptl);
	m_pRenderer->SCDrawPolyDraw((POINT*)pRec->aptl,
								pRec->cptl,
								pTypes);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfSETARCDIRECTION()
{
	// TRACE0("**EMR_SETARCDIRECTION\n");
	ASSERT(m_pRenderer);

	m_pRenderer->SCSetArcDirection(((EMRSETARCDIRECTION*)m_pRecord)->iArcDirection);

	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfSETMITERLIMIT()
{
	// TRACE0("**EMR_SETMITERLIMIT\n");
	ASSERT(m_pRenderer);

	m_pRenderer->SCSetMiterLimit(((EMRSETMITERLIMIT*)m_pRecord)->eMiterLimit);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfBEGINPATH()
{
	// TRACE0("**EMR_BEGINPATH\n");
	ASSERT(m_pRenderer);

	//EMRBEGINPATH *pRec = (EMRBEGINPATH*)m_pRecord;

	m_pRenderer->SCBeginPath();
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfENDPATH()
{
	// TRACE0("**EMR_ENDPATH\n");
	ASSERT(m_pRenderer);

	//EMRENDPATH *pRec = (EMRENDPATH*)m_pRecord;

	m_pRenderer->SCEndPath();
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfCLOSEFIGURE()
{
	// TRACE0("**EMR_CLOSEFIGURE\n");
	ASSERT(m_pRenderer);

	//EMRCLOSEFIGURE *pRec = (EMRCLOSEFIGURE*)m_pRecord;

	m_pRenderer->SCCloseFigure();
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfFILLPATH()
{
	// TRACE0("**EMR_FILLPATH\n");
	ASSERT(m_pRenderer);

	//EMRFILLPATH *pRec = (EMRFILLPATH*)m_pRecord;

	// Note: Don't know what the rclBounds is doing in the record
	m_pRenderer->SCApplyPath(SC_PATH_FILL);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfSTROKEANDFILLPATH()
{
	// TRACE0("**EMR_STROKEANDFILLPATH\n");
	ASSERT(m_pRenderer);

	//EMRSTROKEANDFILLPATH *pRec = (EMRSTROKEANDFILLPATH*)m_pRecord;

	// Note: Don't know what the rclBounds is doing in the record
	m_pRenderer->SCApplyPath(SC_PATH_STROKEANDFILL);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfSTROKEPATH()
{
	// TRACE0("**EMR_STROKEPATH\n");
	ASSERT(m_pRenderer);

	//EMRSTROKEPATH *pRec = (EMRSTROKEPATH*)m_pRecord;

	// Note: Don't know what the rclBounds is doing in the record
	m_pRenderer->SCApplyPath(SC_PATH_STROKE);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfFLATTENPATH()
{
	// TRACE0("**EMR_FLATTENPATH\n");
	ASSERT(m_pRenderer);

	//EMRFLATTENPATH *pRec = (EMRFLATTENPATH*)m_pRecord;

	m_pRenderer->SCFlattenPath();
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfWIDENPATH()
{
	// TRACE0("**EMR_WIDENPATH\n");
	ASSERT(m_pRenderer);

	//EMRWIDENPATH *pRec = (EMRWIDENPATH*)m_pRecord;

	m_pRenderer->SCWidenPath();
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfSELECTCLIPPATH()
{
	// TRACE0("**EMR_SELECTCLIPPATH\n");
	ASSERT(m_pRenderer);

	m_pRenderer->SCApplyPath(SC_PATH_CLIP, ((EMRSELECTCLIPPATH*)m_pRecord)->iMode);
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfABORTPATH()
{
	// TRACE0("**EMR_ABORTPATH\n");
	ASSERT(m_pRenderer);

	//EMRABORTPATH *pRec = (EMRABORTPATH*)m_pRecord;

	m_pRenderer->SCAbortPath();
	return SC_BRK_NOERROR;
}

SC_BRKRESULT CSCEMFgdiParser::OnEmfGDICOMMENT()
{
	// TRACE0("**EMR_GDICOMMENT\n");
	ASSERT(m_pRenderer);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -