Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2022, 13:54   #1
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию Функции изменения режима отображения.

Здравствуйте! Думал, что понял, но, как оказалось нет, связано это непонимание с функциями изменения режима отображения. Если я хочу изменить режим отображения на MM_ISOTROPIC например,

Я пишу следующее:
Код:
SetMapMode(hdc, MM_ISOTROPIC);
		SetWindowExtEx(hdc, cxClient, -cyClient, NULL);
		SetViewportExtEx(hdc, radius, radius, NULL);
		SetViewportOrgEx(hdc, cxOrig, cyOrig, NULL);
Устанавливаю координаты (0, 0) на середину окна cxOrig, cyOrig, хочу нарисовать группу эллипсов radius - радиус, cxClient, cyClient - рабочая область окна.
1)Если вместо SetViewportOrgEx(hdc, cxOrig, cyOrig, NULL); вызвать функцию SetWindowOrgEx(hdc, cxOrig, cyOrig, NULL); то в окне вообще ничего не рисуется, почему?

2)Если я хочу рисовать в цикле, скажем, 10 кругов, то установив режим отображения как указано выше у меня рисуется один круг, почем так
вот код:
Код:
case WM_PAINT:
	{
		PAINTSTRUCT ps;
		HDC hdc = BeginPaint(hwnd, &ps);

		int cxOrig = (cxClient >> 1);
		int cyOrig = (cyClient >> 1);

		SetMapMode(hdc, MM_ISOTROPIC);
		SetWindowExtEx(hdc, cxClient, -cyClient, NULL);
		SetViewportExtEx(hdc, radius, radius, NULL);
		SetViewportOrgEx(hdc, cxOrig, cyOrig, NULL);

		int scaling = radius;
		for (int i = 0; i < 10; ++i)
		{
			/*hBrush = CreateSolidBrush(RGB((BYTE)rand() % 255,
				                          (BYTE)rand() % 255, 
				                          (BYTE)rand() % 255));*/

			//hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);

			hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
			hOldPen = (HPEN)SelectObject(hdc, hPen);
				
			Ellipse(hdc, -radius, -radius,
				          radius, radius);
			//приращение радиуса, рассчитывал, что таким образом
			//удастся получить координаты для следующего круга.
			radius += scaling;

			SelectObject(hdc, hOldPen);
			DeleteObject(hPen);
			//SelectObject(hdc, hOldBrush);
			//DeleteObject(hBrush);
			hPen = hOldPen = NULL;
			hBrush = hOldBrush = NULL;
		}
		EndPaint(hwnd, &ps);
		return 0;
	}
Не ясно почему выводится только один круг.

Если я вызываю функцию SetWindowExtEx(hdc, cxClient, -cyClient, NULL);, то таким образом я задаю некий прямоугольник/квадрат с которым, в дальнейшем будет вестись работа или нет?

А если, соответственно, вызвать функцию SetViewportExtEx(hdc, radius, radius, NULL);, то это значит, что я задаю некий масштаб отображения, единицы вроде тех, что используются в MM_LOENGLISH... или нет?

Хотелось бы разобраться в этой теме.
apofioz вне форума Ответить с цитированием
Старый 05.11.2022, 14:35   #2
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

