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;
};

解决方案 »

  1.   

    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;
    }
      

  2.   

    type
      tagOsdHelper = class
        private
          m_nw : integer;
          m_nh : integer;      m_hBmp : HBITMAP;
          m_holdbmp : HBITMAP;
          m_pDibBits : LPBYTE;
          m_dc : HDC;
          m_font : TFont;
          m_pOldFont : ^TFont;
        public
          constructor Create(); override;
          destructor  Destroy(); override;
      end;implementation
    { tagOsdHelper }constructor tagOsdHelper.Create;
    begin
      inherited;end;destructor tagOsdHelper.Destroy;
    begin  inherited;
    end;
      

  3.   


    type
      tagOsdHelper = class
        private
          m_nw : integer;
          m_nh : integer;      m_hBmp : HBITMAP;
          m_holdbmp : HBITMAP;
          m_pDibBits : LPBYTE;
          m_dc : HDC;
          m_font : TFont;
          m_pOldFont : ^TFont;
          procedure Reset();
        public
          constructor Create(); override;
          destructor  Destroy(); override;
      end;implementation
    { tagOsdHelper }constructor tagOsdHelper.Create;
    begin
      inherited;
      m_nw := 0 ;
      m_nh := 0 ;  m_hBmp := nil;
      m_holdbmp := nil;
      m_pDibBits := nil;
      m_pOldFont := nil;end;destructor tagOsdHelper.Destroy;
    begin
      Reset();
      inherited;
    end;procedure tagOsdHelper.Reset;
    begin
      {待加入}
    end;