Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызывать на поле диалога bitmap-picture, как объект маркировать и "таскать" мышью 
:(
    Опции темы
lioness
Дата 4.10.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



 smile 

Сделала дополнительный пункт в меню, нужно считать файл ".bmp" на поле диалога (где-то видела, как это делается массивом данных, но пример был не лучший, да и потеряла, где видела).

Картинка должна быть среди прочих графических объектов "на-рАвных": то есть разрешала бы себя маркировать, перемещать по экрану и удалять. Есть что-то подходящее из MFC для прорисовки OnPaint, наверное, или...

CBitmap кроме десятка Members никаких примеров текстовых не предлагает.

Мои поиски в  Codeguru или Codeproject были безрезультатны. "Insert picture MFC" "Paste picture MFC"  smile 
PM MAIL   Вверх
Earnest
Дата 4.10.2010, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Конкретизируй, в чем твоя проблема - не знаешь как загрузить, как разместить или что?
Если вообще ничего не знаешь - ищи по форуму, по отдельности, все более менее было.
Что касается твоих запросов к CodeGuru и т.д. - это все же не гугл, ищи по конкретным ключевым словам - типа CBitmap. И здесь тоже.
И еще, вот это не поняла:
Цитата(lioness @  4.10.2010,  16:54 Найти цитируемый пост)
Картинка должна быть среди прочих графических объектов "на-рАвных": то есть разрешала бы себя маркировать, перемещать по экрану и удалять.

Если под графическими объектами ты подразумеваешь контролы, то какие контролы разрешают себя перемещать\удалять? И что-такое "маркировать"? А если что-то другое, то что это в контексте диалога?



--------------------
...
PM   Вверх
lioness
Дата 5.10.2010, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



Цитата(Earnest @  4.10.2010,  18:03 Найти цитируемый пост)
не знаешь как загрузить, как разместить или что?

Ну да! Загрузить, разместить... Где-то видела, как считать (на firststeps, вроде бы) - не могу найти. Видела где-то занесение в Array ... Нет времени "изобретать велосипед" - лучше бы взглянуть на пример.

Да искала по поиску bitmap на сайте - там всё про кнопки с оригинальными битмапами. 

На поле у меня много графических объектов, которые были созданы самой системой: условные изображения агрегатов, надписи, привязанные к ним, просто тексты... Это битмапная картинка должна стать одной из этих объектов.  Увеличение-уменьшение, обновление экрана, привязка-отвязка и пр.  - я добавлю в соответствующие процедуры, если у меня будет где-то Point или, скорее, список пойнтов, если таких картинок будет несколько.

Мне бы сейчас пример: считать на пустой экран файл .bmp, суметь его полем маркировать и потянуть мышью, пересчитывая позицию, zoom-ирование. Не вижу никаких примеров в классе CBitmap, кроме Load... Create... Set...  

А с примером многое становится ясно само-по-себе. 



PM MAIL   Вверх
Earnest
Дата 5.10.2010, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Насчет загрузить bmp-file. Во-первый можно использовать класс CImage (если можешь использовать GDI+), либо ищи в форуме по словам BITMAPFILEHEADER, BITMAPINFOHEADER - это точно было. Ибо bmp -файл и CBitmap не одно и то же, и формат у них разный.
Там же наверняка есть и про "нарисовать". 

Цитата(lioness @  5.10.2010,  13:27 Найти цитируемый пост)
На поле у меня много графических объектов, которые были созданы самой системой: условные изображения агрегатов, надписи,

Кто же знает, что у тебя за система и что это за объекты. Видимо, ты должна создать свой объект-картинку на основе имеющихся.

Кстати, отдельные примеры есть и в MSDN, и много где. И искать их за тебя вряд ли ли кто будет, тем более заново писать. Разве что у кого-то прямо под рукой есть. 



--------------------
...
PM   Вверх
Albor
Дата 6.10.2010, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Код

HBITMAP m_hBmp;
    CBitmap m_bkview;
m_hBmp= (HBITMAP)::LoadImage(0,_T("filename.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    m_bkview.Attach(m_hBmp);

Вот так можно загрузить картинку и привязать её к объекту CBitmap
PM MAIL ICQ   Вверх
lioness
Дата 6.10.2010, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



Вот нашла, что потеряла  smile 
Шаг 327 Читаем BMP файл c диска
Вот этот Bitmap-Handle остается "unused????" :(
Код

        m_sFileName=fileDialog.GetPathName();
        HBITMAP hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
                m_sFileName, IMAGE_BITMAP, 0, 0,
                LR_LOADFROMFILE | LR_CREATEDIBSECTION);

Мелочи все сделала: в меню новый item, кликаю и открывается диалог стандартный файл на считывание, фильтр дисциплинированно bmp показывает, файл выбираю, "open" и иду по этим строкам. В FileName вижу полную строку к тому файлу, который выбрала, но hBitmap - пустой. 

Когда потом пытаюсь прорисовать в OnDraw(СВС* pDC), то не происходит, разумеется, просто ничего. Там, где "BITMAP bm"  стоит вместо информации по "bm", выданной  pDoc->m_bmpBitmap.GetBitmap(&bm), полная ерунда.

И как был пустой белый экран (c таким же меню, как в примере с "firststeps"), таким и остается.  


Это сообщение отредактировал(а) lioness - 6.10.2010, 17:05
PM MAIL   Вверх
Albor
Дата 7.10.2010, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(lioness @  6.10.2010,  17:03 Найти цитируемый пост)
но hBitmap - пустой.

Поставь вместо AfxGetInstanceHandle() ноль. Я ведь привёл пример выше, там файлы читются на ура.
PM MAIL ICQ   Вверх
lioness
Дата 7.10.2010, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



Цитата

Поставь вместо AfxGetInstanceHandle() ноль

Заметила в примере и поставила. Вместо имени файла в "filter" поставила в апострофах   _T .... Ну явно чтобы было!! Пусто. Стоят нули. Картинку со скриншотом как здесь поставить... 


PM MAIL   Вверх
Albor
Дата 8.10.2010, 06:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



lioness, попробуй использовать GetLastError() для определения проблемы. Вот функция из примеров в MSDN
Код

#include <windows.h>
#include <strsafe.h>

void ErrorExit(LPTSTR lpszFunction) 

    // Retrieve the system error message for the last-error code

    LPVOID lpMsgBuf;
    LPVOID lpDisplayBuf;
    DWORD dw = GetLastError(); 

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );

    // Display the error message and exit the process

    lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, 
        (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); 
    StringCchPrintf((LPTSTR)lpDisplayBuf, 
        LocalSize(lpDisplayBuf),
        TEXT("%s failed with error %d: %s"), 
        lpszFunction, dw, lpMsgBuf); 
    MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); 

    LocalFree(lpMsgBuf);
    LocalFree(lpDisplayBuf);
    ExitProcess(dw); 
}

