Visual C++. MFC. Работа с иконками

Как Вы уже знаете в Visual C++ программист может работать с множеством элементов, а также использовать ресурсы. В данном уроке речь пойдет о том, как в программе при помощи элемента Picture Control можно задействовать ресурс Icon. Рассматривать этот процесс мы будем по мере создания простого приложения, из серии азартных игр. Суть его работы следующая: пользователь нажимает кнопку, испытывая тем самым удачу, и зарабатывая, либо проигрывая деньги. Впрочем, суть урока не в самом приложении, а в том, чтобы показать как могут иконки меняться местами в элементах Picture Control.

Создайте новое приложение MFC с именем CardGames. В окне тип приложения выберите «На основе диалоговых окон», а также уберите галку с «Использовать библиотеки с поддержкой Юникода».

В следующем окне в поле диалоговое окно введите The CardGames Program, после чего можно нажимать Готово.

Откроется главная рабочая область, предназначенная для работы с приложением. Удалите с нее все элементы, и прежде чем двигаться далее нужно иметь соответствующие изображения. Их Вы можете сделать сами, после этого поместите четыре иконки в папку res вашего проекта. Теперь можно добавить их в саму программу, для этого в «Окне ресурсов» откройте папку icon, и вызвав контекстное меню правой кнопкой мыши, щелкните «Добавить ресурс…».

Окно ресурсов в Visual C++. MFC

Появится окно «Добавление ресурса», выделите Icon и нажмите Import. Следует зайти в папку res проекта и от туда импортировать все четыре файла. После этого окно ресурсов будет выглядеть следующим образом:

Добавление иконок в проект MFC

Поменяем идентификатор каждой иконки на приведенные в таблице.

Название

ID

Misc34.ico

IDI_HEART

Misc35.ico

IDI_CLUB

Misc36.ico

IDI_DIAMOND

Misc37.ico

IDI_SPADE

Теперь можно разместить в диалоговом окне все необходимые элементы для нашей программы.

Диалоговое окно MFC игра, иконки

В свойствах изменим настройки элементов диалогового окна, так как это показано в таблице.

Объект

Свойство

Установка

Group Box

ID

IDC_AMT_LEFT

Caption

Осталось $ 100

Picture Control

ID

IDC_CARD1

Тип

Icon

Изображение

IDI_HEART

Picture Control

ID

IDC_CARD2

Тип

Icon

Изображение

IDI_CLUB

Picture Control

ID

IDC_CARD3

Тип

Icon

Изображение

IDI_DIAMOND

Picture Control

ID

IDC_CARD4

Тип

Icon

Изображение

IDI_SPADE

Group Box

ID

IDC_STATIC

Подпись

Payouts

Static Text

ID

IDC_STATIC

Подпись

2 совпадения\t\t\t3.00

Static Text

ID

IDC_STATIC

Подпись

3 совпадения\t\t\t6.00

Static Text

ID

IDC_STATIC

Подпись

4 совпадения\t\t\t9.00

Button

ID

IDC_DEALCARDS

Подпись

&Рискнуть

Button

ID

IDCANCEL

Подпись

&Выплата

Верхний элемент Group Box будет динамически показывать информацию об оставшихся денежных средствах. В нем также tr style=»mso-yfti-irow: 20;&##187;расположены иконки, которым суждено изменяться, при нажатии кнопки «Рискнуть». Ниже у нас имеются 3 статических надписи, они сообщают об удачных комбинациях. Кнопка «Выплата» нужна для вывода окна с суммой выигрыша, после которого программа завершится.

При помощи «Окна классов» добавим переменные с именами m_Club, m_Diamond, m_Spade, m_Heart и типом HICON в функцию CCardGamesDlg.

Добавление переменных в класс CCardGamesDlg

Откройте файл CardGamesDlg.cpp и в конец функции CCardGamesDlg добавьте такой код:

m_Club = AfxGetApp()->LoadIcon(IDI_CLUB);
m_Diamond = AfxGetApp()->LoadIcon(IDI_DIAMOND);
m_Heart = AfxGetApp()->LoadIcon(IDI_HEART);
m_Spade = AfxGetApp()->LoadIcon(IDI_SPADE);

Данные операторы будут загружать параметры иконок в переменные-объекты. Сейчас свяжем элементы управления иконками с переменными, необходимыми для смены иконок. Для этого откройте «Мастер классов» и во вкладке «Переменные-члены» добавьте иконкам IDC_CARD1IDC_CARD4 переменные категории Control с именами m_Card1m_Card4, а элементу IDC_AMT_LEFT переменную m_Amt_Left той же категории. Далее, добавим переменную m_Amt_Remaining типа double в класс CCardGamesDlg, тем же самым способом как мы это делали ранее.

