使用接口函数替换,实现网页背景色

接口函数替换技术来实现网页背景很早前就有人讲过,我只是拿来改了一下。

/* *
 * 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 );
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值