📄 instsurfwithddraw.cpp
字号:
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
m_pdds->GetSurfaceDesc(&ddsd);
DDSURFACEDESC2 pSurf_ddsd;
ZeroMemory(&pSurf_ddsd,sizeof(pSurf_ddsd));
pSurf_ddsd.dwSize=sizeof(pSurf_ddsd);
pSurf->m_pdds->GetSurfaceDesc(&pSurf_ddsd);
RECT rc={xsrc,ysrc,xsrc+w,ysrc+h};
POS xmin,xmax,ymin,ymax;
xmin=MAX(rx,0);
ymin=MAX(ry,0);
xmax = MIN(rx+rw,ddsd.dwWidth);
ymax = MIN(ry+rh,ddsd.dwHeight);
If xdest > xmax Or ydest > ymax Then ExitSub;
If xdest + rc.Right - rc.Left < xmin Or ydest + rc.Bottom - rc.Top < ymin Then ExitSub;
If xdest < xmin Then {rc.Left = rc.Left - xdest; xdest = xmin; }
If xdest + rc.Right - rc.Left > xmax Then rc.Right = xmax - xdest + rc.Left;
If ydest < ymin Then { rc.Top = rc.Top - ydest; ydest = ymin; }
If ydest + rc.Bottom - rc.Top > ymax Then rc.Bottom = ymax - ydest + rc.Top;
If rc.Left < 0 Then { xdest = xdest - rc.Left; rc.Left = 0; }
If rc.Top < 0 Then { ydest = ydest - rc.Top; rc.Top = 0; }
If rc.Right > (Int32)pSurf_ddsd.dwWidth Then rc.Right = (Int32)pSurf_ddsd.dwWidth;
If rc.Bottom > (Int32)pSurf_ddsd.dwHeight Then rc.Bottom = (Int32)pSurf_ddsd.dwHeight;
HRESULT hr;
if(FAILED( hr=m_pdds->BltFast( xdest, ydest, pSurf->m_pdds, &rc,
(bHasColorKey?DDBLTFAST_SRCCOLORKEY:DDBLTFAST_NOCOLORKEY) | DDBLTFAST_WAIT ) ))__asm int 3;
}
#undef If
#undef Then
#undef ExitSub
#undef Or
#undef Left
#undef Top
#undef Right
#undef Bottom
Int32 CSurf::ToGdiLineStyle(LINESTYLE style)
{
switch(style)
{
case LS_SOLID:
return PS_SOLID;
case LS_DASH:
return PS_DASH;
case LS_DOT:
return PS_DOT;
case LS_DASHDOT:
return PS_DASHDOT;
case LS_DASHDOTDOT:
return PS_DASHDOTDOT;
}
return PS_SOLID;
}
LINESTYLE CSurf::ToInstLineStyle(Int32 gdi)
{
switch(gdi)
{
case PS_SOLID:
return LS_SOLID;
case PS_DASH:
return LS_DASH;
case PS_DOT:
return LS_DOT;
case PS_DASHDOT:
return LS_DASHDOT;
case PS_DASHDOTDOT:
return LS_DASHDOTDOT;
}
return LS_SOLID;
}
void CSurf::SetPixel(POS x,POS y,COLOR color)
{
if(!m_pdds)return;
HDC hdc;
if(DD_OK!=(m_pdds->GetDC(&hdc)))return;
::SetPixel(hdc,x,y,ToGdiColor(color));
m_pdds->ReleaseDC(hdc);
}
COLOR CSurf::GetPixel(POS x,POS y)const
{
if(!m_pdds)return Rgb(0,0,0);
HDC hdc;
if(DD_OK!=(m_pdds->GetDC(&hdc)))return Rgb(0,0,0); //安全!因为Rgb函数会在堆中new一个COLOR
COLOR ret=ToInstColor(::GetPixel(hdc,x,y));
m_pdds->ReleaseDC(hdc);
return ret;
}
void CSurf::DrawLine(POS x1,POS y1,POS x2,POS y2,COLOR color,LINESTYLE ls)
{
if(!m_pdds)return;
HDC hdc;
if(DD_OK!=(m_pdds->GetDC(&hdc)))return;
HPEN tmp=::CreatePen(PS_NULL,0,0);
HPEN prevpen=(HPEN)::SelectObject(hdc,tmp);
::LineTo(hdc,x1,y1);
HPEN hpen=::CreatePen(ls,1,ToGdiColor(color));
::SelectObject(hdc,hpen);
::DeleteObject(tmp);
::LineTo(hdc,x2,y2);
::SelectObject(hdc,prevpen);
::DeleteObject(hpen);
if(DD_OK!=(m_pdds->ReleaseDC(hdc)))return;
}
void CSurf::DrawRect(POS x,POS y,POS w,POS h,COLOR color,LINESTYLE ls)
{
if(!m_pdds)return;
HDC hdc;
if(DD_OK!=(m_pdds->GetDC(&hdc)))return;
HPEN prevpen,hpen;
HBRUSH prevbrush,hbrush;
hpen=::CreatePen(ls,0,ToGdiColor(color));
prevpen=(HPEN)::SelectObject(hdc,hpen);
hbrush=(HBRUSH)::GetStockObject(NULL_BRUSH);
prevbrush=(HBRUSH)::SelectObject(hdc,hbrush);
::SetBkMode(hdc,TRANSPARENT);
::Rectangle(hdc,x,y,x+w,y+h);
::SelectObject(hdc,prevbrush);
::DeleteObject(hbrush);
::SelectObject(hdc,prevpen);
::DeleteObject(hpen);
if(DD_OK!=(m_pdds->ReleaseDC(hdc)))return;
}
void CSurf::DrawRoundRect(POS x,POS y,POS w,POS h,POS arcw,POS arch,COLOR color,LINESTYLE ls)
{
if(!m_pdds)return;
HDC hdc;
if(DD_OK!=(m_pdds->GetDC(&hdc)))return;
HPEN prevpen,hpen;
HBRUSH prevbrush,hbrush;
hpen=::CreatePen(ls,1,ToGdiColor(color));
prevpen=(HPEN)::SelectObject(hdc,hpen);
hbrush=(HBRUSH)::GetStockObject(NULL_BRUSH);
prevbrush=(HBRUSH)::SelectObject(hdc,hbrush);
::RoundRect(hdc,x,y,x+w,y+h,arcw,arch);
::SelectObject(hdc,prevbrush);
::DeleteObject(hbrush);
::SelectObject(hdc,prevpen);
::DeleteObject(hpen);
if(DD_OK!=(m_pdds->ReleaseDC(hdc)))return;
}
void CSurf::DrawEllipse(POS x,POS y,POS w,POS h,COLOR color,LINESTYLE ls)
{
if(!m_pdds)return;
HDC hdc;
if(DD_OK!=(m_pdds->GetDC(&hdc)))return;
HPEN prevpen,hpen;
HBRUSH prevbrush,hbrush;
hpen=::CreatePen(ls,1,ToGdiColor(color));
prevpen=(HPEN)::SelectObject(hdc,hpen);
hbrush=(HBRUSH)::GetStockObject(NULL_BRUSH);
prevbrush=(HBRUSH)::SelectObject(hdc,hbrush);
::Ellipse(hdc,x,y,x+w,y+h);
::SelectObject(hdc,prevbrush);
::DeleteObject(hbrush);
::SelectObject(hdc,prevpen);
::DeleteObject(hpen);
if(DD_OK!=(m_pdds->ReleaseDC(hdc)))return;
}
void CSurf::FillRect(POS x,POS y,POS w,POS h,COLOR color,ALPHA alpha)
{
if(!m_pdds)return;
HDC hdc;
if(DD_OK!=(m_pdds->GetDC(&hdc)))return;
HPEN prevpen,hpen;
HBRUSH prevbrush,hbrush;
hpen=::CreatePen(PS_SOLID,1,ToGdiColor(color));
prevpen=(HPEN)::SelectObject(hdc,hpen);
hbrush=::CreateSolidBrush(ToGdiColor(color));
prevbrush=(HBRUSH)::SelectObject(hdc,hbrush);
::Rectangle(hdc,x,y,x+w,y+h);
::SelectObject(hdc,prevbrush);
::DeleteObject(hbrush);
::SelectObject(hdc,prevpen);
::DeleteObject(hpen);
if(DD_OK!=(m_pdds->ReleaseDC(hdc)))return;
}
void CSurf::FillRoundRect(POS x,POS y,POS w,POS h,POS arcw,POS arch,COLOR color,ALPHA alpha)
{
if(!m_pdds)return;
HDC hdc;
if(DD_OK!=(m_pdds->GetDC(&hdc)))return;
HPEN prevpen,hpen;
HBRUSH prevbrush,hbrush;
hpen=::CreatePen(PS_SOLID,1,ToGdiColor(color));
prevpen=(HPEN)::SelectObject(hdc,hpen);
hbrush=::CreateSolidBrush(ToGdiColor(color));
prevbrush=(HBRUSH)::SelectObject(hdc,hbrush);
::RoundRect(hdc,x,y,x+w,y+h,arcw,arch);
::SelectObject(hdc,prevbrush);
::DeleteObject(hbrush);
::SelectObject(hdc,prevpen);
::DeleteObject(hpen);
if(DD_OK!=(m_pdds->ReleaseDC(hdc)))return;
}
void CSurf::FillEllipse(POS x,POS y,POS w,POS h,COLOR color,ALPHA alpha)
{
if(!m_pdds)return;
HDC hdc;
if(DD_OK!=(m_pdds->GetDC(&hdc)))return;
HPEN prevpen,hpen;
HBRUSH prevbrush,hbrush;
hpen=::CreatePen(PS_SOLID,1,ToGdiColor(color));
prevpen=(HPEN)::SelectObject(hdc,hpen);
hbrush=::CreateSolidBrush(ToGdiColor(color));
prevbrush=(HBRUSH)::SelectObject(hdc,hbrush);
::Ellipse(hdc,x,y,x+w,y+h);
::SelectObject(hdc,prevbrush);
::DeleteObject(hbrush);
::SelectObject(hdc,prevpen);
::DeleteObject(hpen);
if(DD_OK!=(m_pdds->ReleaseDC(hdc)))return;
}
void CSurf::DrawText(const CStr &str,POS x,POS y,POS w,POS h,const IFont *font,COLOR color,DRAWTEXTFLAGS flags,POS shadow,COLOR shadowcolor)
{
if(!m_pdds)return;
if(!font)return;
HDC hdc;
if(DD_OK!=(m_pdds->GetDC(&hdc)))return;
RECT rc1={x,y,x+w-shadow,y+h-shadow};
RECT rc2={x+shadow,y+shadow,x+w,y+h}; //shadow
::SetBkMode(hdc,TRANSPARENT);
::SetTextAlign(hdc,0);
HFONT prevfont,hfont;
hfont=ToGdiFont(font);
prevfont=(HFONT)::SelectObject(hdc,hfont);
if(shadow!=0)
{
::SetTextColor(hdc,ToGdiColor(shadowcolor));
::DrawTextW(hdc,str.ReadW(),str.GetLen(),&rc2,ToGdiDTFlags(flags));
}
::SetTextColor(hdc,ToGdiColor(color));
::DrawTextW(hdc,str.ReadW(),str.GetLen(),&rc1,ToGdiDTFlags(flags));
::SelectObject(hdc,prevfont);
::DeleteObject(prevfont);
if(DD_OK!=(m_pdds->ReleaseDC(hdc)))return;
}
}// end of ns inst
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -