Member 12677926 Ответов: 1

Опираясь на рук нарисовать картину управления


я конвертирую свой код из vb в c++, есть несколько динамических точек, которые используются для рисования различных фигур.

в vb они имеют такие свойства, как .ScaleWidth, .ScaleHeight , .ScaleTop,. ScaleLeft.

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


но в mfc у меня есть все необходимые входные точки, но когда я рисую, я не могу рисовать правильно или правильно. пожалуйста, помогите мне, я не в состоянии правильно масштабировать, пожалуйста, помогите мне.

Что я уже пробовал:

void CPDlgToolPreview::S_SetDrawingScale()
{
	short i;
	float lnMaxX;
	float lnMaxY;
	float lnMinX;
	float lnMinY;
	const int BigNumber = 1000000000;
	float lnWidth;
	float lnHeight;

	lnMaxX = (float)(-BigNumber);
	lnMaxY = (float)(-BigNumber);
	lnMinX = (float)(BigNumber);
	lnMinY = (float)(BigNumber);

	for (i = 0; i < mlPoints; i++) 
	{
		if (moPts[i].X > lnMaxX) lnMaxX = (float)(moPts[i].X);
		if (moPts[i].Y > lnMaxY) lnMaxY = (float)(moPts[i].Y);
		if (moPts[i].X < lnMinX) lnMinX = (float)(moPts[i].X);
		if (moPts[i].Y < lnMinY) lnMinY = (float)(moPts[i].Y);
	}

	lnWidth = lnMaxX - lnMinX;
	lnHeight = lnMaxY - lnMinY;

	CRect cRect;
	m_cPreview.GetClientRect(&cRect);
	

	if ( lnWidth / cRect.Width() > lnHeight / cRect.Height() )
	{
		// Scale according to items width	
		nScaleWidth = lnWidth*1.2;
		nScaleHeight = cRect.Height() *nScaleWidth / cRect.Width();
	}
	else
	{
		// Scale according to items height
		 nScaleHeight = lnHeight*1.2;
		 nScaleWidth = cRect.Width() *nScaleHeight / cRect.Height();
	}

	nScaleleft = -nScaleWidth / 2;
	nScaletop = -((nScaleHeight - lnHeight) / 2) - lnHeight;

}



for (short i  = 2; i < mlPoints; i++) 
	{
		DrawLine(m_cPreview, moPts[i].X  , moPts[i].Y);
	}


от Void DrawLine(от cwnd *WND, что инт Х1, У1 инт, инт Х2, У2 инт, инт РГБ)
{
CDC *cdc = wnd- & gt;GetDC();
CPen *oldPen = cdc- & gt;SelectObject(new CPen(0, 3, rgb));
cdc- & gt;MoveTo(x1, y1);
cdc- & gt;LineTo(nCurrentx = x2, currenty= y2);
удалить (CPen *)cdc- & gt;SelectObject(oldPen);
wnd - & gt;ReleaseDC(cdc);
}

где использовать эти scaleleft, nScaleHeight и т. д., Чтобы получить правильную форму.

1 Ответов

Рейтинг:
1

KarstenK

С C++ и MFC у вас есть власть и ответственность за то, чтобы нарисовать каждый пиксель для себя. Для этого вы должны масштабировать то, что хотите нарисовать в прямоугольнике чертежа.

Есть два пути:

1. масштабируйте координаты содержимого перед их рисованием (рекомендуется для вашей линии рисования)
2. Нарисуйте автономное растровое изображение и масштабируйте его в прямоугольник чертежа.

Полезной функцией является Передача битового блока нарисовать масштабированное растровое изображение за какой-то шаг.

При масштабировании графического использования один фактор, если вы используете два, может быть разным и искажать изображение. Позаботьтесь о том, чтобы все деления были сделаны как плавающие, а не как плавающие. неявное преобразование типов это вредит результатам.


Member 12677926

спасибо за ответ. пожалуйста, у вас есть какой-нибудь пример ....

Member 12677926

вы хотите сказать, что сохраните растровое изображение и загрузите его снова ?

Member 12677926

не могли бы вы помочь мне с образцом ... пожалуйста