Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/16: Рейтинг темы: голосов - 16, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49

GDI. Draw mode

04.05.2012, 19:37. Показов 3321. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В приложении MDI на MFC во View имеются геометрические фигуры, которые можно перетаскивать. они могут быть разных цветов. Использую Draw mode - NOTXORPEN, для того чтобы фигуры нормально отображались при перетаскивании, то есть не оставляли полос, не меняли цвет и т.д. Так вот у меня возникает такая ситуация, что фигуры могут пересекаться и тогда данный режим не работает, потому что фоновый цвет пиксела совпадает с цветом Pen (например, две линии накладываются друг на друга). Подскажите хороший способ, чтобы как-то обойти эту ситуацию.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.05.2012, 19:37
Ответы с готовыми решениями:

Можно ли отрисовывать массив, передав его, как параметр в функцию draw, в glutDisplayFunc(draw);?
В рамках курсовой работы у меня появилось задание написать игру "Жизнь" с консольным меню, и визуализацией opengl. Опираясь на мои...

Есть ли в WPF полноценная замена GDI+? Чтобы можно было всё, что можно в GDI+? Просто думаю углубляться в работу с изображениями в WPF или GDI.
Ну собственно весь вопрос в заголовке темы.

АЦП в Auto Trigger mode от таймера в CTC mode (atmega644)
Задача: прочитать данные с АЦП когда счетчик таймера совпадет со значением в регистре сравнения. Реализация: Таймер: void tmInit(){ ...

22
Модератор
Эксперт по электронике
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
Цитата Сообщение от sam1r Посмотреть сообщение
не. все-таки нельзя такой способ использовать
Почему???
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
Цитата Сообщение от sam1r Посмотреть сообщение
Вообще можно, но преподаватель сказал, что такой способ в задаче нельзя использовать
А ты скажи преподавателю что контекст рисования тоже битовая плоскость
и значит
Цитата Сообщение от sam1r Посмотреть сообщение
битовые карты использовать нельзя
рисовать нигде нельзя
самый простой вариант стирай перед рисованием
может он(препод)тебя тянет на использование 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
Цитата Сообщение от sam1r Посмотреть сообщение
Дело в том, что если использовать двойную буферизацию, то сложнее сделать масштабирование
с какого перепугу???
ты просто рисуешь не на экране а в памяти
потом копируешь на экран
и никаких мельканий

кстати
BitBlt поддерживает масштабирование

Добавлено через 1 минуту
дай свой код
я тебе покажу как сделать чтобы не мелькало
0
0 / 0 / 0
Регистрация: 05.03.2012
Сообщений: 49
06.05.2012, 00:46  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void CMFCEdView::ElementMove(CDC* pDC, CBaseElement* pa, CPoint cp)
{
   pDC->SetROP2(R2_NOTXORPEN);
 
    for (int i=0; i<pa->countConnects; i++)
    {
        pa->arrayConnects[i]->Draw(pDC);
    }
        pa->Draw(pDC);
    pa->SetRect(CRect(cp,pa->GetRectSz()));
    pa->Draw(pDC);
    for (int i=0; i<pa->countConnects; i++)
        pa->arrayConnects[i]->Draw(pDC);
    this->ReleaseDC(pDC);
}
В этом методе происходит перемещение объекта и перемещение стрелок, связывающих разные элементы. Для каждого объекта свой класс и свой виртуальный метод Draw в этом классе.
ArrayConnects - массив указателей на объект, представляющий соединение данного элемента с другими.
Тут много кода. какой конкретно метод вам нужен?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
06.05.2012, 01:05
Цитата Сообщение от sam1r Посмотреть сообщение
CMFCEdView::ElementMove
надеюсь вызывается из OnDraw?
что делает
Цитата Сообщение от sam1r Посмотреть сообщение
pa->Draw(pDC);
и
Цитата Сообщение от sam1r Посмотреть сообщение
pa->SetRect(CRect(cp,pa->GetRectSz()));
первый цикл для стирания второй для прорисовки?
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
Цитата Сообщение от sam1r Посмотреть сообщение
Вызывается из MouseMove.
нельзя так делать подумай что будет если твое окно перекроет другое окно? потеряешь фокус?
MouseMove подсчитывай размеры(координаты или что там у тебя)
и вызывай Invalidate а рисовать только в OnDraw(он для этого и предназначен)
Цитата Сообщение от sam1r Посмотреть сообщение
pa->Draw(pDC) для каждого элемента.
и это
Цитата Сообщение от sam1r Посмотреть сообщение
pa->arrayConnects[i]->Draw(pDC);
это же разные вещи

Цитата Сообщение от sam1r Посмотреть сообщение
где pa - указатель на базовый класс. У базового класса много производных, которые и представляют отрисовываемые элементы.
ни чего не понял

Цитата Сообщение от sam1r Посмотреть сообщение
pa->arrayConnects[i]
Вот это производные ???
или что это за массив?
Цитата Сообщение от sam1r Посмотреть сообщение
CBaseElement* pa,
ты в
Цитата Сообщение от sam1r Посмотреть сообщение
oid CMFCEdView::ElementMove
каждый раз другой посылаешь?

Цитата Сообщение от sam1r Посмотреть сообщение
pa->SetRect(CRect(cp,pa->GetRectSz()));
типа новый размер задаешь?
скинь полный проект
завтра покумекаю а то вопросов больше чем......
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
Цитата Сообщение от sam1r Посмотреть сообщение
Если я каждый раз буду вызывать Invalidate
а для этого есть InvalidateRect делает недействительным конкретный прямоугольник
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.05.2012, 12:53
Помогаю со студенческими работами здесь

IIS Cache - Kernel mode and User mode - чем отличаются, что представляют из себя?
Не могу найти толкового описания Kernel mode and User mode cache. Во-первых, чтобы лучше обрисовать в своем воображении: 1) где они...

Not optimum mode. Recommended Mode: 1280х1024 60Hz
Недавно помер старый монитор. Сегодня притарабанил новый поставил картинка появилась с эти все норм. Т.к. новый несколько больше(где то...

Послать сообщение kernel mode -> user mode
Здравствуйте. В процессе разработки драйвера столкнулся с необходимостью посылать события/сообщения из kernel mode в user mode (из драйвера...

Как отключить ac mode\battery mode?
Думаю, многие сталкивались с этим мигающим синим окошком (хоть бы в углу оно мигало - нет, по центру...). По Интернету вижу лишь советы...

Fullscreen mode to Windowed Mode
Приветствую! Нужна функция с помощью которой можно перевести приложение из режима Fullscreen в режим Windowed На MSDN много...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru