//劈成两半打开特效

来源:互联网 发布:超市网络信息化 编辑:程序博客网 时间:2024/06/10 02:45


//劈成两半打开特效
class  CCut2Open
{
public:
    CCut2Open();
    virtual ~CCut2Open();
public:
    void SetWindowBmp(int nBmpID,HMODULE  hRes);

    void Open();
    void Close();

private:
    HDC  m_hThisMemDC;
    HBITMAP  m_hThisbitmap;
    HBITMAP  m_hOldThisbitmap;
   
    HDC  m_hPrevMemDC;
    HBITMAP  m_hPrevbitmap;
    HBITMAP  m_hOldPrevbitmap;

    BOOL  m_Init;
    BOOL  m_Opened;
    BITMAP m_size;
    int   m_dist;
};

CCut2Open::CCut2Open()
{
    m_hThisMemDC     = NULL;
    m_hThisbitmap    = NULL;
    m_hOldThisbitmap = NULL;
   
    m_hPrevMemDC     = NULL;
    m_hPrevbitmap    = NULL;
    m_hOldPrevbitmap = NULL;
    m_Init = m_Opened =TRUE;
    m_dist = 4;
}

CCut2Open::~CCut2Open()
{
    if (NULL != m_hThisMemDC )
    {
        ::SelectObject(m_hThisMemDC,m_hOldThisbitmap);
        ::DeleteDC(m_hThisMemDC);
    }
    if (NULL !=   m_hThisbitmap )
    {
        ::DeleteObject(m_hThisbitmap);
    }
    if (NULL !=  m_hOldThisbitmap)
    {
        m_hOldThisbitmap=NULL;
    }
    if (NULL !=  m_hPrevMemDC )
    {
        ::SelectObject(m_hPrevMemDC,m_hPrevbitmap);
        ::DeleteDC(m_hPrevMemDC);
    }
    if (NULL !=  m_hPrevbitmap  )
    {
        ::DeleteObject(m_hPrevbitmap);
    }
    if (NULL !=  m_hOldPrevbitmap)
    {
        m_hOldPrevbitmap= NULL;
    }
    m_Init = m_Opened =TRUE;
}

void CCut2Open::Open()
{
    if (m_Init)
    {
        HDC     hdc=::GetDC(NULL);
        int  i = 0,w=0;
        int  nWidth  = (m_size.bmWidth>>1);
        int  nHeight = m_size.bmHeight;
       
        for ( i = nWidth-m_dist; i>=0; i-=m_dist)
        {
           
             w = nWidth - i;

             BitBlt(hdc,0,0,i,nHeight,m_hPrevMemDC,w,0,SRCCOPY);

             BitBlt(hdc,i,0,w,nHeight,m_hThisMemDC,nWidth - w,0,SRCCOPY);
             BitBlt(hdc,nWidth,0,w,nHeight,m_hThisMemDC,nWidth,0,SRCCOPY);

            BitBlt(hdc,nWidth + w,0,nWidth-w,nHeight,m_hPrevMemDC,nWidth,0,SRCCOPY);
        }
       
        ::ReleaseDC(NULL,hdc);
        m_Opened = TRUE;
    }
}

void CCut2Open::Close()
{
    if (m_Init)
    {
        HDC     hdc=::GetDC(NULL);
        int  i = 0;
        int  nWidth  = (m_size.bmWidth>>1);
        int  nHeight = m_size.bmHeight;

        for ( i = 0;i<=nWidth;i+=m_dist)
        {
            BitBlt(hdc,0,0,i,nHeight,m_hPrevMemDC,nWidth-i,0,SRCCOPY);
            BitBlt(hdc,m_size.bmWidth-i,0,i,nHeight,m_hPrevMemDC,nWidth,0,SRCCOPY);
        }

        ::ReleaseDC(NULL,hdc);
    }
}

void CCut2Open::SetWindowBmp(int nBmpID,HMODULE  hRes)
{
    HDC     hdc=::GetDC(NULL);
    HMODULE hHandle = AfxGetResourceHandle();

    if ( NULL!=hRes)
    {
        hHandle = hRes;
    }

    m_hThisbitmap = ::LoadBitmap(hHandle,MAKEINTRESOURCE(nBmpID));
    m_hThisMemDC= ::CreateCompatibleDC(NULL);
    m_hPrevMemDC= ::CreateCompatibleDC(NULL);
   
    if (NULL != m_hThisbitmap && NULL != m_hPrevMemDC && NULL != m_hThisMemDC)
    {
        m_hOldThisbitmap = (HBITMAP)::SelectObject(m_hThisMemDC,m_hThisbitmap);
        ::GetObject(m_hThisbitmap,sizeof(BITMAP),&m_size);
        m_hPrevbitmap = ::CreateCompatibleBitmap(hdc,m_size.bmWidth,m_size.bmHeight);
        m_hOldPrevbitmap = (HBITMAP)::SelectObject(m_hPrevMemDC,m_hPrevbitmap);

        ::BitBlt(m_hPrevMemDC,0,0,m_size.bmWidth,m_size.bmHeight,hdc,0,0,SRCCOPY);

        m_Init = TRUE;
    }
   
    ::ReleaseDC(NULL,hdc);
}

 

CCut2Open open;
  open.SetWindowBmp(IDB_BITMAP1,AfxGetResourceHandle());
  open.Open();

   open.Close();

原创粉丝点击