Школа создателей компьютерных игр

BannerDrive.ru
[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

HBRUSHs (кисти)



Подпишитесь на рассылку "Создание компьютерных игр"

Рассылки Subscribe.Ru
Создание компьютерных игр

Рассылка выходит раз в месяц.


Понравился сайт? Узнайте, как помочь сайту.


Рекомендуемые книги


Андре Ламот.
Программирование трехмерных игр для Windows. Советы профессионала по трехмерной графике и растеризации


Андре Ламот.
Программирование игр для Windows. Советы профессионала


Проголосуйте за сайт в рейтинге GameTop!
(нажмите на кнопку рейтинга)

GameTop - рейтинг игровых ресурсов. Портал Rolemancer (www.rolemancer.ru)

Не забывайте, что результаты рейтинга обновляются раз в неделю. Пожалуйста, голосуйте почаще!


Статистика посещаемости

Rambler's Top100

HPENs (перья) | Все обучалки раздела | Рисование контуров

Описание

Рассказывается о том, что такое HBRUSHs (кисти), и как использовать их для заполнения контуров.

Программа рисует эллипсы (при нажатии функциональных клавиш, таких как F1), используя различные кисти для их заливки.

Скачать обучалку (Visual C++ 6)

Работа программы

Исходный код

// 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

Скачать обучалку (Visual C++ 6)

HPENs (перья) | Все обучалки раздела | Рисование контуров

[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Copyright © 2003-2005 Евгений Казеко. Все права защищены. E-mail: evgeniy@kazeko.com

Блок контейнер бытовка для строительной плошадки. , Мы здесь ремонт компьютеров Ижевск окажем быстро, надежно , В расчете КАСКО участвуют и технические характеристики автомобиля: его мощность.