отображение bitmap'ов на форму в процессе работы программы
CPaintDC dc2(this);
CPaintDC dc1(this);
HGDIOBJ hBitmap;
CBitmap bitmap;
hBitmap = (HBITMAP)LoadImage(NULL, L"maps\\map_1.bmp", IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
bitmap.Attach(hBitmap);
CBitmap *pOldBmp;
CDC BmpDc;
BmpDc.CreateCompatibleDC(&dc1);
pOldBmp = (CBitmap *)BmpDc.SelectObject(&bitmap);
dc2.BitBlt(330,10,288,296,&BmpDc,0,0,SRCCOPY);
SetStretchBltMode(dc2.GetSafeHdc(),HALFTONE); //288 296
StretchBlt(dc2.GetSafeHdc(),630,10,200,200,dc2.GetSafeHdc(),330,10,288,296,SRCCOPY);
Он выводит два изображения - одно в натуральную величину, второе - копия, но немного в меньшем масштабе. Встало два вопроса:
1. этот код работает только если его поместить в обработку события OnPaint. Если его юзать где-то внутри моего кода, то ничего не отображается, даже если вызывать этот самый обработчик OnPaint или использовать UpdateWindow().. В чём дело? Как битмап отображать, например, при нажатии на определённую клавишу?
2. как убирать отображённый битмап с формы? =)
Заранее спасибо!
Попробуй в других местах кроме OnPaint использовать CClientDC а не CPaintDC,так как прследний должен использоваться только в обработчике отрисовки окна при WM_PAINT.
InvalidateWindow();
UpdateWindow();
засунь этот код в функцию принимающуюю в качестве параметра указатель на DC в котором необходимо нарисовать картинку. типа :
DrawBitmap( CDC* dc )
{
...
}
далее просто вызывай эту функцию когда тебе необходимо нарисовать Bitmap, не забывая передавать ей соответсвующий DC. так например, если где то ( не в OnPaint ) тебе надо нарисовать битмап :
CDC* dc = pWnd->GetDC();
DrawBitmap( dc );
где pWnd - указатель на окно в котором тебе надо нарисовать картинку.
Разобрался!
Только теперь встала другая проблема... Тот код, что я продемонстрировал выше (в первом посте), выводит на экран два изображения - оригинал и он же, только в уменьшеном виде. Представте, не могу понять, как не выводить изображение в оригинальном размере :\ :
CPaintDC dc2(this);
CPaintDC dc1(this);
HGDIOBJ hBitmap;
CBitmap bitmap;
hBitmap = (HBITMAP)LoadImage(NULL, L"maps\\map_1.bmp", IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
bitmap.Attach(hBitmap);
CBitmap *pOldBmp;
CDC BmpDc;
BmpDc.CreateCompatibleDC(&dc1);
pOldBmp = (CBitmap *)BmpDc.SelectObject(&bitmap);
dc2.BitBlt(330,10,288,296,&BmpDc,0,0,SRCCOPY); // тут загружаем в DC оригинал.
SetStretchBltMode(dc2.GetSafeHdc(),HALFTONE); //288 296
StretchBlt(dc2.GetSafeHdc(),630,10,200,200,dc2.Get SafeHdc(),330,10,288,296,SRCCOPY); // его в него же масштабируем
выводятся оба. Что делать? :\
Разобрался!
Только теперь встала другая проблема... Тот код, что я продемонстрировал выше (в первом посте), выводит на экран два изображения - оригинал и он же, только в уменьшеном виде. Представте, не могу понять, как не выводить изображение в оригинальном размере :\ :
CPaintDC dc2(this);
CPaintDC dc1(this);
HGDIOBJ hBitmap;
CBitmap bitmap;
hBitmap = (HBITMAP)LoadImage(NULL, L"maps\\map_1.bmp", IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
bitmap.Attach(hBitmap);
CBitmap *pOldBmp;
CDC BmpDc;
BmpDc.CreateCompatibleDC(&dc1);
pOldBmp = (CBitmap *)BmpDc.SelectObject(&bitmap);
dc2.BitBlt(330,10,288,296,&BmpDc,0,0,SRCCOPY); // тут загружаем в DC оригинал.
SetStretchBltMode(dc2.GetSafeHdc(),HALFTONE); //288 296
StretchBlt(dc2.GetSafeHdc(),630,10,200,200,dc2.Get SafeHdc(),330,10,288,296,SRCCOPY); // его в него же масштабируем
выводятся оба. Что делать? :\[/QUOTE]
дык... создай временый DC в памяти совместимый с данным, загружай исходное изображение в него а потом уже из него масштабируй в требуемый. если непонятно то скажи я напишу конкретный код.
Создаю два dc, масштабирую из одного в другой и тот, что не нужен, прибиваю: dc.DeleteDC(), но изображение всё равно выводится :\
ап =)