九宫格贴图函数

本文介绍了一种九宫格图像的绘制方法,利用Graphics对象进行图像的分块与拉伸绘制,适用于需要动态调整图像大小的应用场景。该方法通过定义不同的矩形区域来实现图像的各部分按需缩放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void Draw9(
                   HDC hDC,                 // 目标DC
                   const CRect& rcDraw,     // 要绘制的区域
                   Image * pImage,          // 加载了图片资源的Image对象
                   const CRect& rcRes1,     // 资源左上角区域  
                   const CRect& rcRes2      // 资源右下角区域
                   )
{
    Graphics graph(hDC);
    RectF rcf1(rcDraw.left, rcDraw.top, rcRes1.Width(), rcRes2.Height()); 
    RectF rcf2(rcDraw.left+rcRes1.Width(), rcDraw.top, rcDraw.Width()-rcRes1.Width()-rcRes2.Width(), rcRes1.Height()); 
    RectF rcf3(rcDraw.Width()-rcRes2.Width()+rcDraw.left, rcDraw.top, rcRes2.Width(), rcRes1.Height()); 
    RectF rcf4(rcDraw.left, rcDraw.top+rcRes1.Height(), rcRes1.Width(), rcDraw.Height()-rcRes1.Height()-rcRes2.Height()); 
    RectF rcf5(rcDraw.left+rcRes1.Width(), rcDraw.top+rcRes1.Height(), rcDraw.Width()-rcRes1.Width()-rcRes2.Width(), rcDraw.Height()-rcRes1.Height()-rcRes2.Height());
    RectF rcf6(rcDraw.Width()-rcRes2.Width()+rcDraw.left, rcDraw.top+rcRes1.Height(), rcRes2.Width(), rcDraw.Height()-rcRes1.Height()-rcRes2.Height()); 
    RectF rcf7(rcDraw.left, rcDraw.Height()-rcRes2.Height()+rcDraw.top, rcRes1.Width(), rcRes2.Height());    
    RectF rcf8(rcDraw.left+rcRes1.Width(), rcDraw.Height()-rcRes2.Height()+rcDraw.top, rcDraw.Width()-rcRes1.Width()-rcRes2.Width(), rcRes2.Height());
    RectF rcf9(rcDraw.Width()-rcRes2.Width()+rcDraw.left, rcDraw.Height()-rcRes2.Height()+rcDraw.top, rcRes2.Width(), rcRes2.Height()); 

    graph.DrawImage(pImage, rcf1, rcRes1.left, rcRes1.top, rcRes1.Width(), rcRes1.Height(), UnitPixel);  
    graph.DrawImage(pImage, rcf2, rcRes1.right+1, rcRes1.top, 1, rcRes1.Height(), UnitPixel);
    graph.DrawImage(pImage, rcf3, rcRes2.left, rcRes1.top, rcRes2.Width(), rcRes1.Height(), UnitPixel);
    graph.DrawImage(pImage, rcf4, rcRes1.left, rcRes1.bottom+1, rcRes1.Width(), 1, UnitPixel);
    graph.DrawImage(pImage, rcf5, rcRes1.right+1, rcRes1.bottom+1, 1, 1, UnitPixel);
    graph.DrawImage(pImage, rcf6, rcRes2.left, rcRes1.bottom+1, rcRes2.Width(), 1, UnitPixel);
    graph.DrawImage(pImage, rcf7, rcRes1.left, rcRes2.top, rcRes1.Width(), rcRes2.Height(), UnitPixel);
    graph.DrawImage(pImage, rcf8, rcRes1.right+1, rcRes2.top, 1, rcRes2.Height(), UnitPixel);  
    graph.DrawImage(pImage, rcf9, rcRes2.left, rcRes2.top, rcRes2.Width(), rcRes2.Height(), UnitPixel);

    graph.ReleaseHDC(hDC);

}

 

CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap memBmp, * pmemBmp;
memBmp.CreateCompatibleBitmap(&dc, rcWnd.Width(), rcWnd.Height());
pmemBmp = memDC.SelectObject(&memBmp);
memDC.FillSolidRect(rcWnd, 0xFFFF00);

CRect rcDraw = rcWnd;
Draw9(memDC.m_hDC, rcDraw, m_pImage, CRect(45,66,54,76), CRect(58,80,67,90)); 

dc.BitBlt(0, 0, rcWnd.Width(), rcWnd.Height(), &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pmemBmp);
ReleaseDC(&memDC);



 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值