void main()
{
    // Generate an error

    if(!GetProcessId(NULL))
        ErrorExit(TEXT("GetProcessId"));
}


В твоём случае, вызов этой функции будет примерно таким:
Код

if(hBitmap==0)
ErrorExit(_T("LoadImage"));


PS На всякий случай smile . Эта строчка должна быть размещена сразу за вызовом LoadImage().

Это сообщение отредактировал(а) Albor - 8.10.2010, 06:53
PM MAIL ICQ   Вверх
lioness
Дата 8.10.2010, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



Повторила в отдельном маленьком проекте пример из firststeps ДА!!!  Всё работает со страшной силой. Единственно, ругается компилятор на CFileDialog fileDialog(TRUE,NULL,"*.bmp"); и требует 6 параметров (устарел, видимо, пример на "первых шагах").

Но в HBITMAP hBitmap "выставился" благополучно адрес. Но! Я сделала другую картинку. И эта новая картинка ЧИТАЕТСЯ и в моём основном коде. Очевидно, что что-то не в порядке с моей первой тестовой картинкой. Обработку ошибки при LoadImage надо будет непременно добавить  smile 

Теперь у меня OnDraw рисует только в примере от "firststeps", а в моем основном коде всё также белый экран. Но это надо ещё самой посмотреть. 
PM MAIL   Вверх
Albor
Дата 8.10.2010, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(lioness @  8.10.2010,  11:34 Найти цитируемый пост)
Обработку ошибки при LoadImage надо будет непременно добавить   

