+ -
当前位置:首页 → 问答吧 → 这个C++代码如何转成 delphi ?谢谢。

这个C++代码如何转成 delphi ?谢谢。

时间:2011-10-06

来源:互联网

C/C++ code


struct tagOsdHelper
{
    tagOsdHelper()
    {
        m_nw=0;
        m_nh=0;

        m_hBmp=NULL;
        m_hOldBmp=NULL;
        m_pDibBits=NULL;
        m_pOldFont=NULL;
    }
    ~tagOsdHelper()
    {
        Reset();
    }
    void Reset()
    {
        if(m_dc.GetSafeHdc())
        {
            m_dc.SelectObject(m_pOldFont);
            m_pOldFont=NULL;
            ::SelectObject(m_dc.GetSafeHdc(),m_hOldBmp);
            m_hOldBmp=NULL;

            ::DeleteObject(m_hBmp);
            m_hBmp=NULL;
        
            ::DeleteDC(m_dc.Detach());
        }

        m_pDibBits = NULL;
        m_nw=0;
        m_nh=0;
        m_font.DeleteObject();
    }

    int        m_nw;
    int        m_nh;

    HBITMAP m_hBmp;
    HBITMAP m_hOldBmp;
    LPBYTE    m_pDibBits;
    CDC        m_dc;
    CFont    m_font;
    CFont    *m_pOldFont;
};


作者: wealsh   发布时间: 2011-10-06

C/C++ code
int WINAPI TestPreDrawCallBack(int videoWindowId,LPBYTE pRgb24,int nw,int nh)
{
    BITMAPINFO bi;
    memset(&bi,0,sizeof(bi));    
    bi.bmiHeader.biSize=sizeof(bi.bmiHeader);
    bi.bmiHeader.biWidth = nw;
    bi.bmiHeader.biHeight = nh;
    bi.bmiHeader.biPlanes=1;
    bi.bmiHeader.biBitCount=24;
    bi.bmiHeader.biSizeImage=nw*nh*3;
    bi.bmiHeader.biClrImportant=1;
    
    tagOsdHelper m_osdHelper;
    if(m_osdHelper.m_nw != nw || m_osdHelper.m_nh != nh)
    {
        //重新生成cache
        m_osdHelper.Reset();
        ASSERT(m_osdHelper.m_pDibBits==NULL);
        ASSERT(m_osdHelper.m_hBmp==NULL);

        HBITMAP hBmp = CreateDIBSection(
                                        NULL,
                                        (BITMAPINFO*) &bi,
                                        DIB_RGB_COLORS,
                                        (LPVOID*)&m_osdHelper.m_pDibBits,
                                        NULL,
                                        0
                                        );
        if(!hBmp)
        {
            //DW("fail CreateDIBSection");
            return 0;
        }

        m_osdHelper.m_nw = nw;
        m_osdHelper.m_nh = nh;

        HDC hdcScreen = ::GetDC(NULL);
        HDC hdc = ::CreateCompatibleDC(hdcScreen);
        ::ReleaseDC(NULL,hdcScreen);
        hdcScreen=NULL;
        m_osdHelper.m_dc.Attach(hdc);

        m_osdHelper.m_hOldBmp = (HBITMAP)::SelectObject( hdc,hBmp);

        m_osdHelper.m_font.CreatePointFont(200,"Arial");
        m_osdHelper.m_pOldFont = m_osdHelper.m_dc.SelectObject(&m_osdHelper.m_font);
    }
    if(!m_osdHelper.m_pDibBits)
    {
        //DW("invalid m_osdHelper.m_pDibBits");
        return 0;
    }

    CDC& dc=m_osdHelper.m_dc;

    memcpy(m_osdHelper.m_pDibBits,pRgb24,bi.bmiHeader.biSizeImage);

    CRect rc(0,0,nw,nh);
    COLORREF clr=RGB(255,0,0);

    dc.SetBkMode(TRANSPARENT);
    dc.SetTextColor(clr);

    CString szText;
    CTime tmNow = CTime::GetCurrentTime();

    rc.DeflateRect(100,100);
    CPen pen;
    pen.CreatePen(PS_SOLID,4,clr);
    CPen *pOldPen=dc.SelectObject(&pen);
    dc.MoveTo(rc.TopLeft());
    dc.LineTo(rc.right,rc.top);
    dc.LineTo(rc.right,rc.bottom);
    dc.LineTo(rc.left,rc.bottom);
    dc.LineTo(rc.TopLeft());
    dc.SelectObject(pOldPen);

    memcpy(pRgb24,m_osdHelper.m_pDibBits,bi.bmiHeader.biSizeImage);
    return 0;
}

作者: wealsh   发布时间: 2011-10-06