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);
Загрузка BMP из ресурсов
Код:
Обработчик WM_PAINT делает все правильно. Проблема видимо в самой последней строке, а может быть я неправильно загружаю BMP из ресурсов? Так или иначе, но картинка в окне (реальном) не рисуется. Как быть :???:
Цитата:
Originally posted by Easy Coder
Имеется задача: Нужно загрузить BMP-картинку из ресурсов и скопировать ее в виртуальное окно. Обработчик WM_PAINT должен копировать содержимое виртуального окна в реальное. Далее см. код
Обработчик WM_PAINT делает все правильно. Проблема видимо в самой последней строке, а может быть я неправильно загружаю BMP из ресурсов? Так или иначе, но картинка в окне (реальном) не рисуется. Как быть :???:
Имеется задача: Нужно загрузить 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);
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);
теперь по существу
что значит "не рисуется"? ничего вообще не происходит или выводится мусор? пройдись дебаггером, посмотри, какая функция выдает ошибку
Код:
bmpBm = LoadBitmap(hInst, "BMP_1");
bmpBm равно нулю. В этом, видимо, и заключается ошибка. Если писать под MFC, то все работает, а здесь... Описания функции LoadBitmap не нашел ни в одном help'е.
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
Цитата: Easy Coder
Дебаггер показывает, что в результате выполнения вот этой строки
bmpBm равно нулю. В этом, видимо, и заключается ошибка. Если писать под MFC, то все работает, а здесь... Описания функции LoadBitmap не нашел ни в одном help'е.
Код:
bmpBm = LoadBitmap(hInst, "BMP_1");
bmpBm равно нулю. В этом, видимо, и заключается ошибка. Если писать под MFC, то все работает, а здесь... Описания функции LoadBitmap не нашел ни в одном help'е.
Могу предложить два варинта:
Код:
LoadBitmap(hInst, _T("BMP_1"));
и
Код:
LoadBitmap(hInst, MAKEINTRESOURCE(BMP_1));
ruprogman, как ты думаешь, человек за 5 (!!!) лет нашел решение, или все сидел тебя ждал?
oxotnik333, пардон, я ж новичок, дату не смотрел :D:D:D