Win32 GDI Рисуем круг?

Я пытаюсь нарисовать круг, и в настоящее время я использую функцию Ellipse ().

У меня есть начальные координаты мыши — x1 и y1 и конечные координаты x2 и y2. Как видите, я заставляю y2 (temp_shape.bottom) быть = y1 + (x2-x1). Это не работает как задумано. Я знаю, что расчет абсолютно неверен, но есть идеи о том, что правильно?

Код ниже.

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;

4

Решение

Если ты хочешь Ellipse() Чтобы нарисовать идеально круглый круг, вам нужно дать ему координаты для идеально квадратной формы, а не прямоугольной формы.

Если предположить, x1,y1 начальные координаты перетаскивания и x2,y2 текущие координаты мыши, затем попробуйте это:

//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);
}
2

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

Я разработал расчет, который работает лучше. Вставлено ниже для тех, кто хочет того же.

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

Ваш код излишне сложен с временными DC и обратными буферами, и вы воссоздаете GDI-кисти в каждом WM_PAIT? Но это не главное. Вот вопрос: почему вы это делаете:

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

Какой фреймворк это поверх? .NET, тогда почему бы вам не использовать встроенную двойную буферизацию?

-2
По вопросам рекламы [email protected]