| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Вызывать на поле диалога bitmap-picture |
| Автор: lioness 4.10.2010, 15:54 |
| Сделала дополнительный пункт в меню, нужно считать файл ".bmp" на поле диалога (где-то видела, как это делается массивом данных, но пример был не лучший, да и потеряла, где видела). Картинка должна быть среди прочих графических объектов "на-рАвных": то есть разрешала бы себя маркировать, перемещать по экрану и удалять. Есть что-то подходящее из MFC для прорисовки OnPaint, наверное, или... CBitmap кроме десятка Members никаких примеров текстовых не предлагает. Мои поиски в Codeguru или Codeproject были безрезультатны. "Insert picture MFC" "Paste picture MFC" |
| Автор: lioness 5.10.2010, 12:27 |
Ну да! Загрузить, разместить... Где-то видела, как считать (на firststeps, вроде бы) - не могу найти. Видела где-то занесение в Array ... Нет времени "изобретать велосипед" - лучше бы взглянуть на пример. Да искала по поиску bitmap на сайте - там всё про кнопки с оригинальными битмапами. На поле у меня много графических объектов, которые были созданы самой системой: условные изображения агрегатов, надписи, привязанные к ним, просто тексты... Это битмапная картинка должна стать одной из этих объектов. Увеличение-уменьшение, обновление экрана, привязка-отвязка и пр. - я добавлю в соответствующие процедуры, если у меня будет где-то Point или, скорее, список пойнтов, если таких картинок будет несколько. Мне бы сейчас пример: считать на пустой экран файл .bmp, суметь его полем маркировать и потянуть мышью, пересчитывая позицию, zoom-ирование. Не вижу никаких примеров в классе CBitmap, кроме Load... Create... Set... А с примером многое становится ясно само-по-себе. |
| Автор: Earnest 5.10.2010, 13:48 | ||
| Насчет загрузить bmp-file. Во-первый можно использовать класс CImage (если можешь использовать GDI+), либо ищи в форуме по словам BITMAPFILEHEADER, BITMAPINFOHEADER - это точно было. Ибо bmp -файл и CBitmap не одно и то же, и формат у них разный. Там же наверняка есть и про "нарисовать".
Кто же знает, что у тебя за система и что это за объекты. Видимо, ты должна создать свой объект-картинку на основе имеющихся. Кстати, отдельные примеры есть и в MSDN, и много где. И искать их за тебя вряд ли ли кто будет, тем более заново писать. Разве что у кого-то прямо под рукой есть. |
| Автор: Albor 6.10.2010, 08:36 | ||
Вот так можно загрузить картинку и привязать её к объекту CBitmap |
| Автор: lioness 6.10.2010, 17:03 | ||
| Вот нашла, что потеряла http://www.firststeps.ru/mfc/steps/r.php?327 Вот этот Bitmap-Handle остается "unused????" :(
Мелочи все сделала: в меню новый item, кликаю и открывается диалог стандартный файл на считывание, фильтр дисциплинированно bmp показывает, файл выбираю, "open" и иду по этим строкам. В FileName вижу полную строку к тому файлу, который выбрала, но hBitmap - пустой. Когда потом пытаюсь прорисовать в OnDraw(СВС* pDC), то не происходит, разумеется, просто ничего. Там, где "BITMAP bm" стоит вместо информации по "bm", выданной pDoc->m_bmpBitmap.GetBitmap(&bm), полная ерунда. И как был пустой белый экран (c таким же меню, как в примере с "firststeps"), таким и остается. |
| Автор: Albor 7.10.2010, 06:23 |
Поставь вместо AfxGetInstanceHandle() ноль. Я ведь привёл пример выше, там файлы читются на ура. |
| Автор: lioness 7.10.2010, 18:07 | ||
Заметила в примере и поставила. Вместо имени файла в "filter" поставила в апострофах _T .... Ну явно чтобы было!! Пусто. Стоят нули. Картинку со скриншотом как здесь поставить... |
| Автор: Albor 8.10.2010, 06:48 | ||||
lioness, попробуй использовать GetLastError() для определения проблемы. Вот функция из примеров в MSDN
В твоём случае, вызов этой функции будет примерно таким:
PS На всякий случай |
| Автор: lioness 8.10.2010, 11:34 |
| Повторила в отдельном маленьком проекте пример из firststeps ДА!!! Всё работает со страшной силой. Единственно, ругается компилятор на CFileDialog fileDialog(TRUE,NULL,"*.bmp"); и требует 6 параметров (устарел, видимо, пример на "первых шагах"). Но в HBITMAP hBitmap "выставился" благополучно адрес. Но! Я сделала другую картинку. И эта новая картинка ЧИТАЕТСЯ и в моём основном коде. Очевидно, что что-то не в порядке с моей первой тестовой картинкой. Обработку ошибки при LoadImage надо будет непременно добавить Теперь у меня OnDraw рисует только в примере от "firststeps", а в моем основном коде всё также белый экран. Но это надо ещё самой посмотреть. |
| Автор: Albor 8.10.2010, 13:01 |
Не заблуждайся, вышеприведенный код это не обработка ошибки, - это получение кода последней ошибки и показ сообщения для определения причины неудачной отработки функции (причины возврата нулевого хэндла). |
| Автор: lioness 21.1.2011, 13:48 | ||||
| Снова возвращаясь периодически к этому заданию... 1. Пример GraphWork я добавила 2. Были проблемы с организацией Array для объектов Bitmap. Пришлось сделать глобальным и "общаться" с объектами не через "set"-"get", а так, как напИсано 3. Двойной клик по полю перетаскивает ПОСЛЕДНИЙ считанный объект в ту позицию, куда кликнул 4. Размер поменять не получается (пыталась с двойным кликом на правую мышачью клавишу). 5. Пример работает, а основной код НЕТ. Строка в OnDraw()
в коротком примере NULL НЕ выдает, а в основном коде, куда, собственно, просто скопировала - ноль, хоть тресни. Соответственно, ячейка "bm" никаких данных не получает и рисовать ей нЕчего и экран остаётся пустой. Поиски информации о ошибке GetBitmap и "кто виноват" и "что делать" - ни к чему не приводят. Есть ощущение, что абзац в
не создает "правильную" связь с выбранным объектом. Проверка, что там, собственно, GetBitmap делает.... ну GetObject делает. И в маленьком примере находит объект, а в большом примере - нет. "Handle" в обоих случаях в порядке. Содержимое m_Bitmaps точно такое же, как и при создании нового объекта-картинки так и при прорисовке OnDraw(). Почему GetBitmap может выдать NULL? По каким причинам? Как подвесить zip-file простого примера, который работает? |
| Автор: lioness 31.3.2011, 17:16 | ||
| Усовершенствовала примерчик. 1. Нажать левой клавишей поближе к левому верхнему углу и держать мышиную клавишу - будет "таскаться" следом 2. Два раза кликнуть правой клавишей мыши - увеличивается постепенно. Можно продолжать "таскать" по экрану. 3. Картинок до 12 штук. Почему Array не работал с неопределенной длиной - не знаю. Привязывается к тому элементу, чей левый верхний угол ближе к маркеру. 4. В основном коде ВСЁ ТАК ЖЕ ВЫДАЕТ ошибку на GetBitmap и, разумеется, "bm" вместо нормальных данных имеет чушь: единички. Почему единички??
То есть этот маленький пример работает, как пулемёт. Переношу в основной код ТОТ ЖЕ текст - картинки на экране неееееет. |
| Автор: lioness 30.9.2011, 12:41 | ||
| Предыдущая проблема оказалась связанной с тем, что объект был локальный. Новая проблема и, как вижу "грабли", на которые все наступают. РАСПЕЧАТКА на принтере. Причем, эта зараза Bitmap распечатает себя совершенно корректно даже и StretchBlt, если была загружена LoadImage вот только что. Если объект был склонирован на экран, то распечатается оригинал, а копия на принтер не выйдет. Print Preview сработает всегда правильно. Почитав жалобы в интернете, посмотрев примеры, не понимаю, чего не хватает в моём коде с Нужна ли мне палетта? Чем грозит 32 бита цвета в Bitmap: я должна контролировать сколько? 8 или больше 24? Вот два варианта:
Первый вариант я закомментировала. Но оба - не работают. Без выдачи ошибок пустой лист. Чего не хватает??? |