Как Вы уже знаете в Visual C++ программист может работать с множеством элементов, а также использовать ресурсы. В данном уроке речь пойдет о том, как в программе при помощи элемента Picture Control можно задействовать ресурс Icon. Рассматривать этот процесс мы будем по мере создания простого приложения, из серии азартных игр. Суть его работы следующая: пользователь нажимает кнопку, испытывая тем самым удачу, и зарабатывая, либо проигрывая деньги. Впрочем, суть урока не в самом приложении, а в том, чтобы показать как могут иконки меняться местами в элементах Picture Control.
Создайте новое приложение MFC с именем CardGames. В окне тип приложения выберите «На основе диалоговых окон», а также уберите галку с «Использовать библиотеки с поддержкой Юникода».
В следующем окне в поле диалоговое окно введите The CardGames Program, после чего можно нажимать Готово.
Откроется главная рабочая область, предназначенная для работы с приложением. Удалите с нее все элементы, и прежде чем двигаться далее нужно иметь соответствующие изображения. Их Вы можете сделать сами, после этого поместите четыре иконки в папку res вашего проекта. Теперь можно добавить их в саму программу, для этого в «Окне ресурсов» откройте папку icon, и вызвав контекстное меню правой кнопкой мыши, щелкните «Добавить ресурс…».
Появится окно «Добавление ресурса», выделите Icon и нажмите Import. Следует зайти в папку res проекта и от туда импортировать все четыре файла. После этого окно ресурсов будет выглядеть следующим образом:
Поменяем идентификатор каждой иконки на приведенные в таблице.
Название |
ID |
Misc34.ico |
IDI_HEART |
Misc35.ico |
IDI_CLUB |
Misc36.ico |
IDI_DIAMOND |
Misc37.ico |
IDI_SPADE |
Теперь можно разместить в диалоговом окне все необходимые элементы для нашей программы.
В свойствах изменим настройки элементов диалогового окна, так как это показано в таблице.
Объект |
Свойство |
Установка |
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.
Откройте файл 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_CARD1 — IDC_CARD4 переменные категории Control с именами m_Card1 — m_Card4, а элементу IDC_AMT_LEFT переменную m_Amt_Left той же категории. Далее, добавим переменную m_Amt_Remaining типа double в класс CCardGamesDlg, тем же самым способом как мы это делали ранее.
Пришло время связать код с событием BN_CLICKED кнопки «Рискнуть». Это мы сделаем классическим способом, а именно через «Мастер классов». В последнем, в поле «Имя класса» выберем CCardGamesDlg, и в окне «Команды» найдем объект IDC_DEALCARDS, к которому необходимо добавить обработчик 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, предназначение которой хранить значение выпавших карт одной масти.
Добавьте функцию с именем 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() } |
Здесь подсчитываются совпадения, случайным образом выпавшие в функции PickRandomCard. Наконец свяжем кнопку «Выплата» с событием BN_CLICKED, для этого добавим обработчик к объекту IDCANCEL в мастере классов.
Измените код функции 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(); } |
Тогда когда игрок пожелает закончить эту бессмысленную игру, он нажмет на кнопку «Выплата», после чего появится окно с суммой денег выигранных им.
Исходник данной программы Вы можете скачать пройдя на эту страницу.