|
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49
|
|
GDI. Draw mode04.05.2012, 19:37. Показов 3360. Ответов 22
Метки нет (Все метки)
В приложении MDI на MFC во View имеются геометрические фигуры, которые можно перетаскивать. они могут быть разных цветов. Использую Draw mode - NOTXORPEN, для того чтобы фигуры нормально отображались при перетаскивании, то есть не оставляли полос, не меняли цвет и т.д. Так вот у меня возникает такая ситуация, что фигуры могут пересекаться и тогда данный режим не работает, потому что фоновый цвет пиксела совпадает с цветом Pen (например, две линии накладываются друг на друга). Подскажите хороший способ, чтобы как-то обойти эту ситуацию.
0
|
|
| 04.05.2012, 19:37 | |
|
Ответы с готовыми решениями:
22
Можно ли отрисовывать массив, передав его, как параметр в функцию draw, в glutDisplayFunc(draw);? Есть ли в WPF полноценная замена GDI+? Чтобы можно было всё, что можно в GDI+? Просто думаю углубляться в работу с изображениями в WPF или GDI. АЦП в Auto Trigger mode от таймера в CTC mode (atmega644) |
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
|
|
| 04.05.2012, 21:36 | |
|
двойная буферизация
рисуешь в памяти потом копируешь на экран
0
|
|
|
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49
|
|
| 04.05.2012, 21:53 [ТС] | |
|
а не используя такой способ, можно сделать?
0
|
|
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
|
|
| 04.05.2012, 22:32 | |
|
нет!
для того чтобы фигуры не оставляли следы тебе придется стирать изображение, значит получишь мелькание. А при двойной буферизации ты от этого избавляешься есть еще способ рисовать при помощи XOR рисуешь один раз инвертируются пикселы фона рисуешь второй возвращаются (стирается фигура) но там должен помнить предыдущие координаты если несколько раз рисуется по одному месту(например звезда) то пропадают пикселы да и несколько фигур сложновато сделать
0
|
|
|
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49
|
|
| 04.05.2012, 23:03 [ТС] | |
|
Так я с помощью XOR и делаю, а битовые карты использовать нельзя
0
|
|
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
|
|
| 04.05.2012, 23:09 | |
|
Какие такие битовые карты?
создаешь в памяти контекст для рисования CreateCompatibleDC создаешь в нем совместимую битовую плоскость рисуешь копируешь на экран BitBlt можешь посмотреть в строну DirectDraw(работа с двумя плоскостями) или OpenGL но для такой задачи это по моему лишние навороты
1
|
|
|
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49
|
|
| 05.05.2012, 00:12 [ТС] | |
|
спасибо за такой совет. сейчас попробую. я думал, что при этом используются битовые карты.
Добавлено через 1 минуту так вот битовая плоскость - это же вроде как и есть битовая карта. Добавлено через 55 минут не. все-таки нельзя такой способ использовать
0
|
|
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
|
|
| 05.05.2012, 05:39 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49
|
|
| 05.05.2012, 23:24 [ТС] | |
|
Вообще можно, но преподаватель сказал, что такой способ в задаче нельзя использовать
0
|
|
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
|
|||
| 05.05.2012, 23:48 | |||
и значит самый простой вариант стирай перед рисованием может он(препод)тебя тянет на использование WM_ERASEBKGND http://vsokovikov.narod.ru/New... ebkgnd.htm обработчик http://www.firststeps.ru/mfc/steps/help/r.php?317
0
|
|||
|
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49
|
|
| 06.05.2012, 00:33 [ТС] | |
|
Дело в том, что если использовать двойную буферизацию, то сложнее сделать масштабирование
Добавлено через 4 минуты Пробовал InvalidateRect вызывать в OnMouseMove, но тогда, естественно, сильно мелькает всё
0
|
|
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
|
||
| 06.05.2012, 00:40 | ||
|
ты просто рисуешь не на экране а в памяти потом копируешь на экран и никаких мельканий кстати BitBlt поддерживает масштабирование Добавлено через 1 минуту дай свой код я тебе покажу как сделать чтобы не мелькало
0
|
||
|
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49
|
||||||
| 06.05.2012, 00:46 [ТС] | ||||||
ArrayConnects - массив указателей на объект, представляющий соединение данного элемента с другими. Тут много кода. какой конкретно метод вам нужен?
0
|
||||||
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
|
||||
| 06.05.2012, 01:05 | ||||
|
что делает
0
|
||||
|
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49
|
|
| 06.05.2012, 01:15 [ТС] | |
|
Вызывается из MouseMove. OnDraw вызывает pa->Draw(pDC) для каждого элемента.
pa->Draw(pDC) - это отрисовка определенного элемента схемы, где pa - указатель на базовый класс. У базового класса много производных, которые и представляют отрисовываемые элементы. Да, первый - для стирания, второй - для прорисовки. pa->SetRect(CRect(cp,pa->GetRectSz())); - меняет положение объекта путем изменения координат описанного вокруг него прямоугольника. cp - координаты курсора мыши
0
|
|
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
|
|||||||||
| 06.05.2012, 01:28 | |||||||||
|
MouseMove подсчитывай размеры(координаты или что там у тебя) и вызывай Invalidate а рисовать только в OnDraw(он для этого и предназначен) или что это за массив? скинь полный проект завтра покумекаю а то вопросов больше чем......
0
|
|||||||||
|
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49
|
|
| 06.05.2012, 01:41 [ТС] | |
|
Завтра отвечу на всё это.
Добавлено через 1 минуту Если я каждый раз буду вызывать Invalidate, то у меня же будет перерисовываться весь экран при каждом движении мышкой, а тут я перерисовываю только тот элемент, который у меня движется Добавлено через 5 минут Если кратко, то есть абстрактный класс CBaseElement, от него наследуются классы, которые представляют разные фигуры, функция Draw - виртуальная, она в каждом этом классе есть. Есть еще класс CConnection, который представляет соединение элементов и хранит два указателя на CBaseElement, чтобы идентифицировать, какие элементы он соединяет. ArrayConnects - это массив из класса CBaseElement, который хранит указатели на CConnection, чтобы определить, с какими фигурами соединен тот или иной объект.
0
|
|
|
Модератор
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
|
|
| 06.05.2012, 01:46 | |
|
0
|
|
|
11 / 11 / 1
Регистрация: 26.04.2012
Сообщений: 104
|
|
| 06.05.2012, 23:45 | |
|
Слушай, у меня проблема попроще. Не подскажешь как ты перемещаешь фигуры?
0
|
|
|
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49
|
|
| 07.05.2012, 12:53 [ТС] | |
|
Вот код, что я написал, и реализует перемещение.
Вначале ставим Draw mode таким: pDC->SetROP2(R2_NOTXORPEN); Затем рисуем перемещаемый объект в его старом положении и он, так как поставлен такой draw mode, нарисует его белым цветом, то есть сотрет; потом устанавливаем новое положение объекта, учитывая положение курсора мыши, и снова рисуем на этом контексте. Теперь уже объект будет нарисован его цветом (например, черным).
0
|
|
| 07.05.2012, 12:53 | |
|
Помогаю со студенческими работами здесь
20
Not optimum mode. Recommended Mode: 1280х1024 60Hz
Как отключить ac mode\battery mode? Fullscreen mode to Windowed Mode Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|