Вставить картинку в однодокументное приложение

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Лена89
Сообщения: 52
Зарегистрирован: 20 июн 2007, 10:36

Доброе время суток!

В однодокументное приложение VC++6.0 пытаюсь вставить картинку *.bmp:

Код: Выделить всё

CMy1View::CMy1View()
{
	// TODO: add construction code here
	m_pdcMemory = new CDC;
	m_pBitmap = new CBitmap;
}

CMy1View::~CMy1View()
{
	delete m_pdcMemory;
	delete m_pBitmap;
}
........................................
void CMy1View::OnDraw(CDC* pDC)
{
	CMy1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here

	pDC->SetStretchBltMode(COLORONCOLOR);
                pDC->StretchBlt(20, -20, m_sizeDest.cx, -m_sizeDest.cy,
                m_pdcMemory, 0, 0,
                m_sizeSource.cx, m_sizeSource.cy, SRCCOPY);
}


void CMy1View::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	BITMAP bm;

	if(m_pdcMemory->GetSafeHdc() == NULL)
	{
	         CClientDC dc(this);
                         OnPrepareDC(&dc);
	         m_pBitmap->LoadBitmap(IDB_GOLD);
	         m_pdcMemory->CreateCompatibleDC(&dc);
                         m_pdcMemory->SelectObject(m_pBitmap);
                         m_pBitmap->GetObject(sizeof(bm), &bm);
                         m_sizeSource.cx = bm.bmWidth;
                         m_sizeSource.cy = bm.bmHeight;
                         m_sizeDest = m_sizeSource;
                         dc.DPtoLP(&m_sizeDest);
	}
}
Подскажите пожалуйста, что здесь не так?
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

А тебе что нужно добиться от программы? Просто загрузить картинку из ресурсов и нарисовать её? Тогда это всё делается гораздо проще.
Твой код слишком усложнён.
Лена89
Сообщения: 52
Зарегистрирован: 20 июн 2007, 10:36

WinMain писал(а):Просто загрузить картинку из ресурсов и нарисовать её?
Да именно так ... не намекнете как это сделать?
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Объект CBitmap внутри класса CMy1View объявляется так:

CBitmap m_bmp;

Далее в файле My1View.cpp идёт реализация методов...

Код: Выделить всё

[color=green]// Конструктор[/color]
[size=84]CMy1View::CMy1View()[/size]
[size=84]{[/size]
[size=84]   [color=green]// Загрузка битмапа...[/color][/size]
[size=84]   m_bmp.LoadBitmap(IDB_BITMAP1);[/size]
[size=84]}[/size]
 
[size=84][color=green]// Процедура отрисовки клиентской области...[/color][/size]
[size=84][size=84][color=#0000ff][size=84][color=#0000ff]void[/color][/size][/color][/size][size=84] CMy1View::OnDraw(CDC* pDC)[/size]
[size=84]{[/size]
[size=84] CDrBitmapDoc* pDoc = GetDocument();[/size]
[size=84] ASSERT_VALID(pDoc);[/size]
[size=84][color=#0000ff][size=84][color=#0000ff] if[/color][/size][/color][/size][size=84] (!pDoc)[/size]
[size=84][color=#0000ff][size=84][color=#0000ff] return[/color][/size][/color][/size][size=84];[/size]
[size=84][color=#008000][size=84][color=#008000] // Отрисовка битмапа...[/color][/size]
[/color][/size][size=84][color=#0000ff][size=84][color=#0000ff] if[/color][/size][/color][/size][size=84] (m_bmp.m_hObject != NULL)[/size]
[size=84] {[/size]
[size=84]   BITMAP bm;[/size]
[size=84]   m_bmp.GetBitmap(&bm);[/size][size=84][color=#008000]
[/color][/size][size=84]   CDC CompDC;[/size]
[size=84]   CompDC.CreateCompatibleDC(pDC);[/size]
[size=84]   CompDC.SelectObject(&m_bmp);[/size]
[size=84]   pDC->BitBlt(20, 20, bm.bmWidth, bm.bmHeight, &CompDC, 0, 0, SRCCOPY);[/size]
[size=84]   CompDC.DeleteDC();[/size]
[size=84] }[/size]
[size=84]}[/size]
[/size]
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

WinMain, там вообще-то StretchBlt делался. Картинка не просто выводилась, а ещё и растягивалась по размерам формы.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Заменить BitBlt на StretchBlt не проблема.
Мне главное было показать, как именно нужно отрисовывать картинку на поверхности окна, чтобы не писать лишний код.
Ответить