Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

отображение bitmap'ов на форму в процессе работы программы

318
29 сентября 2006 года
nof
193 / / 03.04.2006
Ребят, тут встала такая проблема. Есть код:

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. как убирать отображённый битмап с формы? =)

Заранее спасибо!
406
29 сентября 2006 года
vitaly2003s
481 / / 27.07.2004
Попробуй в других местах кроме OnPaint использовать CClientDC а не CPaintDC,так как прследний должен использоваться только в обработчике отрисовки окна при WM_PAINT.
398
30 сентября 2006 года
Alexandoros
630 / / 21.10.2005
рисовать нужно в OnPaint, а в проге нужно

InvalidateWindow();
UpdateWindow();
351
02 октября 2006 года
PitxBull
633 / / 22.12.2004
[QUOTE=nof]1. этот код работает только если его поместить в обработку события OnPaint. Если его юзать где-то внутри моего кода, то ничего не отображается, даже если вызывать этот самый обработчик OnPaint или использовать UpdateWindow().. В чём дело? Как битмап отображать, например, при нажатии на определённую клавишу?[/QUOTE]
засунь этот код в функцию принимающуюю в качестве параметра указатель на DC в котором необходимо нарисовать картинку. типа :

DrawBitmap( CDC* dc )
{
...
}

далее просто вызывай эту функцию когда тебе необходимо нарисовать Bitmap, не забывая передавать ей соответсвующий DC. так например, если где то ( не в OnPaint ) тебе надо нарисовать битмап :

CDC* dc = pWnd->GetDC();

DrawBitmap( dc );

где pWnd - указатель на окно в котором тебе надо нарисовать картинку.
318
05 октября 2006 года
nof
193 / / 03.04.2006
Спасибо!
Разобрался!

Только теперь встала другая проблема... Тот код, что я продемонстрировал выше (в первом посте), выводит на экран два изображения - оригинал и он же, только в уменьшеном виде. Представте, не могу понять, как не выводить изображение в оригинальном размере :\ :

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); // его в него же масштабируем

выводятся оба. Что делать? :\
351
06 октября 2006 года
PitxBull
633 / / 22.12.2004
[QUOTE=nof]Спасибо!
Разобрался!

Только теперь встала другая проблема... Тот код, что я продемонстрировал выше (в первом посте), выводит на экран два изображения - оригинал и он же, только в уменьшеном виде. Представте, не могу понять, как не выводить изображение в оригинальном размере :\ :

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 в памяти совместимый с данным, загружай исходное изображение в него а потом уже из него масштабируй в требуемый. если непонятно то скажи я напишу конкретный код.
318
08 октября 2006 года
nof
193 / / 03.04.2006
[QUOTE=PitxBull]дык... создай временый DC в памяти совместимый с данным, загружай исходное изображение в него а потом уже из него масштабируй в требуемый. если непонятно то скажи я напишу конкретный код.[/QUOTE]
Создаю два dc, масштабирую из одного в другой и тот, что не нужен, прибиваю: dc.DeleteDC(), но изображение всё равно выводится :\
318
09 октября 2006 года
nof
193 / / 03.04.2006
ап =)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог