画自定义尺寸的圆角背景
2012-01-29 22:09 Clingingboy 阅读(730) 评论(0) 编辑 收藏 举报
首先准备一个png的圆角背景图
1.分三部分画,可以是”上,中,下”,也可以是“左,中,右”
注意的是圆角的宽度和高度
2.绘制的时候不要忘记设置ImageAttributes的绘制模式,这样就可以画无限的高度和宽度
ImageAttributes imgAtt;
imgAtt.SetWrapMode(WrapModeTileFlipY);
绘制效果
源码Demo
void DrawMargin(Graphics& g, Image* pImage, Rect& rcDst, Rect& rcSrc, int nMarginLeft, int nMarginRight,
int nMarginTop, int nMarginBottom, BOOL bDrawCenter/* = TRUE*/)
{
//ASSERT(pImage);
int nImgWidth = pImage->GetWidth();
int nImgHeight = pImage->GetHeight();
Rect rcImage(0, 0, nImgWidth, nImgHeight);
//ASSERT(rcImage.Contains(rcSrc));
//ASSERT((rcSrc.Width > (nMarginLeft + nMarginRight)) && (rcSrc.Height > (nMarginTop + nMarginBottom)));
if((rcDst.Width <= (nMarginLeft + nMarginRight)) || (rcDst.Height <= (nMarginTop + nMarginBottom)))
g.DrawImage(pImage, rcDst, rcSrc.X, rcSrc.Y, rcSrc.Width, rcSrc.Height, UnitPixel);
ImageAttributes imgAtt;
//上
if(nMarginTop)
{
if(nMarginLeft)
{
Rect rcTopLeft(rcDst.X, rcDst.Y, nMarginLeft, nMarginTop);
g.DrawImage(pImage, rcTopLeft, rcSrc.X, rcSrc.Y, nMarginLeft, nMarginTop, UnitPixel);
}
Rect rcTop(rcDst.X + nMarginLeft, rcDst.Y, rcDst.Width - nMarginLeft - nMarginRight, nMarginTop);
imgAtt.SetWrapMode(WrapModeTileFlipX);
g.DrawImage(pImage, rcTop, rcSrc.X + nMarginLeft, rcSrc.Y, rcSrc.Width - nMarginLeft - nMarginRight, nMarginTop, UnitPixel, &imgAtt);
if(nMarginRight)
{
Rect rcTopRight(rcDst.GetRight() - nMarginRight, rcDst.Y, nMarginRight, nMarginTop);
g.DrawImage(pImage, rcTopRight, rcSrc.GetRight() - nMarginRight, rcSrc.Y, nMarginRight, nMarginTop, UnitPixel);
}
}
//中
if(nMarginLeft)
{
Rect rcLeft(rcDst.X, rcDst.Y + nMarginTop, nMarginLeft, rcDst.Height - nMarginTop - nMarginBottom);
imgAtt.SetWrapMode(WrapModeTileFlipY);
g.DrawImage(pImage, rcLeft, rcSrc.X, rcSrc.Y + nMarginTop, nMarginLeft, rcSrc.Height - nMarginTop - nMarginBottom, UnitPixel, &imgAtt);
}
if(bDrawCenter)
{
Rect rcCenter(rcDst.X + nMarginLeft, rcDst.Y + nMarginTop, rcDst.Width - nMarginLeft - nMarginRight, rcDst.Height - nMarginTop - nMarginBottom);
imgAtt.SetWrapMode(WrapModeTileFlipXY);
g.DrawImage(pImage, rcCenter, rcSrc.X + nMarginLeft, rcSrc.Y + nMarginTop, rcSrc.Width - nMarginLeft - nMarginRight, rcSrc.Height - nMarginTop - nMarginBottom, UnitPixel, &imgAtt);
}
if(nMarginRight)
{
Rect rcRight(rcDst.GetRight() - nMarginRight, rcDst.Y + nMarginTop, nMarginRight, rcDst.Height - nMarginTop - nMarginBottom);
imgAtt.SetWrapMode(WrapModeTileFlipY);
g.DrawImage(pImage, rcRight, rcSrc.GetRight() - nMarginRight, rcSrc.Y + nMarginTop, nMarginRight, rcSrc.Height - nMarginTop - nMarginBottom, UnitPixel, &imgAtt);
}
//下
if(nMarginTop)
{
if(nMarginLeft)
{
Rect rcBottomLeft(rcDst.X, rcDst.GetBottom() - nMarginBottom, nMarginLeft, nMarginBottom);
g.DrawImage(pImage, rcBottomLeft, rcSrc.X, rcSrc.GetBottom() - nMarginBottom, nMarginLeft, nMarginBottom, UnitPixel);
}
Rect rcBottom(rcDst.X + nMarginLeft, rcDst.GetBottom() - nMarginBottom, rcDst.Width - nMarginLeft - nMarginRight, nMarginBottom);
imgAtt.SetWrapMode(WrapModeTileFlipX);
g.DrawImage(pImage, rcBottom, rcSrc.X + nMarginLeft, rcSrc.GetBottom() - nMarginBottom, rcSrc.Width - nMarginLeft - nMarginRight, nMarginBottom, UnitPixel, &imgAtt);
if(nMarginRight)
{
Rect rcBottomRight(rcDst.GetRight() - nMarginRight, rcDst.GetBottom() - nMarginBottom, nMarginRight, nMarginBottom);
g.DrawImage(pImage, rcBottomRight, rcSrc.GetRight() - nMarginRight, rcSrc.GetBottom() - nMarginBottom, nMarginRight, nMarginBottom, UnitPixel);
}
}
}
void DrawMargin1(Graphics& g, Image* pImage, Rect& rcDst, int nMarginLeft, int nMarginRight, int nMarginTop, int nMarginBottom)
{
int nImgWidth = pImage->GetWidth();
int nImgHeight = pImage->GetHeight();
Rect rcSrc(0, 0, nImgWidth, nImgHeight);
DrawMargin(g, pImage, rcDst, rcSrc, nMarginLeft, nMarginRight, nMarginTop, nMarginBottom, TRUE);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2011-01-29 动态规划