Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ch-09.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
258 Кб
Скачать
☆

Битовые образы: картинки в пикселях

Мы уже говорили об использовании битовых образов в значках и курсорах. В Windows также включен тип ресурсов с именем BITMAP.

Битовые образы используются в двух главных целях. Первая — рисование на экране картинок. Например, файлы драйверов дисплеев в Windows содержат массу крошечных битовых образов, которые используются для рисования стрелок в полосах прокрутки, галочек в раскрывающихся меню, изображений на кнопках изменения размеров окна, флажках и переключателях. Вы можете использовать битовые образы в меню (как показано в главе 10) и панелях инструментов приложений (как показано в главе 12). В таких программах, как Paint, битовые образы используются для изображения графического меню.

Вторая цель использования битовых образов — создание кистей. Кисти, как вы уже знаете, являются шаблонами пикселей, которые Windows использует для закрашивания изображаемых на экране областей.

Использование битовых образов и кистей

Программа RESOURC2, приведенная на рис. 9.2, является модернизированной версией программы RESOURC1, включающей в себя ресурс монохромного битового образа, используемый для создания кисти фона рабочей области. С помощью редактора изображений был создан битовый образ размерами 8 на 8 пикселей, что является минимальным размером для кисти.

RESOURC2.MAK

#------------------------

# RESOURC2.MAK make file

#------------------------

resourc2.exe : resourc2.obj resourc2.res

$(LINKER) $(GUIFLAGS) -OUT:resourc2.exe \

resourc2.obj resourc2.res $(GUILIBS)

resourc2.obj : resourc2.c

$(CC) $(CFLAGS) resourc2.c

resourc2.res : resourc2.rc resourc2.ico resourc2.cur resourc2.bmp

$(RC) $(RCVARS) resourc2.rc

RESOURC2.C

/*-----------------------------------------------------------

RESOURC2.C -- Icon and Cursor Demonstration Program No. 2

(c) Charles Petzold, 1996

-----------------------------------------------------------*/

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

char szAppName[] = "Resourc2" ;

HINSTANCE hInst ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

HBITMAP hBitmap ;

HBRUSH hBrush ;

HWND hwnd ;

MSG msg ;

WNDCLASSEX wndclass ;

hBitmap = LoadBitmap (hInstance, szAppName) ;

hBrush = CreatePatternBrush (hBitmap) ;

wndclass.cbSize = sizeof (wndclass) ;

wndclass.style = CS_HREDRAW | CS_VREDRAW ;

wndclass.lpfnWndProc = WndProc ;

wndclass.cbClsExtra = 0 ;

wndclass.cbWndExtra = 0 ;

wndclass.hInstance = hInstance ;

wndclass.hIcon = LoadIcon (hInstance, szAppName) ;

wndclass.hCursor = LoadCursor (hInstance, szAppName) ;

wndclass.hbrBackground = hBrush ;

wndclass.lpszMenuName = NULL ;

wndclass.lpszClassName = szAppName ;

wndclass.hIconSm = LoadIcon (hInstance, szAppName) ;

RegisterClassEx (&wndclass) ;

hInst = hInstance ;

hwnd = CreateWindow (szAppName, "Icon and Cursor Demo",

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT,

NULL, NULL, hInstance, NULL) ;

ShowWindow (hwnd, iCmdShow) ;

UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0))

{

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

}

DeleteObject ((HGDIOBJ) hBrush) ; // clean-up

DeleteObject ((HGDIOBJ) hBitmap) ;

return msg.wParam ;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

static HICON hIcon ;

static int cxIcon, cyIcon, cxClient, cyClient ;

HDC hdc ;

PAINTSTRUCT ps ;

int x, y ;

switch (iMsg)

{

case WM_CREATE :

hIcon = LoadIcon (hInst, szAppName) ;

cxIcon = GetSystemMetrics (SM_CXICON) ;

cyIcon = GetSystemMetrics (SM_CYICON) ;

return 0 ;

case WM_SIZE :

cxClient = LOWORD (lParam) ;

cyClient = HIWORD (lParam) ;

return 0 ;

case WM_PAINT :

hdc = BeginPaint (hwnd, &ps) ;

for (y = cyIcon ; y < cyClient ; y += 2 * cyIcon)

for (x = cxIcon ; x < cxClient ; x += 2 * cxIcon)

DrawIcon (hdc, x, y, hIcon) ;

EndPaint (hwnd, &ps) ;

return 0 ;

case WM_DESTROY :

PostQuitMessage (0) ;

return 0 ;

}

return DefWindowProc (hwnd, iMsg, wParam, lParam) ;

}

RESOURC2.RC

/*-----------------------------

RESOURC2.RC resource script

-----------------------------*/

resourc2 ICON resourc2.ico

resourc2 CURSOR resourc2.cur

resourc2 BITMAP resourc2.bmp

RESOURC2.BMP

RESOURC2.CUR

RESOURC2.ICO

Рис. 9.2. Программа RESOURC2, содержащая значок, курсор и битовый образ

Битовый образ включается в файл описания ресурсов в том же формате, что значок или курсор:

resourc2 BITMAP resourc2.bmp

Используемая в WinMain функция LoadBitmap аналогична функциям LoadIcon и LoadCursor. Ее возвращаемым значением является описатель битового образа:

hBitmap = LoadBitmap (hInstance, szAppName);

Этот описатель затем используется для создания шаблонной кисти (pattern brush). Основой кисти является битовый образ:

hBrush = CreatePatternBrush (hBitmap);

Когда Windows закрашивает этой кистью область экрана, битовый образ повторяется по горизонтали и вертикали через каждые восемь пикселей. Эта кисть нам нужна для придания фону рабочей области того цвета, который мы подобрали при определении класса окна:

wndclass.hbrBackground = hBrush;

Главное отличие между битовыми образами и остальными ресурсами в их практической важности и может быть легко выражено так: битовые образы являются объектами GDI. Хороший стиль составления программ рекомендует, что битовые образы должны быть удалены из программы, если в них отпадает нужда, или если программа завершается. В программе RESOURC2 это происходит по завершении работы функции WinMain:

DeleteObject((HGDIOBJ) hBrush);

DeleteObject((HGDIOBJ) hBitmap);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]