MFC:
我阅读了这段绘制椭圆(而不是内部实心)的代码,但是我不明白为什么这里需要两次函数“ pDC-> Ellipse(...)”?
(sol == 0,并且do_what == DRAW_ELLIPSE)

void CMy078207017Dlg::OnLButtonUp(UINT nFlags, CPoint point)
{
        flag = 0;
    end = point;
    assist = point;
    if(p != NULL)
    {
        CDC* pDC = GetDC();
        CPen pen;
        CBrush brush;
        getpen(pen, pDC, col, bol);
        if(do_what >= DRAW_LINE && do_what <= DRAW_RRECT)
        {
            p->p[0] = start;
            p->p[1] = end;
        }

        if(sol == 1)
        {
            getbrush(brush, pDC, col);
        }

        if(do_what == DRAW_LINE)
        {
            pDC->MoveTo(start);
            pDC->LineTo(end);
        }
        else
        {
            if(do_what == DRAW_ELLIPSE || do_what == DRAW_CIRCLE)
            {

                assist = start;
                if(do_what == DRAW_CIRCLE)
                {
                    assist.y = end.y - end.x + start.x;
                }


                pDC->SetROP2(R2_NOT);
                pDC->Ellipse(start.x, assist.y, end.x, end.y);


                pDC->SetROP2(R2_COPYPEN);
                if(sol == 0)
                {
                    pDC->SelectStockObject(NULL_BRUSH);
                }
                pDC->Ellipse(start.x, assist.y, end.x, end.y);


                end = point;
            }

        }
        ReleaseDC(pDC);
    }
    CDialog::OnLButtonUp(nFlags, point);
}


如果我删除对pDC-> Ellipse(...)的第一个调用,则椭圆内部将是黑色实心的。
如果我删除对pDC-> Ellipse(...)的第二个调用,则椭圆将永远不会绘制,但是当鼠标左键向上时椭圆会消失。

对话框:
   移动鼠标时:
       
鼠标移动(笔为绿色)

当鼠标按钮弹出时:
        
鼠标按钮弹出(笔为绿色)

此外,如果我使用CBrush是什么颜色
“ CBrush画笔; pDC-> Ellipse(start.x,assist.y,end.x,end.y);”

当涉及到矩形时,该策略可能会更清晰:

             ...
    else if(do_what==DRAW_RECT||do_what==DRAW_RRECT){

            pDC->SetROP2(R2_NOT);
            if(do_what==DRAW_RECT)
            {
                pDC->Rectangle(start.x,start.y,end.x,end.y);
            }
            else if(do_what==DRAW_RRECT)
            {
                pDC->RoundRect(start.x,start.y,end.x,end.y,20,20);
            }


            pDC->SetROP2(R2_COPYPEN);
            if(sol==0)
            {
                pDC->SelectStockObject(NULL_BRUSH);
            }
            if(do_what==DRAW_RECT)
            {
                pDC->Rectangle(start.x,start.y,point.x,point.y);
            }
            else if(do_what==DRAW_RRECT)
            {
                pDC->RoundRect(start.x,start.y,point.x,point.y,20,20);
            }
            end=point;
        }
            ...

最佳答案

这是因为调用了pDC->SetROP2(R2_NOT)。根据MSDN,R2_NOT标志表示“像素保持不变”。您可以在此处阅读文档-http://msdn.microsoft.com/en-us/library/99ax95h9.aspx

关于c++ - 为什么在这里需要两次绘制椭圆函数Ellipse(…)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12532470/

10-11 21:19