Есть как минимум два способа вставки фоновой картинки на форму (на самом деле их больше, но эти два более распространенные). 1. Если нам нужно отобразить картинку только в определенном месте окна, то модно использовать метод отрисовки картинки в обработчике сообщения WM_PAINT case WM_PAINT: { HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint (hwnd, &ps); // грузим картинку HBITMAP hBitmap = LoadBitmap(hAppInstance,MAKEINTRESOURCE(IDB_BITMAP1)); // подготовим контекст HDC memDC = CreateCompatibleDC(hdc); HBITMAP OldBitmap = (HBITMAP)SelectObject(memDC,hBitmap); // получим размеры картинки BITMAP bm = {0}; GetObject(hBitmap,sizeof(bm),&bm); // нарисуем ее в углу BitBlt(hdc,0,0,bm.bmWidth,bm.bmHeight,memDC,0,0,SRCCOPY); // нарисуем что-то еще SelectObject(hdc,(HBRUSH)GetStockObject(NULL_BRUSH)); Ellipse(hdc,100,100,200,200); // уберем за собой SelectObject(memDC,OldBitmap); DeleteDC(memDC); EndPaint (hwnd, &ps); } return (0);
Тут неудобно то, что нам приходится при каждой перерисовке грузить картинку и создавать контекст, что замедляет работу программы. Для оптимизации можно создавать контекст и загружать картинку один раз в обработчике сообщения WM_CREATE или при первом вызове WM_PAINT
Второй способ подходит елси у нас картинка занимает все окно или нужно фон окна заливался повторяющейся фоновой картинкой. В этом случае в функции регистрации класса окна создаем кисть на основе загруженной картинки. WNDCLASSEX wndclassex = {0}; wndclassex.cbSize = sizeof(WNDCLASSEX); wndclassex.style = CS_HREDRAW | CS_VREDRAW; wndclassex.lpfnWndProc = WndProc; wndclassex.cbClsExtra = 0; wndclassex.cbWndExtra = 0; wndclassex.hInstance = hInstance; wndclassex.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclassex.hCursor = LoadCursor (NULL, IDC_ARROW);
// загрузим картинку из ресурса HBITMAP hBitmap = LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP1)); if (hBitmap) { // если получилось - создадим на ее основе кисть wndclassex.hbrBackground = CreatePatternBrush(hBitmap); } else { // если не получилось - выберем белую кисть wndclassex.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); } wndclassex.lpszMenuName = NULL; wndclassex.lpszClassName = szAppName; wndclassex.hIconSm = wndclassex.hIcon; RegisterClassEx (&wndclassex);
И все. Больше нам ничего не нужно делать, теперь система сама при перерисовке будет заполнять фон нашего окна нужной нам картинкой.