Win32 GDI Drawing a circle?
19,513
Solution 1
I have worked out a calculation which works better. Pasted below for anyone else wanting the same.
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);
}
Solution 2
If you want Ellipse()
to draw a perfectly round circle, you need to give it coordinates for a perfectly square shape, not a rectangular shape.
Assuming x1,y1
are the starting coordinates of the dragging and x2,y2
are the current mouse coordinates, then try this:
//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);
}
Author by
user1788175
Updated on June 29, 2022Comments
-
user1788175 almost 2 years
I am trying to draw a circle and I am currently using the Ellipse() function.
I have the starting mouse coordinates - x1 and y1 and the ending coordinates x2 and y2. As you can see, I am forcing the y2(temp_shape.bottom) to be = y1+(x2-x1). This doesn't work as intended. I know the calculation is completely wrong but any ideas on what is right?
Code Below.
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;