2012-09-21 66 views
0

MFC: 我讀這個代碼是繪製一個橢圓(不是固體內部),但我不明白爲什麼在這裏需要兩次函數「pDC-> Ellipse(...)」? (溶膠== 0,和do_what == DRAW_ELLIPSE)爲什麼函數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->省略號(...),該橢圓將黑色固體內部。 如果我將第二個調用刪除到pDC-> Ellipse(...),則橢圓將永遠不會繪製,但在鼠標左鍵啓動時會消失。

對話框: 當移動鼠標: enter image description here 鼠標移動(筆爲綠色)

當鼠標按鈕彈起: enter image description here 鼠標按鈕彈出(筆爲綠色)

此外, CBrush的顏色是 「CBrush brush; 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; 
     } 
      ... 
+0

請縮進代碼,它很難閱讀。 – unwind

回答

0

我終於擺脫了麻煩: 代碼別處:

void CDraw2009303476Dlg::OnMouseMove(UINT nFlags, CPoint point) 
{ 
    if(flag == 1) 
    { 
     CDC* pDC = GetDC(); 
     CPen pen; 
     CBrush brush; 
     getPen(pen, pDC, col, bol); 

     if(sol == 1) 
     { 
      getBrush(brush, pDC, col); 
     } 
     if(type >= DRAW_LINE && type <= DRAW_RRECT) 
     { 
      pDC->SetROP2(R2_NOT); 
      if(type == DRAW_LINE) 
      { 
       p->drawLine(point, pDC); 
      } 
      else if(type == DRAW_ELLIPSE) 
      { 
       p->drawEllipse(point, pDC); 
      } 
      else if(type == DRAW_CIRCLE) 
      { 
       p->drawEllipse(point, pDC, 1); 
      } 
      else if(type == DRAW_RECT) 
      { 
       p->drawRect(point, pDC); 
      } 
      else if(type == DRAW_RRECT) 
      { 
       p->drawRect(point, pDC, 1); 
      } 
     } 
     ReleaseDC(pDC); 
    } 
    CDialog::OnMouseMove(nFlags, point); 
} 

所以,策略是:利用 「了pdc-> SetROP2(R2_NOT);」一次和「p-> drawEllipse(point,pDC,1);」兩次在同一個地方保存原始像素以獲得線條繪製效果。 最後調用「pDC-> SetROP2(R2_COPYPEN); p-> drawEllipse(point,pDC,1)」是我們真正需要查看省略號的。 謝謝你的幫助。

1

這是因爲調用pDC->SetROP2(R2_NOT)的:

,當涉及到矩形的策略可能會更清晰。根據MSDN的說法,R2_NOT標誌表示「像素保持不變」。您可以在這裏閱讀文檔 - http://msdn.microsoft.com/en-us/library/99ax95h9.aspx

+0

但我在這裏感到困惑:爲什麼當我刪除第一次調用該函數時,橢圓內部會變黑。 – Al2O3

+0

刪除第一個*哪個*函數的調用?你嘗試過調試嗎? –

+0

調用pDC->橢圓(...) – Al2O3

0

橢圓由當前畫筆繪製,其內部填充當前畫筆。

CDC::Ellipse()參考從MSDN

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); 
    } 
if(do_what==DRAW_CIRCLE){ 
      assist.y=point.y-point.x+start.x; 
    } 
pDC->Ellipse(start.x,assist.y,point.x,point.y); 

所以我們的ROP是R2_COPYPENstates,要使用的像素是當前畫筆的顏色。我的猜測是,筆是黑色的,橢圓被填充爲黑色(請參閱上面有關用於填充橢圓的筆刷的橢圓描述)。

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); 
    } 
if(do_what==DRAW_CIRCLE){ 
      assist.y=point.y-point.x+start.x; 
    } 
// pDC->Ellipse(start.x,assist.y,point.x,point.y); 

因此,如果我們刪除第二Ellipse呼叫然後我們使用R2_NOT,所以該像素保持相同(所以灰色背景),所以我們最終繪製用鋼筆橢圓的顏色作爲背景相同的,所以它從未見過。

你真的需要調試才能看到發生了什麼,但是如果你能在每個點找到筆的顏色和筆刷顏色,你應該清楚發生了什麼。

+0

我不擅長調試,但是我得到了筆的顏色,即RGB(0,255,0):綠色,但正如您所看到的,只有它的輪廓是綠色的,內部是黑色的。 – Al2O3

+0

我不知道是否「CBrush brush」使「pDC->橢圓(...)」繪製一個黑色內部的橢圓。 – Al2O3

+0

@JohnSon是的內部是黑色的,我敢打賭,如果你看看你的畫筆的顏色,它可能是黑色的。如果您閱讀了'pDC-> Ellipse()'[method](http://msdn.microsoft.com/zh-CN/library/6hkxb3kd%28v=vs.80%29.aspx)上的文檔, ,它提到刷子顏色將用於填充橢圓的顏色。 – display101