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