| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Из CView в *jpg |
| Автор: Adry 19.8.2011, 15:33 |
| Здравствуйте, уважаемые эксперты! У меня есть небольшое приложение MFC, которое должно рисовать графики. И оно как ни удивительно даже это делает.. Рисую функцией OnDrow в СView. В шаблонном фрейме кнопка "Save" присутствует и в меню, и в ТулБаре, но сохраняют они пустой файл. Подскажите, как это делается? |
| Автор: Earnest 19.8.2011, 15:40 |
| Было бы странно, если бы созданная мастером заготовка функции Save сохраняла что-то разумное. Если тебе нужна растровая картинка, то это не сложно. Нужно создать совместимый контекст и совместимый битмап, выбрать битмап в контекст и вызывать OnDraw с этим контекстом. НО: нужно подумать о координатах. Если у тебя режим MM_TEXT, то ты получишь картинку в разрешении экрана. Если тебя это устраивает - то больше ничего и не надо. Ну и затем записать картинку (битмап) в файл, разумеется. Можно сразу рисовать твои графики во внеэкранный буфер (тот самый битмап, заранее созданный), а не на экран. А на экран просто копировать. Тогда для сохранения все будет готово, не надо будет еще раз рисовать. Заодно проблемы с мерцанием решишь, если они тебя волнуют... |
| Автор: Adry 19.8.2011, 15:59 | ||
А можно подробнее, как это делается? Просто я привыкла работать в Матлабе, там все сохранения рисунков отработаны даже для самых непроходимых идиотов... В примере, их которого я поднатаскала идей для своей программы, есть функция печати. Но там чуть ли не все, что было нарисовано в OnDraw, в функции Print перерисовывается заново В общем, мое сумбурное словоизлияние можно свести к тому, что я плохо представляю, как работать с изображениями. Может быть, подкините ссылочку? |
| Автор: Earnest 22.8.2011, 09:58 |
| Тебе нужны функции CreateCompatibleDC и CreateCompatibleBitmap. Можешь поискать по форуму эти слова, рисование во внеэкранный буфер многократно обсуждалось и код приводился. Тема не сложная, но в двух словах не опишешь тем не менее. И лучше бы почитать сначала любую ликбез-литературу по WinAPI \ MFC |
| Автор: Adry 23.8.2011, 09:48 |
| Спасибо за подсказку. Теперь ясно, в какую сторону копать. И последний вопрос, не по теме, правда. Что Вы посоветуете из "ликбез-литературы по WinAPI \ MFC"? У меня есть Черносвитов "Учебный курс программирования на visual C++ 7", но там в первом же примере я нашла 3 или 4 ошибки, есть Мешков, Тихомиров "Visual C++ и MFC", но оно ближе к справочнику |
| Автор: Earnest 23.8.2011, 10:57 |
| Мне сложно советовать базовые книги; я это дело изучала довольно давно, и с тех пор наверняка много чего понаписано. Первую книгу не знаю; вторая когда-то понравилась. Однако Мешков-Тихомиров хорош для изучения именно оболочки MFC - как там окна, команды и т.д. взаимодействуют. Графика там описана, имхо, не очень. Что касается ошибок в примерах, так и бог с ними. Если в книге хорошо изложена суть, то ошибки в примерах не мешают. Я примеры обычно по диагонали просматриваю, чисто чтобы убедиться, что правильно понимаю... |
| Автор: Adry 16.9.2011, 11:31 | ||
| Здравствуйте снова. Почему-то у меня сохраняется "Черный квадрат". Вот все пиксели в *.bmp-файле черные и все....:((( Где проблема? Помогите, плиз!!
|
| Автор: Earnest 16.9.2011, 14:06 | ||
| А вы ничего и не рисуете в этот битмап. Где код отрисовки собственно? А если имеется в виду, что хотите скопировать с экрана, то последовательность действий неправильная
Кроме этого никакого рисования не нашла. И как ваши пикселы окажутся в битмапе, если вы его только создали и все? Это примерно то же самое, что вылить воду в дачную раковину, и только потом подставить снизу ведро. Вы же не ждете, что при таком подходе вода окажется в ведре? Здесь то же самое. Сначала нужно создать-выбрать битмап, а уже потом на нем рисовать. Контекст в памяти всегда создается с битмапом по умолчанию - черно-белым и размеров в пиксел, если не ошибаюсь. Нет смысла там что-то рисовать, не выбрав нормальный битмап. Дальше операции по вытаскиванию пикселов из битмапа не особо смотрела, много букв. Не уверена, что биты витмапа можно записывать в bmp сплошным куском - у bmp и у битмапа разное выравнивание строк, а в каком виде их возвращает GetDIBits - не знаю. Я бы делала не так. А создала бы сразу независимый dib (CreateDibSection). Его хандл можно использовать так же как битмап (выбирать в контекст), но кроме прочего, он имеет еще 2 преимущества: 1) предоставляет прямой доступ к пикселам 2) имеет такое же выравнивание строк, как bmp-файл, ибо bmp-файл и есть DIB. |
| Автор: Earnest 16.9.2011, 15:44 | ||
Я говорила не про рисование вообще, а рисование в созданный контекст\битмап.
А никакого другого кода по переносу изображения с экрана в совместимый контекст я не вижу. Есть еще вариант: воздать совместимый контекст\битмап (dib), но не копировать экран, а рисовать прямо в него вашей функцией OnDraw. |