|
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49
|
|
GDI. Draw mode04.05.2012, 19:37. Показов 3321. Ответов 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) |
|
Модератор
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
|
|
| 04.05.2012, 21:36 | |
|
двойная буферизация
рисуешь в памяти потом копируешь на экран
0
|
|
|
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49
|
|
| 04.05.2012, 21:53 [ТС] | |
|
а не используя такой способ, можно сделать?
0
|
|
|
Модератор
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
|
|
| 04.05.2012, 22:32 | |
|
нет!
для того чтобы фигуры не оставляли следы тебе придется стирать изображение, значит получишь мелькание. А при двойной буферизации ты от этого избавляешься есть еще способ рисовать при помощи XOR рисуешь один раз инвертируются пикселы фона рисуешь второй возвращаются (стирается фигура) но там должен помнить предыдущие координаты если несколько раз рисуется по одному месту(например звезда) то пропадают пикселы да и несколько фигур сложновато сделать
0
|
|
|
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49
|
|
| 04.05.2012, 23:03 [ТС] | |
|
Так я с помощью XOR и делаю, а битовые карты использовать нельзя
0
|
|
|
Модератор
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
|
|
| 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
|
|
|
Модератор
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
|
|
| 05.05.2012, 05:39 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49
|
|
| 05.05.2012, 23:24 [ТС] | |
|
Вообще можно, но преподаватель сказал, что такой способ в задаче нельзя использовать
0
|
|
|
Модератор
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
|
|||
| 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
|
|
|
Модератор
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
|
||
| 06.05.2012, 00:40 | ||
|
ты просто рисуешь не на экране а в памяти потом копируешь на экран и никаких мельканий кстати BitBlt поддерживает масштабирование Добавлено через 1 минуту дай свой код я тебе покажу как сделать чтобы не мелькало
0
|
||
|
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49
|
||||||
| 06.05.2012, 00:46 [ТС] | ||||||
ArrayConnects - массив указателей на объект, представляющий соединение данного элемента с другими. Тут много кода. какой конкретно метод вам нужен?
0
|
||||||
|
Модератор
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
|
||||
| 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
|
|
|
Модератор
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
|
|||||||||
| 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
|
|
|
Модератор
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
|
|
| 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|