Пришло время связать код с событием BN_CLICKED кнопки «Рискнуть». Это мы сделаем классическим способом, а именно через «Мастер классов». В последнем, в поле «Имя класса» выберем CCardGamesDlg, и в окне «Команды» найдем объект IDC_DEALCARDS, к которому необходимо добавить обработчик OnDealcards.

Добавление функции-члена OnDealcards

После нажатия кнопки «Изменить код», добавьте следующий код в тело функции OnDealcards.

1
2
3
4
5
6
7
8
9
10
11
12
13
void CCardGamesDlg::OnDealcards()
{
//Вычитываем два доллара при раздачи
m_Amt_Remaining=2.00;
//Раздача карт
DealCards();
//Подсчет выйгрыша
CalculateWinnings();
//Измение заголовка Group Box
CString s;
s.Format(«Amount Remaining $ %.2f», m_Amt_Remaining);
m_Amt_Left.SetWindowText(s);
}

Не обращайте внимания на ошибки, они исчезнут после того как позже мы добавим всё необходимое. А пока добавьте переменную m_Cards[5] типа int в конец файла CardGamesDlg.h, предназначение которой хранить значение выпавших карт одной масти.

Переменная в файле CardGamesDlg.h

Добавьте функцию с именем DealCards в класс CCardGamesDlg, в качестве типа укажите void. Вас должно перебросить в файл CardGamesDlg.cpp, там измените только что созданную, так как это сделано ниже.

1
2
3
4
5
6
7
8
9
10
void CCardGamesDlg::DealCards()
{
//Обнуление значений карт одной масти
for(int i=0; i<4;i++) m_Cards[i]=0;
//Меняем иконку
m_Card1.SetIcon(PickRandomCard());
m_Card2.SetIcon(PickRandomCard());
m_Card3.SetIcon(PickRandomCard());
m_Card4.SetIcon(PickRandomCard());
}

Первая строка в теле функции обнуляет значение выпавших карт одной масти для каждой масти. Далее программа при помощи пока еще не созданной функции PickRandomCard будет случайным образом менять иконки.

Добавим функцию с именем PickRandomCard и типом HICON& в класс CCardGamesDlg. Здесь символ обозначает адрес объекта. Измените функцию следующим образом.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
HICON& CCardGamesDlg::PickRandomCard()
{
//Выбор случайного номера карты
int num=(rand()%4);
//Проссумировать карты одной масти
m_Cards[num]++;
//Вернуть адрес иконки
switch(num)
{
case 0: return m_Club;
case 1: return m_Diamond;
case 2: return m_Heart;
}
return m_Spade;
}

Как Вы помните, в главной функции OnDealcards прописана функция подсчета выигрыша, но на данный момент она отсутствует. Чтобы исправить это добавьте ее в класс CCardGamesDlg, в качестве возвращаемого значения укажите тип void. Измените тело функции:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

void CCardGamesDlg::CalculateWinnings()
{
int pairs=0;
for(int i=0; i<4; i++)
{
if(m_Cards[i]==2)
{
if(pairs>0)
{
m_Amt_Remaining+=3.00;
break;
}
else
{
pairs++;
}
}
else if(m_Cards[i]==3)
{
m_Amt_Remaining+=6.00;
break;

}
else if (m_Cards[i]==4)
{
m_Amt_Remaining+=9.00;
break;
}
}
}

Здесь подсчитываются совпадения, случайным образом выпавшие в функции PickRandomCard. Наконец свяжем кнопку «Выплата» с событием BN_CLICKED, для этого добавим обработчик к объекту IDCANCEL в мастере классов.

Добавление события BN_CLICKED к кнопки ВыПЛАТА. Visual C++

Измените код функции OnBnClickedCancel.

1
2
3
4
5
6
7
8
9
void CCardGamesDlg::OnBnClickedCancel()
{
CString s;
//Строка с размером выйгрыша
s.Format(«Good game! I have $ %.2f.»,m_Amt_Remaining);
//Выдать сообщения
MessageBox(s,«Thank you for game in FourUp!»);
CDialogEx::OnCancel();
}

Тогда когда игрок пожелает закончить эту бессмысленную игру, он нажмет на кнопку «Выплата», после чего появится окно с суммой денег выигранных им.

Исходник данной программы Вы можете скачать пройдя на эту страницу.

Рейтинг
( Пока оценок нет )
Загрузка ...