Заметки по работе с DirectX8.1 SDK и по созданию 3D-игр  
     
   
     
  [Базовые уроки по DirectX] [Основы DirectMusic на Delphi] [Основы DirectInput8 на Delphi] [Основы DirectSound8 на Delphi]  
  [Разработка компьютерной игры] [Пример игры Donuts3D]  
     
 

Что нужно знать для создания DirectX-приложений на C++ в среде Microsoft Visual Studio 2008

Урок 4 часть 2 Win32. Диалог выбора цвета, смена цвета фона окна приложения

 
     
 

Данный урок является введением в программирование на C++ в MSVS 2008

Вам нужно иметь установленную среду Microsoft Visual Studio 2005 или 2008 (можно триал),

и DirectX SDK 9 версии, или лучше самой последней - DirectX SDK August 2008.

 
     
  [назад] [далее] [к содержанию]  
     
  Мы рассматриваем основы программирования на C++ в среде программирования MSVS 2008  
     
 

Реализация данной задачи - вывод диалога выбора цвета, например при нажатии пункта меню Save, будет выглядеть так (код нужно добавить в функцию WndProc) -

case IDM_OPTIONS_SAVE:
{

//++ учебный код для отображения диалога выбора цвета при выборе пункта меню Save
CHOOSECOLOR chcol;
chcol.lStructSize = sizeof(CHOOSECOLOR);
chcol.hwndOwner = hWnd;
static COLORREF CustColorsArray[16];
chcol.lpCustColors = CustColorsArray;
chcol.Flags = CC_FULLOPEN;
ChooseColor(&chcol);

//++


}
break;

 
     
 

Выбранный цвет должен использоваться в качестве цвета рабочей области окна приложения

Получение доступа к цвету рабочей области окна приложения

В функции MyRegisterClass при регистрации окна осуществляется задание начального цвета рабочей области окна -

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

CreateSolidBrush

GetClassInfoEx

SetClassLongPtr(

Поиск информации по типу HBRUSH - на вкладке Index справки набрать HBRUSH, в списке вариантов выбрать HBRUSH, в открывшемся окне найти HBRUSH и открыть соответствующую ему тему brush

 

 
     
 
HBRUSH hbrush, hbrushOld;


// Create a brush.
hbrush = CreateSolidBrush(RGB(255, 0, 0));

// Select the new brush, and then draw.
hbrushOld = SelectObject(hdc, hbrush);

// Do not forget to clean up.
SelectObject(hdc, hbrushOld);
DeleteObject(hbrush);

 
     
 

Полный вариант: реализация поставленной задачи - вывод диалога выбора цвета и смена цвета рабочей области окна в соответствии с выбранным в диалоге цветом -

case IDM_OPTIONS_SAVE:
{

CHOOSECOLOR chcol;
chcol.lStructSize = sizeof(CHOOSECOLOR);
chcol.hwndOwner = hWnd;
static COLORREF CustColorsArray[16];
chcol.lpCustColors = CustColorsArray;
chcol.Flags = CC_FULLOPEN;
if (ChooseColor(&chcol))
//вызываем диалог и запоминаем выбранный цвет
WindowBackgroudColor = chcol.rgbResult;

if (hWindowBackgroundBrush) //удаляем созданную ранее кисть HBRUSH если она существовала
DeleteObject(hWindowBackgroundBrush);

hWindowBackgroundBrush = CreateSolidBrush(WindowBackgroudColor); //создаем новую кисть выбранного цвета

//задаем кисть в качестве фона окна приложения

SetClassLongPtr(hWnd, GCLP_HBRBACKGROUND, (LONG)hWindowBackgroundBrush);

//выполняем перерисовку окна, иначе фон изменится только после свертывания и развертывания окна
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);

//++


}
break;

Переменные

//++
COLORREF WindowBackgroudColor;
HBRUSH hWindowBackgroundBrush;
//++

объявляются в начале модуля приложения как глобальные

Обработчик сообщения WM_DESTROY примет следующий вид:

case WM_DESTROY:
{
if (hWindowBackgroundBrush)
DeleteObject(hWindowBackgroundBrush);
PostQuitMessage(0);
}
break;

 
     
 

Начальный цвет фона рабочей области окна задается в функции MyRegisterClass строкой кода -

//wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.hbrBackground = (HBRUSH)(COLOR_BACKGROUND+1);

при этом будет использован системный цвет заднего плана (по-умолчанию черный)

 
     
  Для задания произвольных цветов рабочей области нужно использовать HBRUSH по аналогии с тем, как это сделано в обработчике выбора пункта меню Save (IDM_OPTIONS_SAVE)  
     
   
в следующем уроке
 
             
  [назад] [далее] [к содержанию]  
             
 

Обновления и новости о развитии Delphi DirectX проекта
смотри на сайтах:

http://www.megainformaticsite.pochta.ru
http://www.megainformatic.narod.ru

 
             
             
  (c) Мега Информатик 2006-2009          
         
       

 

Hosted by uCoz