【如何自绘带圆角的进度条?】

【怎么自绘带圆角的进度条???】
本帖最后由 VisualEleven 于 2015-04-28 18:27:04 编辑
就是显示区域怎么变为圆角或者椭圆的?
下面的是我网上找的一个代码:
要怎么讲矩形区域该为圆角区域??

//CreateRoundRectRgn
void CMyProgress::OnPaint() 
{
//CPaintDC dc(this);
ModifyStyleEx(WS_EX_STATICEDGE,0);//去掉边框

PAINTSTRUCT ps;//声明一个绘画区域 
    CDC *pDC = BeginPaint(&ps);//把绘画区域选入设备上下文并开始
    int nPos = GetPos();//获取进度条的进度位置
    int nMin,nMax;//声明进度条的最大最小限制
    GetRange(nMin,nMax);//获取限制

    CString csPos;//声明字符串,用于显示进度条的进度
    csPos.Format("%d%%",nPos*100/(nMax-nMin));//把进度位置复制到StrPos
    
    CRect clientRC;
    GetClientRect(clientRC);//获取客户区矩形


//CreateRoundRectRgn(clientRC.left,clientRC.top,clientRC.right,clientRC.bottom,10,10);

//获取显示StrPos的规模大小
    CSize sztext = pDC->GetTextExtent(csPos); //获取字符串的高度和宽度
    int nX = (clientRC.Width() - sztext.cx) /2; //计算中心位置//获取显示字符串的X
    int nY = (clientRC.Height() -sztext.cy) /2;//获取显示字符串的Y
    pDC->SetBkMode(TRANSPARENT);//设置背景模式为透明
    
    
    //获取单位刻度
    double dFraction = (double) clientRC.Width()/(nMax-nMin);//获取单位刻度
    double nLeft = nPos * dFraction; //当前长度


    CRect leftRC = clientRC;//声明进度条区域和空白区域
    leftRC.right = nLeft;//进度条区域
    CRect rightRC = clientRC;
    rightRC.left = nLeft;//空白区域
    
    pDC->FillRect(leftRC,&CBrush(RGB(0,255,0)));//画进度条区域
    pDC->FillRect(rightRC,&CBrush(RGB(255,255,255)));//画空白区域

    pDC->SetTextColor(RGB(0,0,255));//设置文本颜色
    pDC->TextOut(nX,nY,csPos);//写文本
    ReleaseDC(pDC);//销毁设备上下文
    EndPaint(&ps);//结束绘画区域绘画
}

------解决思路----------------------
用户区就是一个矩形区,但你可以在此区域中绘制圆形或弧线
------解决思路----------------------
本帖最后由 VisualEleven 于 2015-04-28 18:27:23 编辑
需要:
	SetWindowRgn( hRgn, TRUE );
以及:
CRgn rgn;
rgn.CreateRectRgn(rect.left,rect.top,rect.right,rect.bottom); 
int ret=::GetWindowRgn(lpDS->hwndItem,rgn);
dc.SelectClipRgn(&rgn);