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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2019, 08:48   #1
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию Окружность хитро-красного цвета

Есть окно, в нём уже что-то нарисовано. Требуется поверх этого рисунка нарисовать окружность. Но не просто одним из цветов, а хитро: каждый пиксел линии окружности должен получить цвет, в котором будут инвертированы зелёный и синий компоненты цвета. Белый – это RGB(255, 255, 255), по белому окружность должна рисоваться цветом RGB(255, 0, 0), то есть красным. Чёрный – это RGB(0, 0, 0), по чёрному окружность должна рисоваться цветом RGB(0, 255, 255), то есть голубым. Жёлтый – это RGB(255, 255, 0), по жёлтому окружность должна рисоваться цветом RGB(255, 0. 255), то есть магентой. И так далее. То есть если исходный цвет пиксела RGB(R, G, B) и пиксел принадлежит линии, то он должен получить цвет RGB(R, 255-G, 255-B). Известно, что R, G и B принимают только значения 0 и 255. Пикселы, не принадлежащие линии, должны сохранить свои цвета.

Последний раз редактировалось taras-proger77; 29.04.2019 в 11:01.
taras-proger77 вне форума Ответить с цитированием
Старый 29.04.2019, 10:41   #2
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Код:
MemoryContext=CreateCompatibleDC(DeviceContext);
 if (MemoryContext!=NULL)
 {
  SetMapMode(MemoryContext, MM_HIMETRIC);
  SetViewportOrgEx(MemoryContext, 0, 0, NULL);
  BlackBrush=CreateSolidBrush(RGB(0, 0, 0));
  BlackPenForTemporyImage=CreatePen(PS_SOLID,  0, RGB(0,   0,   0));
  RedPenForTemporyImage  =CreatePen(PS_SOLID, 50, RGB(0, 255, 255));
  SelectObject(MemoryContext, BlackBrush);
  SelectObject(MemoryContext, BlackPenForTemporyImage);
  Diametr=Size*sqrt(2.0)*Scale*100.0;
  Radius =Size/sqrt(2.0);
  ::Rectangle(MemoryContext, 0, 0, (LONG)Diametr, (LONG)(-Diametr));
  SelectObject(MemoryContext, RedPenForTemporyImage);
  Ellipse(MemoryContext, 0, 0, (LONG)Diametr, (LONG)(-Diametr));
  x=2.5;
  y=2.5;
  Left=(X0+(x*Size-Radius))*Scale*100.0;
  Top =(Y0-(y*Size+Radius))*Scale*100.0;
  BitBlt(DeviceContext, (LONG)Left, (LONG)Right, (LONG)Diametr, (LONG)(-Diametr), MemoryContext, 0, 0, SRCINVERT);
  DeleteObject(BlackPenForTemporyImage);
  DeleteObject(BlackPenForTemporyImage);
  DeleteObject(RedPenForTemporyImage);
  DeleteDC(MemoryContext);
 }
не рисует вообще ничего, просто остаётся старый рисунок, поверх которого должна быть окружность, но поверх него ничего дополнительно не рисуется. Петзолдт в своей книге пишет, что контекст памяти по умолчанию создаётся размером в 1 пиксел. Логично, что я просто не вижу этого пиксела. Дальше Петзолдт выбирает готовый битмэп в контекст памяти, чтоб увеличить размер контекста. Но он это делает для нужд DrawBitmap, которая и должна нарисовать готовый битпэп, загруженный LoadBitmap. Мне же надо нарисовать окружность размера, заданного пользователем. Да ещё и заданного в миллиметрах, а не в пикселах. Так что даже если я нарисую битмэп, он никак не поможет вычилять требуемый размер контекста во время испосполнения и задача решена не будет. А как задать размер контекста памяти в пикселах, не выбирая в него битмэп?

Последний раз редактировалось taras-proger77; 29.04.2019 в 11:01.
taras-proger77 вне форума Ответить с цитированием
Старый 29.04.2019, 13:08   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
А как задать размер контекста памяти в пикселах, не выбирая в него битмэп?
Никак.
waleri вне форума Ответить с цитированием
Старый 30.04.2019, 11:59   #4
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Уже нашёл. Результат не понравился. Пока картинка крупная, выглядит прилично. Мелочь хуже, чем просто красная окружность ещё меньшего радиуса (вписанная в квадрат, вписанный в ту окружность).
taras-proger77 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
арисовать в паскале простую пятиконечную звезду красного цвета il_2_ Паскаль, Turbo Pascal, PascalABC.NET 4 29.04.2014 19:55
Нарисовать набор звёзд разного цвета, центры которых образуют окружность Кротяка C# (си шарп) 2 24.12.2013 03:59
Передвижение красного кружочка стрелками в графике. В чем ошибка? Мики6277 Паскаль, Turbo Pascal, PascalABC.NET 20 10.07.2013 20:44
Рекурсия: Дается длина полоски из клеточек и 3 длины: полосок красного,синего и желтого цвета.Требуется набрать заданную длину MagAragorn Паскаль, Turbo Pascal, PascalABC.NET 14 26.04.2013 15:02
Окружность Murashov Общие вопросы C/C++ 14 01.11.2012 20:44