Имеется форма на Visual C++ 6.0
В диалоге присутствует элемент picture control. Каким образом можно вывести картинки в picture control, которые хранятся на фтп-сервере в формате jpg и png?
CBitmap работает только с bmp файлами. А как тогда быть с jpg и png? И есть ли в mfc функции по работе с ftp?
Здравствуйте, Guard_h4s, Вы писали:
G_>Здравствуйте, evgeniy_ptz, Вы писали:
_>>jpg и png? G_>GDI+ умеет работать с ними. Либо смотрите в сторону libjpeg и libpng
можно пример по работе с gdi+ библиотекой, например, загрузить картинку в формате jpg из папки и вставить в picture control
Здравствуйте, evgeniy_ptz, Вы писали: _>можно пример по работе с gdi+ библиотекой, например
Под рукой нет ничего — в MSDNе есть примеры, точно. GDI+ неплохо документирован
Здравствуйте, Guard_h4s, Вы писали:
G_>Здравствуйте, evgeniy_ptz, Вы писали: _>>можно пример по работе с gdi+ библиотекой, например G_>Под рукой нет ничего — в MSDNе есть примеры, точно. GDI+ неплохо документирован
А если использовать класс Cimage должно получиться?
Он кстати есть в студии 2005?
Здравствуйте, evgeniy_ptz, Вы писали:
_>Здравствуйте, Guard_h4s, Вы писали:
G_>>Здравствуйте, evgeniy_ptz, Вы писали: _>>>можно пример по работе с gdi+ библиотекой, например G_>>Под рукой нет ничего — в MSDNе есть примеры, точно. GDI+ неплохо документирован
_>А если использовать класс Cimage должно получиться?
Он не умеет загружать jpeg и т.п. Сначала все равно придется распаковывать. _>Он кстати есть в студии 2005?
CImage класс библиотеки ATL. Так что зависит от комплектации студии(она тоже разная бывает)
Здравствуйте, Guard_h4s, Вы писали:
G_>Здравствуйте, evgeniy_ptz, Вы писали:
_>>Здравствуйте, Guard_h4s, Вы писали:
G_>>>Здравствуйте, evgeniy_ptz, Вы писали: _>>>>можно пример по работе с gdi+ библиотекой, например G_>>>Под рукой нет ничего — в MSDNе есть примеры, точно. GDI+ неплохо документирован
_>>А если использовать класс Cimage должно получиться? G_>Он не умеет загружать jpeg и т.п. Сначала все равно придется распаковывать. _>>Он кстати есть в студии 2005? G_>CImage класс библиотеки ATL. Так что зависит от комплектации студии(она тоже разная бывает)
Он умеет работать сохранять в jpeg, gif, png и др. а загружать ещё больше может.
Написал код по работе с CImage, он загружает картинку и прорисовывает в элементе picture control на диалоге.
Здравствуйте, evgeniy_ptz, Вы писали:
_>только вот картинку он в объект image загружает, а почему то саму картинку не прорисовывает, только чертит рамку по размеру фото. Что тут не так?(
HBITMAP hbmp=m_photo.GetBitmap(); Это что?
Здравствуйте, Guard_h4s, Вы писали:
G_>Здравствуйте, evgeniy_ptz, Вы писали:
_>>только вот картинку он в объект image загружает, а почему то саму картинку не прорисовывает, только чертит рамку по размеру фото. Что тут не так?( G_>HBITMAP hbmp=m_photo.GetBitmap(); Это что?
Здравствуйте, Guard_h4s, Вы писали:
G_>Здравствуйте, Guard_h4s, Вы писали:
G_>>Здравствуйте, evgeniy_ptz, Вы писали:
_>>>только вот картинку он в объект image загружает, а почему то саму картинку не прорисовывает, только чертит рамку по размеру фото. Что тут не так?( G_>>HBITMAP hbmp=m_photo.GetBitmap(); Это что?
G_>Вобщем, вот так работает(WTL): G_>
Здравствуйте, evgeniy_ptz, Вы писали:
_>Написал код по работе с CImage, он загружает картинку и прорисовывает в элементе picture control на диалоге. _>
_>только вот картинку он в объект image загружает, а почему то саму картинку не прорисовывает, только чертит рамку по размеру фото. Что тут не так?(
Если это сплошной отрывок кода, то это бред!
А если это несколко фрагментов, то неплохо бы показать, какой фрагмент в какой функции.
Зачем загруженная картинка блендится со старой картинкой из контрола?
Куда девается старая картинка? (Из контрола мы её вытащили и засунули в контекст; а затем вытащили из контекста и... и всё).
Куда девается новая картинка? Хэндл на неё засунули в контрол. А потом вышли из функции и грохнули СImage, и что случилось с хэндлом?
По уму, надо завести CImage m_image на всё время жизни окна. В OnCreate/OnInitDialog загрузить туда картинку, затем передать хэндл в контрол, и всё.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, evgeniy_ptz, Вы писали:
_>>Написал код по работе с CImage, он загружает картинку и прорисовывает в элементе picture control на диалоге. _>>
_>>только вот картинку он в объект image загружает, а почему то саму картинку не прорисовывает, только чертит рамку по размеру фото. Что тут не так?(
К>Если это сплошной отрывок кода, то это бред! К>А если это несколко фрагментов, то неплохо бы показать, какой фрагмент в какой функции. К>Зачем загруженная картинка блендится со старой картинкой из контрола? К>Куда девается старая картинка? (Из контрола мы её вытащили и засунули в контекст; а затем вытащили из контекста и... и всё). К>Куда девается новая картинка? Хэндл на неё засунули в контрол. А потом вышли из функции и грохнули СImage, и что случилось с хэндлом?
К>По уму, надо завести CImage m_image на всё время жизни окна. В OnCreate/OnInitDialog загрузить туда картинку, затем передать хэндл в контрол, и всё.
void CReaderDlg::OnTimer(UINT nIDEvent)
{
CDialog::OnTimer(nIDEvent);
m_reader = new CReader;
if(!(m_reader->Reader_Init()))
EndDialog(0);
if(!(m_reader->Read_serial_number()))
EndDialog(0);
if(m_reader->Card_read())
{
//if (m_foto.IsEmpty())
//return false;
m_birthday_CTRL.SetWindowText(m_reader->birth);
m_surname_CTRL.SetWindowText(m_reader->Familiya);
m_name_CTRL.SetWindowText(m_reader->Imya);
m_patronymic_CTRL.SetWindowText(m_reader->Ot4estvo);
m_kurs_CTRL.SetWindowText(m_reader->Kurs);
m_fakultet_CTRL.SetWindowText(m_reader->Fakultet);
UpdateData(FALSE);
m_foto = m_reader->Foto;
image.Load(LPCTSTR(m_foto));
int w = image.GetWidth();
int h = image.GetHeight();
int tnh = 200;
int tnw = 200 * w / h;
int bpp = image.GetBPP();
image2.Create(tnw,tnh,bpp);
HDC h2=image2.GetDC();
SetStretchBltMode(h2,HALFTONE);
image.StretchBlt(h2,0,0,tnw,tnh,SRCCOPY);
image2.ReleaseDC();
HBITMAP hbmp = m_photo.GetBitmap();
CBitmap *bmp = CBitmap::FromHandle(hbmp);
CDC dc;
dc.CreateCompatibleDC(NULL);
CBitmap* old = dc.SelectObject(bmp);
m_photo.SetBitmap(image2);
dc.SelectObject(old);
m_photo.Invalidate();
}
else
EndDialog(0);
}
значит выводит картинку, но падает с ошибкой
Debug Assertion Failed!
Program:...
File: c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlimage.h
Line:503
Expression: m_hBitmap==0
что нужно конкретно в коде подредактировать, можете написать, а не догадки строить.
Спасибо.
ассерт и вылетает именно потому что вы используете BITMAP до инициализации.
Там действительно написан бред. Код что я приводил выше работает(я проверял)
Нужны ОЧЕНЬ ВЕСКИЕ ОСНОВАНИЯ, чтобы засовывать логику инициализации (а, тем более, захлопывания) диалога в OnTimer.
Если этими основаниями было "глючит в OnInitDialog", — значит, есть ошибки именно на стадии создания диалога.
_>{
_> CDialog::OnTimer(nIDEvent);
_> m_reader = new CReader; // вот здесь, похоже, мы устраиваем утечки памяти - создавая новый m_reader на каждый такт
_> if(!(m_reader->Reader_Init()))
_> EndDialog(0);
_> if(!(m_reader->Read_serial_number()))
_> EndDialog(0);
_> if(m_reader->Card_read())
_> {
_> //if (m_foto.IsEmpty())
_> //return false;
_> m_birthday_CTRL.SetWindowText(m_reader->birth);
_> m_surname_CTRL.SetWindowText(m_reader->Familiya);
_> m_name_CTRL.SetWindowText(m_reader->Imya);
_> m_patronymic_CTRL.SetWindowText(m_reader->Ot4estvo);
_> m_kurs_CTRL.SetWindowText(m_reader->Kurs);
_> m_fakultet_CTRL.SetWindowText(m_reader->Fakultet);
_> UpdateData(FALSE);
_> m_foto = m_reader->Foto;
_> image.Load(LPCTSTR(m_foto)); // где объявлена эта переменная? цикл жизни её и его содержимого?
_> int w = image.GetWidth();
_> int h = image.GetHeight();
_> int tnh = 200;
_> int tnw = 200 * w / h;
_> int bpp = image.GetBPP();
_> image2.Create(tnw,tnh,bpp); // где объявлена эта переменная? цикл жизни её и его содержимого?
_> HDC h2=image2.GetDC();
_> SetStretchBltMode(h2,HALFTONE);
_> image.StretchBlt(h2,0,0,tnw,tnh,SRCCOPY);
_> image2.ReleaseDC();
_> HBITMAP hbmp = m_photo.GetBitmap(); // hbmp утекает: мы её взяли из контрола и забыли
_> CBitmap *bmp = CBitmap::FromHandle(hbmp);
_> CDC dc;
_> dc.CreateCompatibleDC(NULL);
_> CBitmap* old = dc.SelectObject(bmp);
_> m_photo.SetBitmap(image2); // ... подменив свеженарисованной картинкой (которую вскоре уничтожим)
_> dc.SelectObject(old);
_> m_photo.Invalidate();
_> }
_> else
_> EndDialog(0);
_>}
_>значит выводит картинку, но падает с ошибкой _>Debug Assertion Failed!
_>Program:... _>File: c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlimage.h _>Line:503
_>Expression: m_hBitmap==0
Для чего у нас есть отладчик, э? Посмотреть стек — откуда была вызвана эта "строка 503", что за объект, и какого чёрта там отсутствует m_hBitmap?
У тебя, например, нет проверок — загрузилась картинка в image, не загрузилась...
_>что нужно конкретно в коде подредактировать, можете написать, а не догадки строить.
Боюсь, моё мнение совпадает с мнением капитана Смоллетта. Мне здесь всё не нравится.