Не заблуждайся, вышеприведенный код это не обработка ошибки, - это получение кода последней ошибки и показ сообщения для определения причины неудачной отработки функции (причины возврата нулевого хэндла).
PM MAIL ICQ   Вверх
lioness
Дата 21.1.2011, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



Снова возвращаясь периодически к этому заданию... 

1. Пример GraphWork я добавила 

2. Были проблемы с организацией Array для объектов Bitmap. Пришлось сделать глобальным и "общаться" с объектами не через "set"-"get", а так, как напИсано

3. Двойной клик по полю перетаскивает ПОСЛЕДНИЙ считанный объект в ту позицию, куда кликнул

4. Размер поменять не получается (пыталась с двойным кликом на правую мышачью клавишу). 

5. Пример работает, а основной код НЕТ. Строка в OnDraw() 
Код

if (pDoc->m_Bitmaps[ind].m_bitmap.GetBitmap(&bm) == NULL) 

в коротком примере NULL  НЕ выдает, а в основном коде, куда, собственно, просто скопировала - ноль, хоть тресни. Соответственно, ячейка "bm" никаких данных не получает и рисовать ей нЕчего и экран остаётся пустой. Поиски информации о ошибке GetBitmap  и "кто виноват" и "что делать" - ни к чему не приводят. Есть ощущение, что абзац в 

Код

        CDC dcTemp; 
        dcTemp.CreateCompatibleDC(pDC); 
        dcTemp.SelectObject(pDoc->m_Bitmaps[ind].m_bitmap);

не создает "правильную" связь с выбранным объектом. Проверка, что там, собственно, GetBitmap делает.... ну GetObject делает. И в маленьком примере находит объект, а в большом примере - нет. "Handle" в обоих случаях в порядке. Содержимое m_Bitmaps точно такое же, как и при создании нового объекта-картинки так и при прорисовке OnDraw().

Почему GetBitmap может выдать NULL?  По каким причинам? 

Как подвесить zip-file простого примера, который работает? 

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  source_GraphWork.zip 41,82 Kb
PM MAIL   Вверх
lioness
Дата 31.3.2011, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



Усовершенствовала примерчик.

1. Нажать левой клавишей поближе к левому верхнему углу и держать мышиную клавишу - будет "таскаться" следом

2. Два раза кликнуть правой клавишей мыши - увеличивается постепенно. Можно продолжать "таскать" по экрану. 

3. Картинок до 12 штук. Почему Array не работал с неопределенной длиной - не знаю.  Привязывается к тому элементу, чей левый верхний угол  ближе к маркеру. 

4. В основном коде ВСЁ ТАК ЖЕ ВЫДАЕТ ошибку на GetBitmap и, разумеется, "bm" вместо нормальных данных имеет чушь: единички. Почему единички??   smile 


 
Код

if (pDoc->m_Bitmaps[ind].m_bitmap.GetBitmap(&bm) == NULL) 

 
То есть этот маленький пример работает, как пулемёт. Переношу в основной код ТОТ ЖЕ текст - картинки на экране неееееет. 

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  GraphWork.exe 168,00 Kb
PM MAIL   Вверх
lioness
Дата 30.9.2011, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



Предыдущая проблема оказалась связанной с тем, что объект был локальный. 

Новая проблема и, как вижу "грабли", на которые все наступают. РАСПЕЧАТКА на принтере.

Причем, эта зараза Bitmap распечатает себя совершенно корректно даже и StretchBlt, если была загружена LoadImage вот только что. Если объект был склонирован на экран, то распечатается оригинал, а копия на принтер не выйдет.  Print Preview сработает всегда правильно. 

