⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 instsurfwithddraw.cpp

📁 跨平台2D引擎
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -