使用CreatePatternBrush,用位图填充一个矩形区域,出现交错问题??

本文介绍了一种在使用画刷填充图片时避免交错现象的方法。通过调整画刷原点的位置来确保图片正确显示,避免了默认从(0,0)开始绘制导致的问题,并提供了具体的代码实现。

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

首先看示例程序:
        HBITMAP hBmp = NULL;
        hBmp = ::SHLoadDIBitmap (filePath);
        if (!hBmp )
        {
            PQMsgBox(L "Load Message Dialog Bitmap Fail!" );
            LogToFile(L "CMessageDlg::OnInitDialog Load Message Dialog Bitmap Fail!");
            return;
        }
        CBitmap fillBmp ;
        fillBmp.Attach (hBmp);
        CBrush fillBrush ;
        fillBrush.CreatePatternBrush (&fillBmp);
        CBrush *oldBrush = memDC-> SelectObject(&fillBrush );
        CPen fillPen (PS_NULL, 1,RGB( 0,0 ,0));
        CPen *oldPen = memDC-> SelectObject(&fillPen );
        memDC->Rectangle (rect);

这样子画出来的图片,可能会出现交错现象,为什么呢?由于dc在画刷默认的位置从(0,0)开始的,所以填充到指定位置的时候就可能出现交错。好在微软提供了如下函数解决此问题:

CDC::SetBrushOrg
注意此函数的remark:
必须在selectobject之前调用,即选入brush之前调用它,否则无效。
修改后如下:

        HBITMAP hBmp = NULL ;
        hBmp = ::SHLoadDIBitmap ( filePath);
        if (!hBmp )
        {
            PQMsgBox (L "Load Message Dialog Bitmap Fail!" );
            LogToFile (L "CMessageDlg::OnInitDialog  Load Message Dialog Bitmap Fail!");
            return ;
        }
        CBitmap fillBmp ;
        fillBmp .Attach ( hBmp);
        CBrush fillBrush ;
        fillBrush .CreatePatternBrush (& fillBmp);
        memDC ->SetBrushOrg ( screenPoint);    // 此句目的防止画刷交替
        CBrush *oldBrush memDC-> SelectObject (&fillBrush );
        CPen fillPen ( PS_NULL, 1, RGB( 0,0 ,0));
        CPen *oldPen memDC-> SelectObject (&fillPen );
        memDC ->Rectangle ( rect);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值