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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2022, 08:02   #41
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

И ещё с теми координатами, о которых ты писал, rcArc.left... вообще-то даже толком не прорисовывается фигура эллипса, если набирать так:
Код:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	static int cxClient, cyClient, cxEllipse, cyEllipse;
	static HPEN hPen[2];  //Перо первое для созданного пера, второе для старого пера
	static HBRUSH hBrush[2]; //Тоже самое для кисти.
	switch (msg)
	{
	case WM_SIZE:
	{
		cxClient = LOWORD(lParam);
		cyClient = HIWORD(lParam);
		cxEllipse = (int)(cxClient * 0.25);

		return 0;
	}
	case WM_PAINT:
	{
		PAINTSTRUCT ps;
		HDC hdc = BeginPaint(hwnd, &ps);

		RECT rcArc;
		int cxHalfClient = (cxClient >> 1);
		int cyHalfClient = (cyClient >> 1);

		int cxHalfEllipse = (cxEllipse >> 1);
		SetRect(&rcArc, cxHalfClient - cxHalfEllipse,
			cyHalfClient - 100,
			cxHalfClient + cxHalfEllipse,
			cyHalfClient + 100);
		cyEllipse = rcArc.bottom - rcArc.top;

		POINT pCenter = { ((rcArc.left + rcArc.right) >> 1),
						 ((rcArc.top + rcArc.bottom) >> 1)
		};
		
		int x0 = pCenter.x + (int)round(0.5 * cxEllipse); //Если pCenter, то хотя бы рисует.
		int y0 = pCenter.y;
		for (int i = 0; i < 3; ++i)
		{
			hPen[0] = CreatePen(PS_SOLID, 1, iColor[i]);
			hBrush[0] = CreateSolidBrush(iColor[i]);
			hPen[1] = (HPEN)SelectObject(hdc, hPen[0]);
			hBrush[1] = (HBRUSH)SelectObject(hdc, hBrush[0]);
			int x = pCenter.x + round(0.5 * cxEllipse * cos(2 * PI * dRate[i+1]));
			int y = pCenter.y - round(0.5 * cyEllipse * sin(2 * PI * dRate[i+1]));

			Arc(hdc, rcArc.left, rcArc.top, rcArc.right, rcArc.bottom, x0, y0, x, y);
			MoveToEx(hdc, pCenter.x, pCenter.y, NULL);
			LineTo(hdc, x, y);

			MoveToEx(hdc, pCenter.x, pCenter.y, NULL);
			LineTo(hdc, x0, y0);

			/*FloodFill(hdc, (pCenter.x + x + x0) / 3,
			                 (pCenter.y + y + y0) / 3,
				             iColor[i]);*/

			x0 = x;
			y0 = y;
			x = pCenter.x + round(0.5 * cxEllipse * cos(2 * PI * (dRate[i + 1]) / 2));
			y = pCenter.y - round(0.6 * cyEllipse * sin(2 * PI * (dRate[i + 1]) / 2));

			TextOut(hdc, x, y, szSizer[i], 4);
		}

		//--------------------------------
		SelectObject(hdc, hPen[1]);
		SelectObject(hdc, hBrush[1]);
		DeleteObject(hBrush[0]);
		DeleteObject(hPen[0]);
		EndPaint(hwnd, &ps);
		return 0;
	}
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, msg, wParam, lParam);
}
то рисуется эллипс, сегменты, но проблема с выводом текстовых обозначений, и закрашивание отдельных сегментов.
apofioz вне форума Ответить с цитированием
Старый 13.10.2022, 08:13   #42
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Сначала проверьте точки, которые вы закрашиваете. Вместо
Код:
/*FloodFill(hdc, (pCenter.x + x + x0) / 3,
			                 (pCenter.y + y + y0) / 3,
				             iColor[i]);*/
