使用CreatePatternBrush,用位图填充一个矩形区域,出现交错问题??
2014-02-17 20:22
597 查看
首先看示例程序:
[align=left] HBITMAP hBmp = NULL;[/align]
hBmp =
::SHLoadDIBitmap (filePath);
[align=left] if (!hBmp )[/align]
[align=left] {[/align]
PQMsgBox(L "Load
Message Dialog Bitmap Fail!" );
LogToFile(L "CMessageDlg::OnInitDialog :Load
Message Dialog Bitmap Fail!");
[align=left] return;[/align]
[align=left] }[/align]
[align=left] CBitmap fillBmp ;[/align]
[align=left] fillBmp.Attach (hBmp);[/align]
[align=left] CBrush fillBrush ;[/align]
[align=left] fillBrush.CreatePatternBrush (&fillBmp);[/align]
[align=left] CBrush *oldBrush = memDC-> SelectObject(&fillBrush );[/align]
[align=left] CPen fillPen (PS_NULL, 1,RGB( 0,0 ,0));[/align]
[align=left] CPen *oldPen = memDC-> SelectObject(&fillPen );[/align]
[align=left] memDC->Rectangle (rect);[/align]
[align=left]这样子画出来的图片,可能会出现交错现象,为什么呢?由于dc在画刷默认的位置从(0,0)开始的,所以填充到指定位置的时候就可能出现交错。好在微软提供了如下函数解决此问题:[/align]
注意此函数的remark:
[align=left]必须在selectobject之前调用,即选入brush之前调用它,否则无效。[/align]
[align=left]修改后如下:[/align]
[align=left] HBITMAP hBmp = NULL ;[/align]
hBmp =
::SHLoadDIBitmap ( filePath);
[align=left] if (!hBmp )[/align]
[align=left] {[/align]
PQMsgBox (L "Load
Message Dialog Bitmap Fail!" );
LogToFile (L "CMessageDlg::OnInitDialog : Load
Message Dialog Bitmap Fail!");
[align=left] return ;[/align]
[align=left] }[/align]
[align=left] CBitmap fillBmp ;[/align]
[align=left] fillBmp .Attach ( hBmp);[/align]
[align=left] CBrush fillBrush ;[/align]
[align=left] fillBrush .CreatePatternBrush (& fillBmp);[/align]
[align=left] memDC ->SetBrushOrg ( screenPoint); // 此句目的防止画刷交替[/align]
[align=left] CBrush *oldBrush = memDC-> SelectObject (&fillBrush );[/align]
[align=left] CPen fillPen ( PS_NULL, 1, RGB( 0,0 ,0));[/align]
[align=left] CPen *oldPen = memDC-> SelectObject (&fillPen );[/align]
[align=left] memDC ->Rectangle ( rect);[/align]
[align=left] HBITMAP hBmp = NULL;[/align]
hBmp =
::SHLoadDIBitmap (filePath);
[align=left] if (!hBmp )[/align]
[align=left] {[/align]
PQMsgBox(L "Load
Message Dialog Bitmap Fail!" );
LogToFile(L "CMessageDlg::OnInitDialog :Load
Message Dialog Bitmap Fail!");
[align=left] return;[/align]
[align=left] }[/align]
[align=left] CBitmap fillBmp ;[/align]
[align=left] fillBmp.Attach (hBmp);[/align]
[align=left] CBrush fillBrush ;[/align]
[align=left] fillBrush.CreatePatternBrush (&fillBmp);[/align]
[align=left] CBrush *oldBrush = memDC-> SelectObject(&fillBrush );[/align]
[align=left] CPen fillPen (PS_NULL, 1,RGB( 0,0 ,0));[/align]
[align=left] CPen *oldPen = memDC-> SelectObject(&fillPen );[/align]
[align=left] memDC->Rectangle (rect);[/align]
[align=left]这样子画出来的图片,可能会出现交错现象,为什么呢?由于dc在画刷默认的位置从(0,0)开始的,所以填充到指定位置的时候就可能出现交错。好在微软提供了如下函数解决此问题:[/align]
CDC::SetBrushOrg |
[align=left]必须在selectobject之前调用,即选入brush之前调用它,否则无效。[/align]
[align=left]修改后如下:[/align]
[align=left] HBITMAP hBmp = NULL ;[/align]
hBmp =
::SHLoadDIBitmap ( filePath);
[align=left] if (!hBmp )[/align]
[align=left] {[/align]
PQMsgBox (L "Load
Message Dialog Bitmap Fail!" );
LogToFile (L "CMessageDlg::OnInitDialog : Load
Message Dialog Bitmap Fail!");
[align=left] return ;[/align]
[align=left] }[/align]
[align=left] CBitmap fillBmp ;[/align]
[align=left] fillBmp .Attach ( hBmp);[/align]
[align=left] CBrush fillBrush ;[/align]
[align=left] fillBrush .CreatePatternBrush (& fillBmp);[/align]
[align=left] memDC ->SetBrushOrg ( screenPoint); // 此句目的防止画刷交替[/align]
[align=left] CBrush *oldBrush = memDC-> SelectObject (&fillBrush );[/align]
[align=left] CPen fillPen ( PS_NULL, 1, RGB( 0,0 ,0));[/align]
[align=left] CPen *oldPen = memDC-> SelectObject (&fillPen );[/align]
[align=left] memDC ->Rectangle ( rect);[/align]
相关文章推荐
- hibernate查询某一个对象后,执行createSQLQuery查询出现的问题
- 使用Foreach时出现的一个小问题
- "执行SQL语句时出现问题操作必须使用一个可更新的查询"错误的解决方法
- 解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
- linux下开发,解决cocos2d-x中编译出现的一个小问题, undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
- 在Linux中使用vi/vim打开一个文件时出现的的问题
- POSIX timer函数 timer_creat()使用中出现的一个问题
- 解决用CreateCompatibleBitmap()创建兼容位图出现的黑底问题
- 深入springMVC------文件上传源码解析(上篇) 最近在项目中,使用springmvc 进行上传文件时,出现了一个问题: org.springframework.web.multipart
- 后台使用Spring MVC 4.15 版本 通过 ajaxFileUpload plugin插件上传文件相应时引起的一个小问题,Chrome、Firefox中出现SyntaxError:unexpected token <
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题
- 分别使用静态数组与动态数组建立一个区域 - 回复 "老A123" 的问题
- 创建位图画刷(CreatePatternBrush)
- 使用distinct出现的一个问题
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题
- 一个Eigen库使用时的出现的问题(complex的头文件兼容性)
- Microsoft VBScript 运行时错误 错误 '800a01fb' 出现一个意外错误: 'XMLDom.createNode' 问题解决
- 关于解决在使用opencv时出现*.exe 已触发了一个断点的问题
- 这是一个DirectInput使用出现了一个小问题 directx高手 请进来指点江山
- 使用jatoolsPrinter打印页面后通过window.close()出现的一个问题