Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GDI+: загрузка картинки 
V
    Опции темы
Alca
Дата 14.5.2010, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Используя GDI+, я загружаю с файла в TPanel картинку.
Код

CGDIPlusImage            m_imgGDI;
//....
void __fastcall TForm1::btn1Click(TObject *Sender) {
    m_imgGDI.Load(_T("C:\\simpotichnaya.gif"));

    HDC  hDc    = ::GetDC(pnl1->Handle);
    RECT rcRect = {pnl1->Left, pnl1->Top, pnl1->Width, pnl1->Height};

    m_imgGDI.DrawImg(hDc, rcRect);

    ::ReleaseDC(pnl1->Handle, hDc);
}

Если я изменяю размеры формы, то это изображение пропадает.
Можно конечно отрисовывать в FormPaint:
Код

void __fastcall TForm1::FormPaint(TObject *Sender) {
    m_imgGDI.Load(_T("C:\\simpotichnaya.gif"));

    HDC  hDc    = ::GetDC(pnl1->Handle);
    RECT rcRect = {pnl1->Left, pnl1->Top, pnl1->Width, pnl1->Height};

    m_imgGDI.DrawImg(hDc, rcRect);

    ::ReleaseDC(pnl1->Handle, hDc);
}

Можно ли "сохранить" изображение без дополнительной перерисовки, без FormPaint?
Типа как TImage - один раз загрузил и забыл )))))

Добавлено @ 16:38
CGDIPlusImage делал из этого:
Код

//    Project: DrawImg
//    File:    GDIp.h
//    Author:  Paul Bludov
//    Date:    08/24/2001
//
//    Description:
//        Sample class for loading and displaying images using GDI+
//
//    Update History:
//        NONE
//
//@//////////////////////////////////////////////////////////////////////////

#ifndef __GDIP_H__
#define __GDIP_H__

#define NO_WIN32_LEAN_AND_MEAN

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#ifndef min
    #define min __STD::min
#endif

#ifndef max
    #define max __STD::max
#endif

//@//////////////////////////////////////////////////////////////////////////
// If you got a compiler errors here, you should update your PSDK.
/////////////////////////////////////////////////////////////////////////////
#include <GDIPlus.h> // GDI+ declaration

// Prevent linker from hard-linking with GDIPlus.dll
#pragma comment (lib, "GDIPlus.lib")
#pragma comment (lib, "Delayimp.lib")
#pragma comment (linker, "/DelayLoad:GDIPlus.dll")
#pragma comment (linker, "/Delay:nobind")


//@//////////////////////////////////////////////////////////////////////////
//    CGDIPlusImage

class ATL_NO_VTABLE CGDIPlusImage :
    public CChildFrame<CGDIPlusImage>
{
    // Gdiplus::Image object used to load and render images
    Gdiplus::Image *m_pImage;

    // Actually, you should initialize GDI+ in WinMain
    ULONG_PTR m_gdiplusToken;

public:

    CGDIPlusImage() : m_pImage(NULL), m_gdiplusToken(0)
    {
        // Initialize GDI+
        Gdiplus::GdiplusStartupInput gdiplusStartupInput;
        Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
    }

    // Overrides
    static LPCTSTR GetMethodName()
    {
        return _T("GDIPlus");
    }

    void Destroy()
    {
        if (m_pImage)
        {
            delete m_pImage;
            m_pImage = NULL;
        }

        if (m_gdiplusToken)
        {
            Gdiplus::GdiplusShutdown(m_gdiplusToken);
            m_gdiplusToken = 0;
        }
    }

    // Implementation
    HRESULT DrawImg(HDC hdc, RECT& rcBounds)
    {
        if (m_pImage)
        {
            // Create Gdiplus::Graphics object from HDC
            Gdiplus::Graphics graphics(hdc);
            // Create Gdiplus::Rect object from RECT
            Gdiplus::Rect rc(rcBounds.left, rcBounds.top, rcBounds.right, rcBounds.bottom);

            // Draw the image
            return Gdiplus::Ok == graphics.DrawImage(
                m_pImage,                        // [in] Gdiplus::Image object
                rc                                // [in] Position and dimensions
                ) ? S_OK : E_FAIL;
        }

        return E_UNEXPECTED;
    }

    HRESULT Load(LPCTSTR szFile)
    {
        USES_CONVERSION;
        // Create new Gdiplus::Image object
        m_pImage = new Gdiplus::Image(T2CW(szFile));
        ATLASSERT(m_pImage);

        // Check for success
        if (Gdiplus::Ok == m_pImage->GetLastStatus())
            return S_OK;

        // Clenup on failure
        Destroy();
        return E_FAIL;
    }
};

#endif    __GDIP_H__

//@//////////////////////////////////////////////////////////////////////////
//    End Of File GDIp.h



Это сообщение отредактировал(а) Alca - 14.5.2010, 16:40


--------------------
PM WWW ICQ Skype Jabber   Вверх
xvr
Дата 15.5.2010, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Alca @  14.5.2010,  16:33 Найти цитируемый пост)
Можно ли "сохранить" изображение без дополнительной перерисовки, без FormPaint?
Типа как TImage - один раз загрузил и забыл )))))
Можно - сделать свой TImage для GDI+  smile 
Цитата

Можно конечно отрисовывать в FormPaint
TImage это и делает (конечно не в Paint'е формы, а в своем собственном)

Еще можно один раз отрисовать m_imgGDI.DrawImg в битмап, а потом его засунуть в TImage

PM MAIL   Вверх
Alca
Дата 17.5.2010, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Цитата

Можно - сделать свой TImage для GDI+ 

Как?


--------------------
PM WWW ICQ Skype Jabber   Вверх
xvr
Дата 17.5.2010, 12:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Alca @ 17.5.2010,  11:39)
Цитата

Можно - сделать свой TImage для GDI+ 

Как?

Сделать компонент (лучше всего на основе TGraphicControl)

PM MAIL   Вверх
BOB4uK
Дата 1.6.2010, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У меня следующая задача: есть картинка в TImage, ее нужно загрузить в GDI+ и обратно в TImage, как это можно сделать?
PM MAIL ICQ   Вверх
Alca
Дата 1.6.2010, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Цитата

есть картинка в TImage, ее нужно загрузить в GDI+ и обратно в TImage

Через стримы можно

Добавлено через 2 минуты и 1 секунду
Поиск по CreateStreamOnHGlobal

Добавлено через 2 минуты и 32 секунды
http://forum.sources.ru/index.php?showtopic=264407


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 8.6.2010, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Цитата

Сделать компонент (лучше всего на основе TGraphicControl)

Сделал.


--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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