Estoy tratando de dibujar un círculo y actualmente estoy usando la Elipse() función.

Tengo la partida coordenadas del ratón – x1 y y1 y el final de las coordenadas x2 y y2. Como puede ver, estoy obligando a los y2(temp_shape.la parte inferior) a = y1+(x2-x1). Esto no funciona como se pretende. Sé el cálculo es completamente equivocado, pero alguna idea sobre lo que es justo?

Código De Abajo.

case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
//TODO: Add any drawing code here...
RECT rect;
GetClientRect(hWnd, &rect);
HDC backbuffDC = CreateCompatibleDC(hdc);
HBITMAP backbuffer = CreateCompatibleBitmap( hdc, rect.right, rect.bottom);
int savedDC = SaveDC(backbuffDC);
SelectObject( backbuffDC, backbuffer );
HBRUSH hBrush = CreateSolidBrush(RGB(255,255,255));
FillRect(backbuffDC,&rect,hBrush);
DeleteObject(hBrush);
//Brush and Pen colours
SelectObject(backbuffDC, GetStockObject(DC_BRUSH));
SetDCBrushColor(backbuffDC, RGB(255,0,0));
SelectObject(backbuffDC, GetStockObject(DC_PEN));
SetDCPenColor(backbuffDC, RGB(0,0,0));
//Shape Coordinates
temp_shape.left=x1;
temp_shape.top=y1;
temp_shape.right=x2;
temp_shape.bottom=y2;
//Draw Old Shapes
//Rectangles
for ( int i = 0; i < current_rect_count; i++ )
{
Rectangle(backbuffDC, rect_list[i].left, rect_list[i].top, rect_list[i].right, rect_list[i].bottom);
}
//Ellipses
for ( int i = 0; i < current_ellipse_count; i++ )
{
Ellipse(backbuffDC, ellipse_list[i].left, ellipse_list[i].top, ellipse_list[i].right, ellipse_list[i].bottom);
}
if(mouse_down)
{
if(drawCircle)
{
temp_shape.right=y1+(x2-x1);
Ellipse(backbuffDC, temp_shape.left, temp_shape.top, temp_shape.right, temp_shape.bottom);
}
if(drawRect)
{
Rectangle(backbuffDC, temp_shape.left, temp_shape.top, temp_shape.right, temp_shape.bottom);
}
if(drawEllipse)
{
Ellipse(backbuffDC, temp_shape.left, temp_shape.top, temp_shape.right, temp_shape.bottom);
}
}
BitBlt(hdc,0,0,rect.right,rect.bottom,backbuffDC,0,0,SRCCOPY);
RestoreDC(backbuffDC,savedDC);
DeleteObject(backbuffer);
DeleteDC(backbuffDC);
EndPaint(hWnd, &ps);
}
break;
  • Podrías dar un poco más de «no funciona como se pretende»?
  • No dibujar una adecuada círculo.
  • ¿Qué dibujar?
  • una elipse. EDITAR – Ahora el dibujo de un círculo después de Remy de la respuesta, pero la funcionalidad es limitada.(ver más abajo)
InformationsquelleAutor user1788175 | 2012-12-28

3 Comentarios

  1. 2

    Si quieres Ellipse() para dibujar un círculo perfecto que usted necesita para darle coordenadas para una perfecta forma cuadrada, no una forma rectangular.

    Suponiendo x1,y1 están las coordenadas de inicio del arrastre y x2,y2 son las coordenadas del ratón, a continuación, intente esto:

    //Shape Coordinates
    temp_shape.left = min(x1, x2);
    temp_shape.top = min(y1, y2);
    temp_shape.right = max(x1, x2);
    temp_shape.bottom = max(y1, y2);
    ...
    if (drawCircle)
    {
    int length = min(abs(x2-x1), abs(y2-y1));
    if (x2 < x1)
    temp_shape.left = temp_shape.right - length;
    else
    temp_shape.right = temp_shape.left + length;
    if (y2 < y1)
    temp_shape.top = temp_shape.bottom - length;
    else
    temp_shape.bottom = temp_shape.top + length;
    Ellipse(backbuffDC, temp_shape.left, temp_shape.top, temp_shape.right, temp_shape.bottom);
    }
    • Gracias esto funciona, PERO no funciona si el ratón se arrastra desde la parte inferior izquierda a la superior derecha o en la parte superior derecha a la inferior izquierda. Nada que ver con positivos/negativos?
    • Usted tendrá que mantener un seguimiento de las coordenadas de inicio del arrastre de modo que usted puede averiguar qué rincón de temp_shape usted necesita para ajustar el dibujo de coordenadas relativas.
    • He actualizado mi respuesta con algunos de los más cálculos.
    • He añadido una respuesta en la que funciona mejor. Gracias Remy
  2. 1

    He trabajado a cabo un cálculo que funciona mejor. Pegar a continuación para alguien más desean las mismas.

    if(drawSquare)
    {
    int xdiff = abs(x2-x1);
    int ydiff=abs(y2-y1);
    if(xdiff>ydiff)
    {
    if(y2>y1)
    temp_shape.bottom=y1+xdiff;
    else
    temp_shape.bottom=y1-xdiff;
    }
    else
    {
    if(x2>x1)
    temp_shape.right=x1+ydiff;
    else
    temp_shape.right=x1-ydiff;
    }
    Rectangle(backbuffDC, temp_shape.left, temp_shape.top, temp_shape.right, temp_shape.bottom);
    }
  3. -2

    Su código es innecesariamente complejo con temp países en desarrollo y los búferes de nuevo y se vuelve a crear GDI pinceles en cada WM_PAIT? Pero es que además el punto. Aquí está la pregunta: ¿por qué haces esto:

    temp_shape.right=y1+(x2-x1);  //basing horizontal coordinate on vertical?

    Qué marco de pila se esta en la parte superior de? .NET, entonces ¿por qué no uso integrado de doble búfer?

    • Gracias, lo siento por la complejidad. No estoy autorizado para utilizar el construido-en el doble búfer. Me imagino a un cálculo que podría ser necesaria no adecuada para obtener un círculo y actualmente estoy trabajando que el cálculo fuera. Este fue uno de los ensayos.

Dejar respuesta

Please enter your comment!
Please enter your name here