![]() |
|
|
![]()
|
|
| Adry |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 13.4.2011 Репутация: нет Всего: нет |
Здравствуйте, уважаемые эксперты!
У меня есть небольшое приложение MFC, которое должно рисовать графики. И оно как ни удивительно даже это делает.. Рисую функцией OnDrow в СView. В шаблонном фрейме кнопка "Save" присутствует и в меню, и в ТулБаре, но сохраняют они пустой файл. Подскажите, как это делается? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Было бы странно, если бы созданная мастером заготовка функции Save сохраняла что-то разумное.
Если тебе нужна растровая картинка, то это не сложно. Нужно создать совместимый контекст и совместимый битмап, выбрать битмап в контекст и вызывать OnDraw с этим контекстом. НО: нужно подумать о координатах. Если у тебя режим MM_TEXT, то ты получишь картинку в разрешении экрана. Если тебя это устраивает - то больше ничего и не надо. Ну и затем записать картинку (битмап) в файл, разумеется. Можно сразу рисовать твои графики во внеэкранный буфер (тот самый битмап, заранее созданный), а не на экран. А на экран просто копировать. Тогда для сохранения все будет готово, не надо будет еще раз рисовать. Заодно проблемы с мерцанием решишь, если они тебя волнуют... -------------------- ... |
|||
|
||||
| Adry |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 13.4.2011 Репутация: нет Всего: нет |
А можно подробнее, как это делается? Просто я привыкла работать в Матлабе, там все сохранения рисунков отработаны даже для самых непроходимых идиотов... В примере, их которого я поднатаскала идей для своей программы, есть функция печати. Но там чуть ли не все, что было нарисовано в OnDraw, в функции Print перерисовывается заново В общем, мое сумбурное словоизлияние можно свести к тому, что я плохо представляю, как работать с изображениями. Может быть, подкините ссылочку? Это сообщение отредактировал(а) Adry - 19.8.2011, 20:33 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Тебе нужны функции CreateCompatibleDC и CreateCompatibleBitmap. Можешь поискать по форуму эти слова, рисование во внеэкранный буфер многократно обсуждалось и код приводился. Тема не сложная, но в двух словах не опишешь тем не менее. И лучше бы почитать сначала любую ликбез-литературу по WinAPI \ MFC
-------------------- ... |
|||
|
||||
| Adry |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 13.4.2011 Репутация: нет Всего: нет |
Спасибо за подсказку. Теперь ясно, в какую сторону копать.
И последний вопрос, не по теме, правда. Что Вы посоветуете из "ликбез-литературы по WinAPI \ MFC"? У меня есть Черносвитов "Учебный курс программирования на visual C++ 7", но там в первом же примере я нашла 3 или 4 ошибки, есть Мешков, Тихомиров "Visual C++ и MFC", но оно ближе к справочнику |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Мне сложно советовать базовые книги; я это дело изучала довольно давно, и с тех пор наверняка много чего понаписано.
Первую книгу не знаю; вторая когда-то понравилась. Однако Мешков-Тихомиров хорош для изучения именно оболочки MFC - как там окна, команды и т.д. взаимодействуют. Графика там описана, имхо, не очень. Что касается ошибок в примерах, так и бог с ними. Если в книге хорошо изложена суть, то ошибки в примерах не мешают. Я примеры обычно по диагонали просматриваю, чисто чтобы убедиться, что правильно понимаю... -------------------- ... |
|||
|
||||
| Adry |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 13.4.2011 Репутация: нет Всего: нет |
Здравствуйте снова.
Почему-то у меня сохраняется "Черный квадрат". Вот все пиксели в *.bmp-файле черные и все....:((( Где проблема? Помогите, плиз!!
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
А вы ничего и не рисуете в этот битмап. Где код отрисовки собственно?
А если имеется в виду, что хотите скопировать с экрана, то последовательность действий неправильная
Кроме этого никакого рисования не нашла. И как ваши пикселы окажутся в битмапе, если вы его только создали и все? Это примерно то же самое, что вылить воду в дачную раковину, и только потом подставить снизу ведро. Вы же не ждете, что при таком подходе вода окажется в ведре? Здесь то же самое. Сначала нужно создать-выбрать битмап, а уже потом на нем рисовать. Контекст в памяти всегда создается с битмапом по умолчанию - черно-белым и размеров в пиксел, если не ошибаюсь. Нет смысла там что-то рисовать, не выбрав нормальный битмап. Дальше операции по вытаскиванию пикселов из битмапа не особо смотрела, много букв. Не уверена, что биты витмапа можно записывать в bmp сплошным куском - у bmp и у битмапа разное выравнивание строк, а в каком виде их возвращает GetDIBits - не знаю. Я бы делала не так. А создала бы сразу независимый dib (CreateDibSection). Его хандл можно использовать так же как битмап (выбирать в контекст), но кроме прочего, он имеет еще 2 преимущества: 1) предоставляет прямой доступ к пикселам 2) имеет такое же выравнивание строк, как bmp-файл, ибо bmp-файл и есть DIB. -------------------- ... |
|||
|
||||
| Adry |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 13.4.2011 Репутация: нет Всего: нет |
Рисую.. Отрисовка идет функцией OnDraw Потом hDC= ::GetDC(NULL); пытаюсь скопировать изображение из активного окна. (Поверьте - оно там есть.. Вроде бы последовательнсть действий
сомнений не вызывает. Во всяком случае, я именно такую последовательность вижу везде. (Кстати, BitBlt с какой-то очередной вариации остался, он тут и не нужен по идее). Воот... Наверное, Вы правы: надо попробовать сразу создавать DIB. А то оно как-то нелогично получается... Это сообщение отредактировал(а) Adry - 16.9.2011, 15:17 |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Я говорила не про рисование вообще, а рисование в созданный контекст\битмап.
А никакого другого кода по переносу изображения с экрана в совместимый контекст я не вижу. Есть еще вариант: воздать совместимый контекст\битмап (dib), но не копировать экран, а рисовать прямо в него вашей функцией OnDraw. -------------------- ... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |