CRect rcCli;
GetClientRect(&rcCli);
CRect rc(10,10,50,50);
CPaintDC dc(this); CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap mp;
mp.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height());
memDC.SelectObject(mp); CPen pen(PS_SOLID, 1, CLAYERDLG_BORDER_COLOR);
memDC.SelectObject(&pen);
CBrush brush(CLAYERDLG_BK_COLOR);
memDC.SelectObject(&brush);
CRect rcFrame(0,0,rc.Width(), rc.Height());
memDC.RoundRect(rcFrame, CPoint(2, 2));
BitBlt(dc.m_hDC, rc.left, rc.top, rc.Width(), rc.Height(), memDC.m_hDC, 0, 0, SRCCOPY);网上找了下,说用CreateRoundRectRgn和FillRgn代替RoundRect。什么意思?
把红的这句,用rgnWnd.CreateRoundRectRgn(rcCli.left, rcCli.top, rcCli.right, rcCli.bottom, 2, 2);
memDC.FillRgn(rgnWnd, brush);代替就行了?我试了下,好像还是一样边角是黑色。而且FillRgn只是填充画刷,连边框都没了。

解决方案 »

  1.   

    CreateRoundRectRgn是设置窗体或者控件的大小范围。
    最好是在OnPreCreate和OnSize中设置。
      

  2.   

    怎么用?BitBlt这个怎么代替?你把这段代码放到随便一个VC建的普通对话框里,都会重现我说的这个问题。
      

  3.   

    CDC memDC;本身就是黑色的。你只绘制了圆形区域,但是边角你又没有绘制。memDC.FillSolidRec(rcCli, RGB(200,240,200)); 先填充整个区域memDC.FrameRgn()  在绘制圆形
      

  4.   

    恩,原因我知道。
    怎么把透明的贴上去?边角让他保持原有的背景色?memDC.FillSolidRec(rcCli, RGB(200,240,200));这样的话,背景就变成RGB(200,240,200)这个颜色了
      

  5.   

    不太明白你说的边角让他保持原有的背景色?   没绘制之前的对话框本来颜色是RGB(240,240,240)怎么把透明的贴上去?  你只想画圆形,不想填充,那就用FrameRgn
      

  6.   

    产生一个 园角 的 rgn
    SelectClipRgn 就可以了
      

  7.   


    我的意思是现在一个menDC上绘制一个复杂的圆角矩形,或则复杂的其他非规则图形。然后把memDC的内容贴到对话框上。怎么绘制我会,但是怎么实现绘制到memDc上后,然后贴到对话框上。双缓存。
      

  8.   

    “实现绘制到memDc上后,然后贴到对话框上”把 memdc里的 图
    bitblt()
    到 对话框dc
      

  9.   


    CRgn rgn;
    rgn.CreateRoundRectRgn(rcFrame.left,rcFrame.top,rcFrame.right,rcFrame.bottom,50, 50);/
      

  10.   

    晚了点:对话框 OnPaint()
    else
    {
        #define R 50
        #define W 300
        #define H 200
        #define O_X 30
        #define O_Y 20
        CPaintDC dc(this);
    //
        CDC memDC;
        memDC.CreateCompatibleDC(&dc);
    //
        CBitmap bmp;
        bmp.CreatCompatibleBitmap(&dc,W,H);
        memDC.SelectObject(bmp);
        CBrush brush;
        brush.CreateSolidBrush(RGB(196,196,255));
        memDC.SelectObject(brush);
    // 蓝底
        CRgn rgn;
        rgn.CreateRoundRectRgn(0,0,W,H,R,R);
        memDC.FillRgn(&rgn,&brush);
    // 红边
        CBrush brush1;
        brush1.CreateSolidBrush(RGB(255,0,0));
        memDC.SelectObject(brush1);
        memDC.FrameRgn(&rgn,&brush1,1,1);
    // 去4个角
        CRgn rgn1;
        rgn1.CreateRoundRectRgn(O_X,O_Y,W+O_X,H+O_Y,R,R);
        dc.SelectClipRgn(&rgn1);
        dc.BitBlt(O_X,O_Y,W+O_X,H+O_Y,&memDC,0,0,SRCCOPY);          
    }