kvv's home

Форма входа

Категории раздела

Лекции [14]
Разное [4]
Статьи на тему WM, не попавшие в лекции по разным причинам.

Поиск

Каталог статей

Главная » Статьи » Программирование под Windows Mobile » Лекции

Background Image - картинка в фоне окна.
Есть как минимум два способа вставки фоновой картинки на форму (на самом деле их больше, но эти два более распространенные).
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);



И все. Больше нам ничего не нужно делать, теперь система сама при перерисовке будет заполнять фон нашего окна нужной нам картинкой.


Категория: Лекции | Добавил: kvv (23.07.2008) | Автор: Владимир Кошелев E W
Просмотров: 4023 | Комментарии: 1 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Друзья сайта

  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Облако тэгов