使用CreatePatternBrush位图填充一个区域出现了错位

发布时间:2013年8月27日 作者:未知 查看次数:1388

使用CreatePatternBrush位图填充一个区域出现了错位


使用CreatePatternBrush位图填充一个区域出现了错位
用位图使用CreatePatternBrush填充一个区域时,位图上下出现了错位,经查得SetBrushOrgEx得以修正。而SetBrushOrgEx函数的注释为Windows NT会自动设置刷子的起点,所以不应在NT下使用这个函数。

原文:
http://blog.sina.com.cn/s/blog_643695770100xx0p.html
【转】使用FillRect配合CreatePatternBrush,用位图填充一个矩形区域,出现错位
在一个Dialog   取得一个WindowDC,利用这个DC,在Dialog的一个和位图“一样高”矩形区域贴图片,如果这个矩形的相对窗口的坐标为(0,0,100,100),贴图一切正常,但是如果y坐标不从0开始如(0,y1,100,100+y1)or   (11,11,111,111),就出先现交错,如果左上角y值是图片高度的整数倍,又是正常的。 
  
我说得交错是指纵向互补贴图:在指定的区域内部,靠近上边看到图片的尾部,然后下面才是图片的大部分。 
  
跟我感觉FillRect用位图画刷贴图好像默认就是从DC内定的左上角(0,0)开始,我们在指定的区域贴图就像一个矩形的视口一样,如果看的位置不对,看到的部分就包含上面图片的下部和下面图片的上部。
有个设置Brush原点的函数叫SetBrushOrg, 在画图时先改变原点,代码如下:

CBitmap m_Bmp;
HBITMAP hBitmap;
    hBitmap=(HBITMAP)LoadImage(NULL,BitmapPathName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    m_Bmp.Attach (hBitmap);

BITMAP bmstru;
m_Bmp.GetBitmap(&bmstru);

int Self_x,Self_y,Self_cx,Self_cy;
(x!=NULL)?Self_x=x:Self_x=Rect.left;
(y!=NULL)?Self_y=y:Self_y=Rect.top;
(cx!=NULL)?Self_cx=cx:Self_cx=bmstru.bmWidth;
(cy!=NULL)?Self_cy=cy:Self_cy=bmstru.bmHeight;

CRect Self_Rect;

Self_Rect.left=Self_x;
Self_Rect.top=Self_y;
Self_Rect.right=Self_x+Self_cx;
Self_Rect.bottom=200;

CBrush Brush;
CPoint OldPoint;
OldPoint=DC->GetBrushOrg();
DC->SetBrushOrg(Self_x,Self_y);
Brush.CreatePatternBrush(&m_Bmp);
DC->FillRect(Self_Rect, &Brush);
DC->SetBrushOrg(OldPoint);

 



版权所有!www.sieye.cn
E.Mail:sieye@sohu.com QQ:66697110