使用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);