接口函数替换技术来实现网页背景很早前就有人讲过,我只是拿来改了一下。
/*
*
* Name: IDISPLAY_Init
* Memo: 初始化保存原IDISPLAY函数表地址
* Param1: 主结构体指针
* Return: Nothing
*/
void IDISPLAY_Init( CApp * pApp )
{
pApp -> m_pIDisplayVtbl = * ((IDisplayVtbl ** )pApp -> a.m_pIDisplay);
}
/* *
* Name: IDISPLAY_Switch
* Memo: 替换UpdateEx
* Param1: 主结构体指针
* Return: Nothing
*/
void IDISPLAY_Switch( CApp * pApp )
{
IDisplay * pIDisplay = pApp -> a.m_pIDisplay;
IDisplayVtbl * pIDisplayVtbl = * ((IDisplayVtbl ** )pIDisplay);
// 判断是否已经替换
if ( pIDisplayVtbl == pApp -> m_pIDisplayVtbl )
{
IDisplayVtbl * pVtbl = (IDisplayVtbl * )MALLOC( sizeof (IDisplayVtbl));
MEMCPY( pVtbl, pIDisplayVtbl, sizeof (IDisplayVtbl) );
pVtbl -> Update = IDISPLAY_MyUpdateEx;
* ((IDisplayVtbl ** )pIDisplay) = pVtbl;
}
}
/* *
* Name: IDISPLAY_Free
* Memo: 恢复原UpdateEx
* Param1: 主结构体指针
* Return: Nothing
*/
void IDISPLAY_Free( CApp * pApp )
{
IDisplay * pIDisplay = pApp -> a.m_pIDisplay;
IDisplayVtbl * pIDisplayVtbl = * ((IDisplayVtbl ** )pIDisplay);
// 判断是否已经替换
if ( pIDisplayVtbl == pApp -> m_pIDisplayVtbl )
{
return ;
} else
{
* ((IDisplayVtbl ** )pIDisplay) = pApp -> m_pIDisplayVtbl;
FREEIF( pIDisplayVtbl );
}
}
/* *
* Name: IDISPLAY_MyUpdateEx1
* Memo: 新的UpdateEx,直接修改图象缓冲区(背景色)
*/
void IDISPLAY_MyUpdateEx1( IDisplay * pIDisplay, boolean bDefer )
{
uint16 nBgPixel = ((CApp * )GETAPPINSTANCE()) -> m_nBgPixel;
IBitmap * pIBitmap = NULL;
IDIB * pScrIDIB = NULL;
IDISPLAY_GetDeviceBitmap( pIDisplay, & pIBitmap );
IBITMAP_QueryInterface( pIBitmap, AEECLSID_DIB, ( void ** ) & pScrIDIB );
IBITMAP_Release( pIBitmap );
if ( pScrIDIB && nBgPixel < 0xffff )
{
uint16 * pScrPixel = (uint16 * )pScrIDIB -> pBmp;
int nCount = pScrIDIB -> cx * pScrIDIB -> cy;
for ( ; nCount; -- nCount )
{
if ( * pScrPixel == 0xffff )
{
* pScrPixel = nBgPixel;
}
++ pScrPixel;
}
IDIB_Release( pScrIDIB );
}
((CApp * )GETAPPINSTANCE()) -> m_pIDisplayVtbl -> Update( pIDisplay, bDefer );
}
/* *
* Name: IDISPLAY_MyUpdateEx2
* Memo: 新的UpdateEx,直接修改图象缓冲区(背景图片)
*/
void IDISPLAY_MyUpdateEx2( IDisplay * pIDisplay, boolean bDefer )
{
IDIB * pBgIDIB = ((CApp * )GETAPPINSTANCE()) -> m_pBgIDIB;
IBitmap * pIBitmap = NULL;
IDIB * pScrIDIB = NULL;
IDISPLAY_GetDeviceBitmap( pIDisplay, & pIBitmap );
IBITMAP_QueryInterface( pIBitmap, AEECLSID_DIB, ( void ** ) & pScrIDIB );
IBITMAP_Release( pIBitmap );
if ( pScrIDIB && pBgIDIB )
{
int nCount = pScrIDIB -> cx * pScrIDIB -> cy;
uint16 * pScrPixel = (uint16 * )pScrIDIB -> pBmp;
uint16 * pBgPixel = (uint16 * )pBgIDIB -> pBmp;
for ( ; nCount; -- nCount )
{
if ( * pScrPixel == 0xffff )
{
* pScrPixel = * pBgPixel;
}
++ pScrPixel;
++ pBgPixel;
}
IDIB_Release( pScrIDIB );
}
((CApp * )GETAPPINSTANCE()) -> m_pIDisplayVtbl -> Update( pIDisplay, bDefer );
}
* Name: IDISPLAY_Init
* Memo: 初始化保存原IDISPLAY函数表地址
* Param1: 主结构体指针
* Return: Nothing
*/
void IDISPLAY_Init( CApp * pApp )
{
pApp -> m_pIDisplayVtbl = * ((IDisplayVtbl ** )pApp -> a.m_pIDisplay);
}
/* *
* Name: IDISPLAY_Switch
* Memo: 替换UpdateEx
* Param1: 主结构体指针
* Return: Nothing
*/
void IDISPLAY_Switch( CApp * pApp )
{
IDisplay * pIDisplay = pApp -> a.m_pIDisplay;
IDisplayVtbl * pIDisplayVtbl = * ((IDisplayVtbl ** )pIDisplay);
// 判断是否已经替换
if ( pIDisplayVtbl == pApp -> m_pIDisplayVtbl )
{
IDisplayVtbl * pVtbl = (IDisplayVtbl * )MALLOC( sizeof (IDisplayVtbl));
MEMCPY( pVtbl, pIDisplayVtbl, sizeof (IDisplayVtbl) );
pVtbl -> Update = IDISPLAY_MyUpdateEx;
* ((IDisplayVtbl ** )pIDisplay) = pVtbl;
}
}
/* *
* Name: IDISPLAY_Free
* Memo: 恢复原UpdateEx
* Param1: 主结构体指针
* Return: Nothing
*/
void IDISPLAY_Free( CApp * pApp )
{
IDisplay * pIDisplay = pApp -> a.m_pIDisplay;
IDisplayVtbl * pIDisplayVtbl = * ((IDisplayVtbl ** )pIDisplay);
// 判断是否已经替换
if ( pIDisplayVtbl == pApp -> m_pIDisplayVtbl )
{
return ;
} else
{
* ((IDisplayVtbl ** )pIDisplay) = pApp -> m_pIDisplayVtbl;
FREEIF( pIDisplayVtbl );
}
}
/* *
* Name: IDISPLAY_MyUpdateEx1
* Memo: 新的UpdateEx,直接修改图象缓冲区(背景色)
*/
void IDISPLAY_MyUpdateEx1( IDisplay * pIDisplay, boolean bDefer )
{
uint16 nBgPixel = ((CApp * )GETAPPINSTANCE()) -> m_nBgPixel;
IBitmap * pIBitmap = NULL;
IDIB * pScrIDIB = NULL;
IDISPLAY_GetDeviceBitmap( pIDisplay, & pIBitmap );
IBITMAP_QueryInterface( pIBitmap, AEECLSID_DIB, ( void ** ) & pScrIDIB );
IBITMAP_Release( pIBitmap );
if ( pScrIDIB && nBgPixel < 0xffff )
{
uint16 * pScrPixel = (uint16 * )pScrIDIB -> pBmp;
int nCount = pScrIDIB -> cx * pScrIDIB -> cy;
for ( ; nCount; -- nCount )
{
if ( * pScrPixel == 0xffff )
{
* pScrPixel = nBgPixel;
}
++ pScrPixel;
}
IDIB_Release( pScrIDIB );
}
((CApp * )GETAPPINSTANCE()) -> m_pIDisplayVtbl -> Update( pIDisplay, bDefer );
}
/* *
* Name: IDISPLAY_MyUpdateEx2
* Memo: 新的UpdateEx,直接修改图象缓冲区(背景图片)
*/
void IDISPLAY_MyUpdateEx2( IDisplay * pIDisplay, boolean bDefer )
{
IDIB * pBgIDIB = ((CApp * )GETAPPINSTANCE()) -> m_pBgIDIB;
IBitmap * pIBitmap = NULL;
IDIB * pScrIDIB = NULL;
IDISPLAY_GetDeviceBitmap( pIDisplay, & pIBitmap );
IBITMAP_QueryInterface( pIBitmap, AEECLSID_DIB, ( void ** ) & pScrIDIB );
IBITMAP_Release( pIBitmap );
if ( pScrIDIB && pBgIDIB )
{
int nCount = pScrIDIB -> cx * pScrIDIB -> cy;
uint16 * pScrPixel = (uint16 * )pScrIDIB -> pBmp;
uint16 * pBgPixel = (uint16 * )pBgIDIB -> pBmp;
for ( ; nCount; -- nCount )
{
if ( * pScrPixel == 0xffff )
{
* pScrPixel = * pBgPixel;
}
++ pScrPixel;
++ pBgPixel;
}
IDIB_Release( pScrIDIB );
}
((CApp * )GETAPPINSTANCE()) -> m_pIDisplayVtbl -> Update( pIDisplay, bDefer );
}