«

»

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;»расположены иконки, которым суждено изменяться, при нажатии кнопки «Рискнуть». Ниже у нас имеются 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();
}

 

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

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

5 комментариев

Перейти полю для комментария

  1. Олег

    Здаравствуйте, Александр! Спасибо вам за уроки! Можете пожалуйста подсказать хорошую книгу или хороший источник, где можно взять информацию по работе с MFC( желательно с объяснением работы с графикой) ?

    1. А. С. Третьяков

      По MFC мало в интернете учебных материалов. Может большинство предпочитают не продукты Microsoft, не знаю. Но если Вы заинтересованы можете посмотреть книгу Давыдова. Она хоть и устарела, все же является относительно новой.
      "Давыдов В. — Visual C++. Разработка Windows-приложений с помощью MFC и API-функций. 2008 год"
      Также можете посмотреть эти уроки на Ютубе, они 2011 года (загружены).

  2. Олег

    Спасибо за ответ. В том , что по MFC материалов мало я уже убедился, но я смог найти именно ту книгу которую вы советуете. Но возникла проблема с тем , что код, который приведен в книге не работает. Возможно, что я делаю что-то не правильно или возможно это из-за того, что я работаю в Visual Studio 2012 , а книга написана в 2008 году. А интересуюсь я этой темой по причине того, что мне надо сделать графический редактор на подобии Paint. Причем времени на это осталась неделя, а работа стоит на месте.

    1. А. С. Третьяков

      Прежде чем написать статьи про MFC, я так же нашел книгу и по ней пробовал что-то делать. Причем книга писалась для версии Visual 2008 или 2005, а я работал в 2010-ой. Код также приходилось изменять, это нормально. Насчет Paint, тут я навряд ли смогу помочь (не силен в Visual) разве, что в качестве основы могу посоветовать статью Visual C++. MFC. Работа с мышью. Или попробуйте установить Visual C++ 2008.

  3. Олег

    Спасибо за ответ. Буду искать дальше)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вы можете использовать эти теги HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Проверка на человечность *