Ставите
Код:
x = (pCenter.x + x + x0) / 3;
y = (pCenter.y + y + y0) / 3;
Rectangle(hdc, x-2,y-2, x+2, y+2);
Эти прямоугольники должны быть внутри сегментов.
Если это так, тогда можно закрашивать. Если какой-то прямоугольник попадает на границу или вне сегмента, тогда придумайте другую формулу точек для закрашивания.
macomics вне форума Ответить с цитированием
Старый 13.10.2022, 11:35   #43
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Если какой-то прямоугольник попадает на границу или вне сегмента, тогда придумайте другую формулу точек для закрашивания.
Не придумывается ничего путёвого, но вот результат, все прямоугольники в своих сегментах, а зелёный сегмент закрашивает всё окно.
Изображения
Тип файла: png Окно1.png (2.3 Кб, 13 просмотров)
apofioz вне форума Ответить с цитированием
Старый 13.10.2022, 11:36   #44
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Функция, конечно, полное гэ... столько сил и нервов, а результат нуль(
Pie - работает!

А как ты думаешь, что может означать строка из такого условия: "Разработать окно перелистывания таблицы"?

Последний раз редактировалось apofioz; 13.10.2022 в 13:53.
apofioz вне форума Ответить с цитированием
Старый 13.10.2022, 19:35   #45
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Набор ячеек и скроллбар, который их перемещает.
macomics вне форума Ответить с цитированием
Старый 14.10.2022, 04:01   #46
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Набор ячеек и скроллбар, который их перемещает.
Как-то не однозначно перемещает по вертикали или горизонтали?
apofioz вне форума Ответить с цитированием
Старый 14.10.2022, 05:57   #47
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Как-то не однозначно перемещает по вертикали или горизонтали?
И так и так. Два скролла добавить ничего не мешает.
macomics вне форума Ответить с цитированием
Старый 14.10.2022, 10:01   #48
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
И так и так. Два скролла добавить ничего не мешает.
И да и нет, в том смысле, что тогда задача усложняется) Нужно не тупо изобразить что-то напоминающее таблицу, нужно создать заголовок и первым столбцом должны идти номера строк, и заголовок столбцов всегда должен отображаться, и номера строк, если "листать" по вертикали, как заранее вычислить размер этого столбца чтобы в него вошло самое большое число. И какой максимум устанавливать(сколько следует "перелистнуть"), всё равно границы должны быть, я прав?
apofioz вне форума Ответить с цитированием
Старый 14.10.2022, 10:07   #49
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Хотелось бы спросить о SetWindowPos почему то, когда я хочу изменить размер окна, для того чтобы ровно влезали все столбцы и строки, то окно минимизируется и становиться недоступным, такое ощущение, что при каждом сообщении wm_paint, а именно в нём я его изменяю, точнее вызываю функцию, которая вычисляет размеры строк и столбцов, а так же сколько строк и столбцов помещается в окно, так вот при каждом посещении блока wm_paint окно становится всё меньше и меньше.
apofioz вне форума Ответить с цитированием
Старый 14.10.2022, 14:19   #50
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
всё равно границы должны быть, я прав?
Да. Сами выберите.

Цитата:
Сообщение от apofioz Посмотреть сообщение
Хотелось бы спросить о SetWindowPos почему то, когда я хочу изменить размер окна, для того чтобы ровно влезали все столбцы и строки, то окно минимизируется и становиться недоступным, такое ощущение, что при каждом сообщении wm_paint, а именно в нём я его изменяю, точнее вызываю функцию, которая вычисляет размеры строк и столбцов, а так же сколько строк и столбцов помещается в окно, так вот при каждом посещении блока wm_paint окно становится всё меньше и меньше.
Наверное вы забыли учесть размеры рамки. Для функции SetWindowPos надо передавать размеры окна с учетом рамки.
macomics вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нарисовать круговую диаграмму Proskurina Паскаль, Turbo Pascal, PascalABC.NET 2 08.11.2012 08:50
Нарисовать столбиковую диаграмму по результатам сдачи экзамена по матану Proskurina Паскаль, Turbo Pascal, PascalABC.NET 8 07.11.2012 23:14
Нарисовать столбиковую диаграмму Proskurina Помощь студентам 2 24.10.2012 13:40
Нарисовать диаграмму сравнения методов Gebbellz Помощь студентам 0 15.12.2010 17:52
нарисовать круговую диаграмму в паскале vbchristy46 Помощь студентам 2 28.06.2010 20:33