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

GDI. Draw mode

04.05.2012, 19:37. Показов 3360. Ответов 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
Модератор
Эксперт по электронике
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
Цитата Сообщение от sam1r Посмотреть сообщение
не. все-таки нельзя такой способ использовать
Почему???
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
Цитата Сообщение от 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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
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
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки 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 с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru