// Done by TheTutor -- 7/05/01 (Updated Last: 9/29/02)
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com
/* Сейчас мы будем рисовать, используя HBRUSH --
HBRUSH это ничто иное, как ссылка на кисть. Как и в жизни,
кисти используются для закрашивания. В этой программе, наша
кисть будет закрашивать эллипсы, выводимые на экран.
*/
#include <windows.h>
#define WIN_WIDTH 320
#define WIN_HEIGHT 240
// Глобальные переменные ---
HDC hdc = NULL; // Это будет глобальный контекст устройства для рисования
HBITMAP pattern_bmp = NULL; // Ссылка на bitmap изображение для образца кисти
// Стандартная callback функция
LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprev, PSTR cmdline, int ishow)
{
char class_name[] = "GameTutorials";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclassex = {0};
// Заполняем нужные нам поля
wndclassex.cbSize = sizeof(WNDCLASSEX);
wndclassex.style = CS_HREDRAW | CS_VREDRAW;
wndclassex.lpfnWndProc = WinProc;
wndclassex.hInstance = hinstance;
wndclassex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclassex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclassex.lpszClassName = class_name;
RegisterClassEx(&wndclassex); // Регистрируем окно
hwnd = CreateWindowEx(NULL, // Нет дополнительных атрибутов окна
class_name,
"Drawing with HBRUSHs",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, // Координата x окна по умолчанию
CW_USEDEFAULT, // Координата y окна по умолчанию
WIN_WIDTH,
WIN_HEIGHT,
NULL,
NULL,
hinstance,
NULL);
// Проверка на ошибку
if(!hwnd)
return EXIT_FAILURE; // Случилось что-то плохое
hdc = GetDC(hwnd); // Получаем контекст устройства окна
// Проверка на ошибку
if(!hdc)
return EXIT_FAILURE; // Не смогли получить hdc окна
// Загружаем bitmap изображение (для образца кисти)
pattern_bmp = (HBITMAP)LoadImage(hinstance,"bitmap.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
// Проверка на ошибку
if(!pattern_bmp)
return EXIT_FAILURE; // Не смогли загрузить bitmap
ShowWindow(hwnd, ishow);
UpdateWindow(hwnd);
while(1)
{
// Получить сообщения, если есть
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
// Здесь можно проводить все вычисления
}
}
// Освобождаем глобальный HDC
ReleaseDC(hwnd,hdc);
DeleteObject(pattern_bmp); // Освобождаем bitmap
UnregisterClass(class_name,hinstance); // Освобождаем WNDCLASSEX
return msg.wParam;
}
// Оконная процедура
LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
HBRUSH hbrush; // Это наша кисть для рисования
HBRUSH old_brush; // Здесь будет храниться "старая кисть"
// Нам нужно сохранить ее, чтобы освободить память после рисования
PAINTSTRUCT ps;
// В зависимости от сообщения, мы выполняем различные действия
switch(message)
{
// Это сообщение посылается каждый раз, когда нажата клавиша
case WM_KEYDOWN:
switch(wparam) // wparam хранит виртуальный код нажатой клавиши
{
case VK_F1: // Если нажата клавиша 'F1'
// Создаем "Hatch Brush" (кисть со штриховкой)
// -- Есть несколько стилей для кисти hatch brush
// (подробнее внизу) -- RGB() это цвет кисти
hbrush = CreateHatchBrush(HS_FDIAGONAL,RGB(22,22,22));
old_brush = (HBRUSH)SelectObject(hdc,hbrush);
/* Эта функция делает то, что вы и ожидаете - она рисует эллипс,
используя текущий hbrush для его закраски.
hdc это контекст устройства, где нужно рисовать
30,30 (x,y) это верхний левый угол прямоуольника, описывающего эллипс
130,130 (x,y) это нижний правый угол
*/
Ellipse(hdc,30,30,130,130);
// -- Мы нарисовали что хотели, освободим память --
SelectObject(hdc,old_brush); // Сперва выберем старую кисть
DeleteObject(hbrush); // Затем удалим созданную нами кисть
break;
case VK_F2: // Если нажата клавиша 'F2'
// Создаем кисть "с заданным рисунком". Это стиль кисти, который
// определяется передаваемым в функцию CreatePatternBrush() рисунком
// bitmap
// **Замечение
// bitmap рисунок может быть только размером 8x8 пикселей
// (в противном случае он будет усечен)
hbrush = CreatePatternBrush(pattern_bmp);
old_brush = (HBRUSH)SelectObject(hdc,hbrush);
Ellipse(hdc,150,50,175,150);
SelectObject(hdc,old_brush);
DeleteObject(hbrush);
break;
case VK_F3: // Если нажата клавиша 'F3'
// Создаем кисть со сплошной заливкой передаваемым цветом
hbrush = CreateSolidBrush(RGB(25,255,25));
old_brush = (HBRUSH)SelectObject(hdc,hbrush);
Ellipse(hdc,190,30,290,130);
SelectObject(hdc,old_brush);
DeleteObject(hbrush);
break;
} // конец switch(wparam)
return 0;
case WM_PAINT:
BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
case WM_CLOSE:
PostQuitMessage(0);
return 0;
} // конец switch(message)
return DefWindowProc(hwnd, message, wparam, lparam);
}
/* ADD ON
Есть и другие стили для Hatch Brush:
HS_BDIAGONAL -- диагональная штриховка 45 градусов слева-направо
HS_CROSS -- двойная штриховка без наклона
HS_DIAGCROSS -- двойная штриховка 45 градусов
HS_FDIAGONAL -- диагональная "верхняя" штриховка 45 градусов слева-направо
HS_HORIZONTAL -- горизонтальная штриховка
HS_VERTICAL -- вертикальная штриховка
*/
/*
| TheTutor
| thetutor@gametutorials.com
| © 2001 GameTutorials
*/
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com
|