怎样画一个将一个圆形图贴在button上
我的dialog是个变形的dialog。贴了个颜色渐变的蓝色图,显示形状为一个圆。我的button是自己派生的button子类。在DrawItem里可以画出要的圆来。但是圆以外的颜色没有透明。结果看起来还是个正方形。怎么才可以将自绘的button周围的颜色变成透明的阿。因为dialog的底图是渐变的。所以不可能将button的圆形外的地方用某种单色填充,只能将其透明化。麻烦帮帮忙。最好有关键地方的源码。 问题点数:100、回复次数:8Top
1 楼whoishere(我来也)回复于 2003-09-03 15:32:11 得分 100
如下,在你的按钮初始化的时候调用SetWindowRgn设置其区域,
static CRgn rgn;
rgn.CreateEllipticRgn( 0 , 0 , 50 , 50 ); // 设置一个圆形区域,具体大小请自己计算
SetWindowRgn( (HRGN)rgn , TRUE );
这样,该圆形区域以外就不属于该按钮,也就自然透明了Top
2 楼jacking007(复活岛)回复于 2003-09-03 16:10:45 得分 0
在哪初始化阿,我在drawitem和onpaint、button中都试过了,全部会报错,在drawitem中看到效果了,可是我的button是用来移的,一动就报错了。Top
3 楼jacking007(复活岛)回复于 2003-09-03 16:38:18 得分 0
移动问题搞好了。在问一下。我移动时,还是会有很多小点没有刷新阿。有办法搞定么?Top
4 楼whoishere(我来也)回复于 2003-09-03 17:10:18 得分 0
这我也不清楚了,SetWindowRgn按说应该不会有这方面的问题。
试着先确定小点产生的原因吧,是因为按钮窗口的刷新产生的还是其他控件刷新引起的问题Top
5 楼jacking007(复活岛)回复于 2003-09-04 09:22:00 得分 0
是botton周围的那个pen的问题,老有遗留。有办法将pen去掉么。我用PS_NULL参数试过了,会留白边。拖动botton时一样会留下白点。而且CreateEllipticRgn的范围还必须比我的button范围大才行(及画的button为(0,0,20,20),createellipticrgn(0,0,21,21)才行),要不button边上老闪动。Top
6 楼whoishere(我来也)回复于 2003-09-04 09:47:28 得分 0
"botton周围的那个pen",我不太明白啊?看来是没法继续帮你了Top
7 楼jacking007(复活岛)回复于 2003-09-04 14:15:09 得分 0
阿,我把代码贴出来得了
void CButtonMove::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CRgn rgn;
rgn.CreateEllipticRgn( 0 , 0 , 21 , 21 );
SetWindowRgn( (HRGN)rgn , TRUE );
//使用刷子画图时的情况
CDC *pDC =CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rtControl(lpDrawItemStruct->rcItem);
CPen pen(PS_SOLID,1,RGB(255,0,0)),*old_pen;
CBrush *old_brush;
CString strText;
rtControl.EqualRect(rtControl);
// Resource handle to bitmap.
HRSRC hRes;
// Global handles to bitmap resource.
HGLOBAL hData, hLockedData;
CBrush brush;
// Find the resource handle.
hRes = ::FindResource(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDB_POINTBMP), RT_BITMAP);
if (hRes != NULL)
{
// Lock and Load (or Load and Lock).
if (((hData = ::LoadResource(AfxGetResourceHandle(),
hRes)) != NULL) &&
((hLockedData = (HGLOBAL)::LockResource(hData)) != NULL))
{
// Initialize the brush.
brush.CreateDIBPatternBrush(hLockedData,
DIB_RGB_COLORS);
}
}
old_brush=pDC->SelectObject(&brush);
old_pen =pDC->SelectObject(&pen);
pDC->Ellipse(rtControl);
//字体背景是否为透明
pDC->SetBkMode(TRANSPARENT);
GetWindowText(strText);
pDC->DrawText(strText,rtControl,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
}
就是pen上面有部分的点会残留。帮帮忙啊Top
8 楼jacking007(复活岛)回复于 2003-09-04 14:18:42 得分 0
有没有办法把那些残留的点刷掉。在我移动button的过程中。在mousemove时候的问题,还是drawitem时候出的问题阿。我都不知道这个问题怎么查。以前很少做关于界面方面的东西。所以对刷新问题不是很明白。Top



