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

Ваш аккаунт

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

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

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

Загрузка BMP из ресурсов

3.9K
16 января 2004 года
Easy Coder
12 / / 07.12.2003
Имеется задача: Нужно загрузить BMP-картинку из ресурсов и скопировать ее в виртуальное окно. Обработчик WM_PAINT должен копировать содержимое виртуального окна в реальное. Далее см. код

Код:
HWND hWnd;

HDC vDc;
HBITMAP hBmp;
HBRUSH hBr;

HDC bmpDc;
HBITMAP bmpBm;

// создаем виртуальное окно
vDc = CreateCompatibleDC(GetDC(hWnd));
hBmp = CreateCompatibleBitmap(GetDC(hWnd), 800, 600);
SelectObject(vDc, (HGDIOBJ)hBmp);

// закрашиваем его белым цветом
hBr = (HBRUSH)GetStockObject(WHITE_BRUSH);
SelectObject(vDc, (HGDIOBJ)hBr);
PatBlt(vDc, 0, 0, 800, 600, PATCOPY);

// загружаем из ресурсов BMP-картинку
bmpBm = LoadBitmap(hInst, "BMP_1");
bmpDc = CreateCompatibleDC(vDc);
SelectObject(bmpDc, (HGDIOBJ)bmpBm);

// обработчик WM_PAINT просто копирует содержимое vDc в
// контекст устройства, связанный с окном hWnd
BitBlt(GetDC(hWnd), 0, 0, 800, 600, vDc, 0, 0, SRCCOPY);

// а вот эта строка должна копировать содержимое bmpDc в vDc
// т.е. картинку в виртуальное окно
BitBlt(vDc, 0, 0, 32, 32, bmpDc, 0, 0, SRCCOPY);


Обработчик WM_PAINT делает все правильно. Проблема видимо в самой последней строке, а может быть я неправильно загружаю BMP из ресурсов? Так или иначе, но картинка в окне (реальном) не рисуется. Как быть :???:
401
16 января 2004 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by Easy Coder
Имеется задача: Нужно загрузить BMP-картинку из ресурсов и скопировать ее в виртуальное окно. Обработчик WM_PAINT должен копировать содержимое виртуального окна в реальное. Далее см. код

Код:
HWND hWnd;

HDC vDc;
HBITMAP hBmp;
HBRUSH hBr;

HDC bmpDc;
HBITMAP bmpBm;

// создаем виртуальное окно
vDc = CreateCompatibleDC(GetDC(hWnd));
hBmp = CreateCompatibleBitmap(GetDC(hWnd), 800, 600);
SelectObject(vDc, (HGDIOBJ)hBmp);

// закрашиваем его белым цветом
hBr = (HBRUSH)GetStockObject(WHITE_BRUSH);
SelectObject(vDc, (HGDIOBJ)hBr);
PatBlt(vDc, 0, 0, 800, 600, PATCOPY);

// загружаем из ресурсов BMP-картинку
bmpBm = LoadBitmap(hInst, "BMP_1");
bmpDc = CreateCompatibleDC(vDc);
SelectObject(bmpDc, (HGDIOBJ)bmpBm);

// обработчик WM_PAINT просто копирует содержимое vDc в
// контекст устройства, связанный с окном hWnd
BitBlt(GetDC(hWnd), 0, 0, 800, 600, vDc, 0, 0, SRCCOPY);

// а вот эта строка должна копировать содержимое bmpDc в vDc
// т.е. картинку в виртуальное окно
BitBlt(vDc, 0, 0, 32, 32, bmpDc, 0, 0, SRCCOPY);


Обработчик WM_PAINT делает все правильно. Проблема видимо в самой последней строке, а может быть я неправильно загружаю BMP из ресурсов? Так или иначе, но картинка в окне (реальном) не рисуется. Как быть :???:



для начала енсколько замечаний:

использование CreateCompatibleDC(GetDC(hWnd)), CreateCompatibleBitmap(GetDC(hWnd) некорректно - каждому вызову GetDC должен соответствовать вызов ReleaseDC, иначе через некоторое время кончатся GDI ресурсы и система может зависнуть (п крайней мере Win98).



эту часть:
// закрашиваем его белым цветом
hBr = (HBRUSH)GetStockObject(WHITE_BRUSH);
SelectObject(vDc, (HGDIOBJ)hBr);
PatBlt(vDc, 0, 0, 800, 600, PATCOPY);
можно заменить одной строчкой
BitBlt(vDC, ..., WHITENESS);

теперь по существу
что значит "не рисуется"? ничего вообще не происходит или выводится мусор? пройдись дебаггером, посмотри, какая функция выдает ошибку

3.9K
17 января 2004 года
Easy Coder
12 / / 07.12.2003
Дебаггер показывает, что в результате выполнения вот этой строки

 
Код:
bmpBm = LoadBitmap(hInst, "BMP_1");


bmpBm равно нулю. В этом, видимо, и заключается ошибка. Если писать под MFC, то все работает, а здесь... Описания функции LoadBitmap не нашел ни в одном help'е.
6.3K
17 января 2004 года
Nataris
2 / / 17.01.2004
[COLOR=blue]LoadBitmap
The LoadBitmap function loads the specified bitmap resource from a module's executable file. This function has been superseded by theLoadImage function.

HBITMAP LoadBitmap(
HINSTANCE hInstance, // handle to application instance
LPCTSTR lpBitmapName // address of bitmap resource name
);

Parameters
hInstance
Handle to the instance of the module whose executable file contains the bitmap to be loaded.
lpBitmapName
Pointer to a null-terminated string that contains the name of the bitmap resource to be loaded. Alternatively, this parameter can consist of the resource identifier in the low-order word and zero in the high-order word. TheMAKEINTRESOURCE macro can be used to create this value.
Return Values
If the function succeeds, the return value is the handle to the specified bitmap.

If the function fails, the return value is NULL.[/COLOR]


ПРОВЕРЬ ПРАВИЛЬНОСТЬ ПАРАМЕТРОВ В LoadBitmap
52K
26 октября 2009 года
ruprogman
20 / / 26.10.2009
Цитата: Easy Coder
Дебаггер показывает, что в результате выполнения вот этой строки

 
Код:
bmpBm = LoadBitmap(hInst, "BMP_1");


bmpBm равно нулю. В этом, видимо, и заключается ошибка. Если писать под MFC, то все работает, а здесь... Описания функции LoadBitmap не нашел ни в одном help'е.



Могу предложить два варинта:

 
Код:
LoadBitmap(hInst, _T("BMP_1"));

и
 
Код:
LoadBitmap(hInst, MAKEINTRESOURCE(BMP_1));
11
26 октября 2009 года
oxotnik333
2.9K / / 03.08.2007
ruprogman, как ты думаешь, человек за 5 (!!!) лет нашел решение, или все сидел тебя ждал?
52K
26 октября 2009 года
ruprogman
20 / / 26.10.2009
oxotnik333, пардон, я ж новичок, дату не смотрел :D:D:D
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог