MemDC,GDI绘制注意点

最近绘制老犯同样的错误,记录下:

1.MemDC中的MemBmp大小一定要设定好,经常设小了,后面的绘不出来,同时最后dc.bitblt时,大小一定要和MemBmp 一致,同样经常是MemBmp必变了,bitblt的rcDest没变,结果还是绘不出来。

2.MemDC上绘制是在(0,0, MemBmp.width, MemBmp.Height)区域上绘的,经常rc设成dc所在窗口的坐标了。

3.MemDC.SelectObject,可以在选了bmp,同时再选pen,当然不是再选bmp,不然原来的画布就被换成新的bmp了,那就白画了

4.MemDC中可以再次多缓冲,当然这时

CDC MemDc2 ;
 MemDc2 .CreateCompatibleDC(&MemDc) ;//它就把MemDc当成它的dc了,所以我们可以在MemDc2中SelectObject,再绘到MemDc中

5.去掉焦点的虚线框,除了要把WM_SETFOUCE干掉,还得设定焦点到其他窗口,经常是不设,想破脑袋也没反应过来,靠,怎么虚框还在!

6.MemDc中当然可以使用gdi+,这时gdi+初始化的句柄是(MemDc.GetSafeHdc()) ;经常写成(dc.GetSafeHdc()),结果gdi+是直接以dc的那个坐标系来绘了。

7.gdi+经常存在资源未释放的BUG
如:Image::FromStream:MSDN:The FromStream method creates a new Image object based on a stream
所以必须delete
如   IStream::Release 在MSDN解释是is similar to a close funtion on a file,Once released, the stream object  is no longer valid and cannot be used
网上很多代码说

	IStream* pstm; 
	HRESULT ht =  CreateStreamOnHGlobal(m_hMem,FALSE,&pstm); 
	pstm->Release(); 
说什么释放IStream指针,同时释放了m_hMem
其实这是在CreateStreamOnHGlobal的第二个参数设为true的情况下,MSDN:If set to TRUE, the final release will automatically free the hGlobal parameter.

转载于:https://www.cnblogs.com/hgy413/archive/2011/09/02/3693598.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`MemDC.StretchBlt` 是 MFC(Microsoft Foundation Classes)中的一个函数,用于在内存 DC(Device Context)中进行图像的缩放和复制操作。 具体来说, `MemDC` 是一个 CDC(Device Context) 对象,表示一个设备上下文(即绘图设备)。`StretchBlt` 函数的作用是将一个指定区域的图像缩放到另一个指定区域,并将结果复制到指定的内存设备上下文中。该函数可以实现图像的放大、缩小、旋转等操作。 该函数的函数原型如下: ```cpp BOOL CDC::StretchBlt(int x, int y, int cx, int cy, CDC* pSrcDC, int xSrc, int ySrc, int cxSrc, int cySrc, DWORD dwRop); ``` 其中,`x` 和 `y` 表示目标矩形区域的左上角坐标,`cx` 和 `cy` 表示目标矩形区域的宽度和高度,`pSrcDC` 表示源设备上下文,即要缩放的图像所在的设备上下文,`xSrc` 和 `ySrc` 表示源矩形区域的左上角坐标,`cxSrc` 和 `cySrc` 表示源矩形区域的宽度和高度,`dwRop` 表示光栅操作码,用于指定如何将源矩形区域的图像复制到目标矩形区域。 例如,以下代码可以将位图 `pBitmap` 缩放到矩形区域 `(10, 10, 200, 200)`,并将结果复制到内存设备上下文 `MemDC` 中: ```cpp CBitmap* pBitmap = ...; // 获取位图指针 CDC dc; dc.CreateCompatibleDC(&MemDC); // 创建兼容的设备上下文 dc.SelectObject(pBitmap); // 选择要缩放的位图 MemDC.StretchBlt(10, 10, 200, 200, &dc, 0, 0, pBitmap->GetWidth(), pBitmap->GetHeight(), SRCCOPY); ``` 这里,我们首先创建了一个临时设备上下文 `dc`,并将其与位图 `pBitmap` 关联。然后,我们调用 `StretchBlt` 函数将位图缩放到 `(10, 10, 200, 200)` 区域的大小,并将结果复制到内存设备上下文 `MemDC` 中。最后,我们可以释放 `dc` 对象的资源,以避免内存泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值