c*cos(x);
x = от 0 до 10 PI.
с - Не равен нуль.
Нужно нарисовать график. Хочу спросить я правильно вычисляю?
Код:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	static int cxClient, cyClient, cxChar, cyChar;
	static const int c = 25;
	HPEN hPen, hOldPen;
	static FUNC f;

	switch (msg)
	{
	case WM_CREATE:
	{
		TEXTMETRIC tm;
		HDC hdc = GetDC(hwnd);
		GetTextMetrics(hdc, &tm);
		ReleaseDC(hwnd, hdc);
		cxChar = tm.tmAveCharWidth;
		cyChar = tm.tmHeight + tm.tmExternalLeading;

		double PI10 = (10.0 * M_PI) / 100;
		TCHAR szFName[16];
		_stprintf_s(szFName, 16, TEXT("%d"), c);
		_tcscat_s(szFName, 16, TEXT("*cos(x)"));
		_tcscpy_s(f.FuncName, 16, szFName);

		for (int i = 0; i < 100; ++i)
		{
			f.x[i] = PI10 * i;
			f.y[i] = c * cos(f.x[i]);
		}
		return 0;
	}
	case WM_SIZE:
		cxClient = LOWORD(lParam);
		cyClient = HIWORD(lParam);
		return 0;
	case WM_PAINT:
	{
		PAINTSTRUCT ps;
		HDC hdc = BeginPaint(hwnd, &ps);
		hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
		hOldPen = (HPEN)SelectObject(hdc, hPen);

		int cxMiddle = (cxClient >> 1);
		int cyMiddle = (cyClient >> 1);
		int cxLeft = 10;
		int cxRight = cxClient - cxLeft;
		int cyTop = 10;
		int cyBottom = cyClient - cyTop;
		int amp = cyMiddle - cyTop;
		double nMin = 0.0, nMax = 0.0;

		int WidthArrow = static_cast<int>(((cxRight - cxMiddle) * 0.1));
		int HeightArrow = (WidthArrow >> 1);

		DrawLine(hdc, cxLeft, cyMiddle, cxRight, cyMiddle);
		RECT rcArrow;
		SetRect(&rcArrow, cxRight - 30, cyMiddle - 15, cxRight, cyMiddle);

		POINT ptCenterArrow = { rcArrow.left + ((rcArrow.right - rcArrow.left) / 2),
								rcArrow.top + ((rcArrow.bottom - rcArrow.top) / 2) };

		DrawAxisX(hdc, rcArrow, ptCenterArrow);
		/*int x0 = ptCenterArrow.x + (int)round(0.5 * (rcArrow.right - rcArrow.left) * cos(180));
		int y0 = ptCenterArrow.y;

		int x = ptCenterArrow.x;
		int y = ptCenterArrow.y - (int)round(0.5 * (rcArrow.bottom - rcArrow.top) * sin(270));

		Arc(hdc, rcArrow.left, rcArrow.top, rcArrow.right, rcArrow.bottom,
			x0, y0, x, y);*/

		//rcArrow.top = cyMiddle;
		//rcArrow.bottom = cyMiddle + 8;
		//x = x0;
		//y = y0;

		//rcArrow.top = cyMiddle;
		//rcArrow.bottom = cyMiddle + 15;

		//ptCenterArrow.y = cyMiddle + ((rcArrow.bottom - rcArrow.top) / 2);
		//x = rcArrow.left;
		//y = rcArrow.top + (rcArrow.bottom - rcArrow.top);

		//x = ptCenterArrow.x + (int)round(0.5 * (rcArrow.right - rcArrow.left) * cos(180));
		//y = ptCenterArrow.y/* - (int)round(0.5 * (rcArrow.bottom - rcArrow.top) * sin(180))*/;

		//Arc(hdc, rcArrow.left, rcArrow.top, 
		//	     rcArrow.right, rcArrow.bottom,
		//	x0, y0, x, y);

		

		SetRect(&rcArrow, cxMiddle - 15, cyTop, cxMiddle, cyTop + 30);
		
		ptCenterArrow.x = rcArrow.left + ((rcArrow.right - rcArrow.left) / 2);
		ptCenterArrow.y = cyTop + ((rcArrow.bottom - rcArrow.top) / 2);

		DrawAxisY(hdc, rcArrow, ptCenterArrow);

		//-------------------------------- Axis y ----------
		DrawLine(hdc, cxMiddle, cyTop, cxMiddle, cyBottom);

		TextOut(hdc, cxMiddle - cxChar - 4,
			cyMiddle + (cyChar >> 1),
			TEXT("0"), 1);
		TextOut(hdc, cxMiddle + cxChar,
			cyTop,
			TEXT("Y"), 1);
		TextOut(hdc, cxRight - cxChar,
			cyMiddle + (cyChar >> 1),
			TEXT("X"), 1);

		TextOut(hdc, cxLeft, cyMiddle - 3 * cyChar / 2, f.FuncName, _tcslen(f.FuncName));

		SelectObject(hdc, hOldPen);
		DeleteObject(hPen);

		//-------------------------------------------------
		hPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 255));
		hOldPen = (HPEN)SelectObject(hdc, hPen);

		for (int i = 0; i < 100; ++i)
		{
			double curr = f.y[i];
			if (curr > nMax)
				nMax = curr;
			if (curr < nMin)
				nMin = curr;
		}
		if (nMax < abs(nMin))
			nMax = abs(nMin);

		double dy = (double)amp / nMax;
		double dx = (double)(cxRight - cxLeft) / (f.x[99] - f.x[0]);

		MoveToEx(hdc, cxLeft, (int)(cyMiddle - dy * f.y[0]), NULL);
		for (int i = 0; i < 100; ++i)
		{
			int xcurr = (int)(dx * (f.x[i] - f.x[0]) + cxLeft),
				ycurr = (int)(cyMiddle - dy * f.y[i]);
			LineTo(hdc, xcurr, ycurr);
		}

		SelectObject(hdc, hOldPen);
		DeleteObject(hPen);
		EndPaint(hwnd, &ps);
		return 0;
	}
	case WM_DESTROY:
	{
		PostQuitMessage(0);
		return 0;
	}
	}
	return DefWindowProc(hwnd, msg, wParam, lParam);
}
apofioz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отслеживание изменения TabIndex/нажатия на TAB/изменения фокуса bug6479 C# (си шарп) 0 26.04.2018 00:54
как процедуру идля текстового режима переделать для графического режима sanchoys Паскаль, Turbo Pascal, PascalABC.NET 4 29.05.2013 20:44
16. Нарисовать точечный график функции . Диапазон изменения аргумента: от 15 до 5, шаг аргумента – 0,1. dzuga Паскаль, Turbo Pascal, PascalABC.NET 1 09.06.2010 06:12
существуют ли какие нибудь функции или процедуры которые сохраняют изменения на форме? street-walker Общие вопросы Delphi 5 04.05.2010 22:49
Вычислить значение функции Y=F(x) для аргумента x, изменяющегося от xн до xк с шагом изменения Hx. dr.Chas Общие вопросы по программированию, компьютерный форум 1 12.12.2008 13:58