怎样画一个将一个圆形图贴在button上 我的dialog是个变形的dialog。贴了个颜色渐变的蓝色图,显示形状为一个圆。我的button是自己派生的button子类。在DrawItem里可以画出要的圆来。但是圆以外的颜色没有透明。结果看起来还是个正方形。怎么才可以将自绘的button周围的颜色变成透明的阿。因为dialog的底图是渐变的。所以不可能将button的圆形外的地方用某种单色填充,只能将其透明化。麻烦帮帮忙。最好有关键地方的源码。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如下,在你的按钮初始化的时候调用SetWindowRgn设置其区域,static CRgn rgn;rgn.CreateEllipticRgn( 0 , 0 , 50 , 50 ); // 设置一个圆形区域,具体大小请自己计算SetWindowRgn( (HRGN)rgn , TRUE );这样,该圆形区域以外就不属于该按钮,也就自然透明了 在哪初始化阿,我在drawitem和onpaint、button中都试过了,全部会报错,在drawitem中看到效果了,可是我的button是用来移的,一动就报错了。 这我也不清楚了,SetWindowRgn按说应该不会有这方面的问题。试着先确定小点产生的原因吧,是因为按钮窗口的刷新产生的还是其他控件刷新引起的问题 是botton周围的那个pen的问题,老有遗留。有办法将pen去掉么。我用PS_NULL参数试过了,会留白边。拖动botton时一样会留下白点。而且CreateEllipticRgn的范围还必须比我的button范围大才行(及画的button为(0,0,20,20),createellipticrgn(0,0,21,21)才行),要不button边上老闪动。 "botton周围的那个pen",我不太明白啊?看来是没法继续帮你了 阿,我把代码贴出来得了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上面有部分的点会残留。帮帮忙啊 有没有办法把那些残留的点刷掉。在我移动button的过程中。在mousemove时候的问题,还是drawitem时候出的问题阿。我都不知道这个问题怎么查。以前很少做关于界面方面的东西。所以对刷新问题不是很明白。 怎么求出某向量与某平面的交点 求助:俺的VC,只要Ctrl+F(查找),就死了(无响应了),大约2分多钟才活过来 请问如何获取硬盘序列号 苏州科达公司怎么样? 采用多线程定时拷贝文件夹的问题,拷贝时机器就像死机一样? 怎么样用vc实现改变路径后的新建删除文件 在Win2000的DOS命令行中碰到“输入行太长”的问题应该怎么解决? 如何产生指定范围的随即数? 求救:在视图中,我添加了一个控件,如何使用这个控件的事件! 关于音频处理,如何解决顿音问题? 怎样实现ATL生成的结构体被其他语言使用? 在atl项目使用用什么对象可以实现http下载??
static CRgn rgn;
rgn.CreateEllipticRgn( 0 , 0 , 50 , 50 ); // 设置一个圆形区域,具体大小请自己计算
SetWindowRgn( (HRGN)rgn , TRUE );这样,该圆形区域以外就不属于该按钮,也就自然透明了
试着先确定小点产生的原因吧,是因为按钮窗口的刷新产生的还是其他控件刷新引起的问题
{ 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上面有部分的点会残留。帮帮忙啊