Почитав жалобы в интернете, посмотрев примеры, не понимаю, чего не хватает в моём коде с 

Нужна ли мне палетта? Чем грозит 32 бита цвета в Bitmap: я должна контролировать сколько? 8 или больше 24?

Вот два варианта:
Код

        if (pDC->IsPrinting())
        {

            HDC hDC = ::GetDC(NULL);
            BITMAPINFOHEADER bmih;
            int nError;
            BYTE *lpBits = new BYTE[bm.bmWidth*bm.bmHeight];


//==================================================================
//        CPaintDC dc(this);
// 
//        ULONG uLen = bm.bmWidthBytes * bm.bmHeight;
// 
//        BITMAPINFO bmi;
//        memset(&bmi, 0, sizeof(bmi));
//        bmi.bmiHeader.biSize        = sizeof(BITMAPINFOHEADER);
//        bmi.bmiHeader.biWidth       = bm.bmWidth;
//        bmi.bmiHeader.biHeight      = -bm.bmHeight; // top-down image
//        bmi.bmiHeader.biPlanes      = bm.bmPlanes;
//        bmi.bmiHeader.biBitCount    = bm.bmBitsPixel;
//        bmi.bmiHeader.biCompression = BI_RGB;
//        bmi.bmiHeader.biSizeImage   = uLen;
// 
//        BYTE *pBits = new BYTE [uLen];
// 
// if ((GetDIBits(dc.m_hDC, (HBITMAP)pDoc->m_Bitmaps[ind].m_bitmap, 0, 0, pBits, &bmi, DIB_RGB_COLORS)) == 0) 
//            AfxMessageBox(_T("Bitmaps cannot printed"), MB_OK);
// 
//            SetMapMode(dc.m_hDC, MM_ANISOTROPIC);
// if (::StretchDIBits(dc.m_hDC, ptPoint.x,ptPoint.y, dScalKoeff * bm.bmWidth, dScalKoeff * bm.bmHeight, 0,0,bm.bmWidth, bm.bmHeight, (LPVOID)pBits, &bmi, 
//                DIB_RGB_COLORS, SRCCOPY) == NULL)
//                AfxMessageBox(_T("Bitmaps cannot printed"), MB_OK);
// 
//            delete [] pBits;
//=========================================================

            BITMAPINFO lpBitsInfo;
            memset(&lpBitsInfo, 0, sizeof(lpBitsInfo));
            lpBitsInfo.bmiHeader.biSize        = sizeof(BITMAPINFOHEADER);
            lpBitsInfo.bmiHeader.biWidth       = bm.bmWidth;
            lpBitsInfo.bmiHeader.biHeight      = -bm.bmHeight; // top-down image
            lpBitsInfo.bmiHeader.biPlanes      = bm.bmPlanes;
            lpBitsInfo.bmiHeader.biBitCount    = bm.bmBitsPixel;
            lpBitsInfo.bmiHeader.biCompression = BI_RGB;
            lpBitsInfo.bmiHeader.biSizeImage   = bm.bmWidth*bm.bmHeight;
            lpBitsInfo.bmiHeader.biXPelsPerMeter = 0;
            lpBitsInfo.bmiHeader.biYPelsPerMeter = 0;
            lpBitsInfo.bmiHeader.biClrUsed = 0;
            lpBitsInfo.bmiHeader.biClrImportant = 0;

            HDC hSrcDC = ::CreateCompatibleDC(hDC);
            COLORREF *pBits = NULL;
            
            HBITMAP hDibBmp = CreateDIBSection(
                hSrcDC, &lpBitsInfo, DIB_RGB_COLORS, (void **)&pBits,
                NULL, NULL);

            if (hDibBmp == NULL)
            {
                AfxMessageBox(_T("CreateDIBits Failed"), MB_ICONEXCLAMATION); 
            }


Первый вариант я закомментировала. Но оба - не работают. Без выдачи ошибок пустой лист.

Чего не хватает???  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1145 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.