Почему функция Ellipse (…) здесь нужна дважды, чтобы нарисовать эллипс?

МФЦ:
Я прочитал этот код, который должен рисовать эллипс (не сплошную внутреннюю часть), но я не могу понять, почему функция «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;
}
...

0

Решение

Это из-за вызова pDC->SetROP2(R2_NOT), R2_NOT флаг означает «Пиксель остается неизменным», согласно MSDN. Вы можете прочитать документацию здесь — http://msdn.microsoft.com/en-us/library/99ax95h9.aspx.

1

Другие решения

Эллипс рисуется текущей ручкой, а его внутренняя часть заполнена текущей кистью.

От 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_COPYPEN который состояния что используемый пиксель является текущим цветом пера. Я предполагаю, что ручка черная, а эллипс залит черным (см. Описание эллипса, приведенное выше, о кисточке, используемой для заполнения эллипса).

 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);

Так что, если мы удалим 2-й Ellipse позвоните, то мы используем R2_NOTТаким образом, пиксель остается неизменным (серый фон), поэтому мы в конечном итоге рисуем эллипс пером того же цвета, что и фон, поэтому его никогда не видно.

Вам действительно нужно отладить, чтобы увидеть, что происходит, но если вы можете узнать цвет пера и цвет кисти в каждой точке, вы должны получить хорошее представление о том, что происходит.

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);» Once и «p-> drawEllipse (point, pDC, 1);» дважды в том же месте, чтобы сохранить исходные пиксели, чтобы получить эффекты рисования линий.
И последний вызов «pDC-> SetROP2 (R2_COPYPEN); p-> drawEllipse (point, pDC, 1)» — это то, что нам действительно нужно, чтобы увидеть многоточие.
Спасибо за вашу помощь.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector