Поиск:

Ответ в темуСоздание новой темы Создание опроса
> HBITMAP и picture control 
:(
    Опции темы
mrgloom
Дата 13.3.2012, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



есть scrollview из него я беру HBITMAP и пытаюсь вывести на новое окно с picture control
делаю как тут http://www.codeproject.com/Articles/2102/D...text-on-bitmaps
поместил этот код в OnPaint() своего окна.
но ничего не выводится, наверно надо как то дополнительно связать HBITMAP с picture control? или возможно надо выводить не в picture control, а как то иначе?
HBITMAP приходит нормальный вроде на нул проверил и размер показывает правильный.

Добавлено через 12 минут и 54 секунды
так кстати тоже не работает
в классе окна определено как CStatic m_curr_picture;
пытаюсь вывести как m_curr_picture.SetBitmap(m_bitmap);


Это сообщение отредактировал(а) mrgloom - 13.3.2012, 09:27
PM MAIL   Вверх
mrgloom
Дата 13.3.2012, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



поставил тип контрола Bitmap и теперь выводит через m_curr_picture.SetBitmap(m_bitmap);  но на всю область, а надо как то ресайзить.
PM MAIL   Вверх
mrgloom
Дата 13.3.2012, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



пробую ресайзить но почему то не получается.

Код

CRect* rect = new CRect();
m_curr_picture.GetClientRect(rect);
m_curr_picture.SetBitmap(m_bitmap);
CDC *pDC = m_curr_picture.GetDC();
CDC m_DC;
m_DC.CreateCompatibleDC(pDC);
m_DC.SelectObject(&m_bitmap);
pDC->StretchBlt(0, 0, 10,10/*rect->Width(), rect->Height()*/, &m_DC, 0,0, 10, 10, SRCCOPY);


Это сообщение отредактировал(а) mrgloom - 13.3.2012, 10:42
PM MAIL   Вверх
mrgloom
Дата 14.3.2012, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

void CShowDlg::OnPaint()
{
    if(m_bitmap!=NULL)
    {
        m_curr_picture.SetBitmap(m_bitmap);
        }
}


так работает, если выставить для picture control тип Bitmap, но все мигает и нагружает процессор потому что onPaint вызывается всё время.
 и еще картинка не масштабируется в область picture control'a. 

пробовал так ничего не выводит.
Код

void CShowDlg::OnPaint() 
{
    if(m_bitmap!=NULL)
    {
        CDC *pDC = m_curr_picture.GetDC();
        CDC m_DC;
        m_DC.CreateCompatibleDC(pDC);
        m_DC.SelectObject(&m_bitmap);
        pDC->StretchBlt(0, 0,100,100/*rect->Width(), rect->Height()*/, &m_DC, 0,0, 100, 100, SRCCOPY);
        m_curr_picture.ReleaseDC(pDC);
    }
}


Это сообщение отредактировал(а) mrgloom - 14.3.2012, 10:49
PM MAIL   Вверх
mrgloom
Дата 14.3.2012, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



создал свой статик класс CMyStatic

в классе диалога определил CMyStatic m_curr_picture;

такой код даже работает, выводит номально в область picture control, а не как раньше на всю форму.
Код

void CMyStatic::OnPaint()
{
    CPaintDC dc(this); 
    RECT rc;
    GetClientRect(&rc);
    dc.FillRect(&rc,&m_brush);
    dc.RoundRect(0,0,100,100,20,20);
}
void CShowDlg::OnPaint()
{
  CDialog::OnPaint(); //нужно ли?
}


но при попытке вывести картинку через StretchBlt опять ничего не выводит, причем StretchBlt выдает 1.

Код

void CMyStatic::OnPaint()
{

    BITMAP bmp;
    GetObject(m_bitmap, sizeof(BITMAP), &bmp); //размеры бмп правильные
    CRect rc;
    this->GetWindowRect(&rc); //рект тоже вроде правильный

    //как правильно изготовить srcDC?
    CDC srcDC;
    CDC *pDC = this->GetDC();
    srcDC.CreateCompatibleDC(pDC);
    srcDC.SelectObject(&m_bitmap);
    pDC->StretchBlt(rc.left,rc.top,rc.right,rc.bottom,
        &srcDC,0,0,bmp.bmWidth,bmp.bmHeight, SRCCOPY);
}


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


Опытный
**


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

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



а так работает, но выводит не в той глубине цвета(у меня 32), и нагружает сильно процессор.
видимо потому что постоянно создается контекст устройства.

вообще непонятно если у меня уже есть HBITMAP который получен из другого места через CreateDibSection,
то зачем создавать какой то темп контекст при его выводе? можно его как то сразу выводить в контекст picture control'a?
Код

void CMyStatic::OnPaint()
{
    CDC *pDC = this->GetDC();
    CDC memDC; 
    memDC.CreateCompatibleDC(pDC); 
    HBITMAP oldBmp = (HBITMAP)::SelectObject(memDC.m_hDC, m_bitmap);
    BITMAP bmp;
    GetObject(m_bitmap, sizeof(BITMAP), &bmp);
    CRect rc;
    this->GetWindowRect(&rc);
    StretchBlt(pDC->m_hDC,0,0,rc.right-rc.left,rc.bottom-rc.top,
    memDC.m_hDC,0,0,bmp.bmWidth,bmp.bmHeight, SRCCOPY); 
    memDC.SelectObject(oldBmp); 
}

PM MAIL   Вверх
mrgloom
Дата 14.3.2012, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



все разобрался теперь работает и вроде даже утечки нет.
но постоянно грузится процессор потому, что постоянно вызывается OnPaint().

Код

void CMyStatic::OnPaint()
{
    CDC *psrcDC = this->GetDC();
    CDC dstDC; 
    dstDC.CreateCompatibleDC(psrcDC);
    psrcDC->SetStretchBltMode(COLORONCOLOR);
    BITMAP bmp;
    GetObject(m_bitmap, sizeof(BITMAP), &bmp);
    HBITMAP oldBmp = (HBITMAP)::SelectObject(dstDC.m_hDC, m_bitmap);
    CRect rc;
    this->GetWindowRect(&rc);
    StretchBlt(psrcDC->m_hDC,0,0,rc.right-rc.left,rc.bottom-rc.top,
    dstDC.m_hDC,0,0,bmp.bmWidth,bmp.bmHeight, SRCCOPY); 
    dstDC.SelectObject(oldBmp); 
    psrcDC->DeleteDC();
        dstDC.DeleteDC();
}

PM MAIL   Вверх
deniska
Дата 6.4.2012, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



в начале OnPaint добавь 
Код

CPaintDC dc(this);


в конце не
Код

psrcDC->DeleteDC();

а
Код

ReleaseDC(psrcDC);

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


 




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


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

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