Руководство пользователя. Тестирование




Для запуска программы – открыть файл testSoundPlay.ехе, находящийся в исходной папке. После запуска файла, открывается приложение в котором мы можем добавить аудио файл нажав на кнопку воспроизвести, а при открытии дополнительного меню мы можем добавить несколько файлов в очередь воспроизведения (см. Рис. 1).

Рис. 1 – Общий интерфейс программы

После нажатия на кнопку «Добавить трек» приложение выведет всплывающие окно с выбором пути к файлу (см. рис. 2), а также добавит файл в плейлист. В случае удачного добавления сохранит файл в очередь (см. рис. 3).

Рис. 2 – Открытие файла

Рис. 3 – Трек добавлен

После нажатия на кнопку «Удалить трек», удалит выделенный файл из очереди (см. рис. 4).

Рис. 4 – Удаление трека

Тестирование

Проверка работоспособности кнопок

Рассмотрим ситуацию, когда пользователь дает команду воспроизвести, не добавив не одного трека. После нажатия на кнопку «Play» программа предлагает пользователю выбрать файл для воспроизведения. Это сделано для того чтобы программа не зависала.

 

Вывод

Проведенное тестирование программы выявило несколько ошибок, которые были легко устранены.

В целом можно сделать вывод, что тестирование прошло успешно.

 

ЗАКЛЮЧЕНИЕ

При выполнении данной работы, потребовались высокие знание языка программирования. В ходе написания программы требовалось обращаться к дополнительным источникам, чтобы более подробно разобраться с графическим интерфейсом Windows, который доступен для использования в этой среде с помощью заголовочного файла windows.h.

Разработана программа воспроизведения звуковых файлов, которая может служить наглядным примером использования функций графики интерфейса Windows API.

Тестирование прошло отлично, выявлен ряд ошибок, которые удалось быстро устранить.

В целом данная работа помогла лучше освоить язык С++ и улучшить свои знания в WinAPI.

В дальнейшем планируется усовершенствовать данную работу:

· Улучшить интерфейс программы;

 

СПИСОК ЛИТЕРАТУРЫ

1. Азарченков, А.А. Оформление текстовых документов: методические указания для студентов всех форм обучения всех специальностей/ А.А. Азарченков. Брянск: БГТУ, 2012. – 45с.

2. Булатицкий, Д.И. Методические указания к выполнению курсового проекта/ Д.И. Булатицкий. Брянск: БГТУ, 2006. – 7с.

3. Аммерал, Л. Принципы программирования в машинной графике. Перевод с английского В.А. Львова. (Москва: Издательство «Сол Систем», 1992. - Серия «Машинная графика на языке СИ»).

4. Румянцев, П.В. Азбука программирования в Win32 Api. – 4 изд. – М.: «Горячая линия – Телком»/ П.В. Румянцев. 2004. – 312 стр.

5. Павловская, Т.А. C/C++. Программирование на языке высокого уровня/ Т. А. Павловская – СПБ.: Питер, 2006. – 246 с.

6. Подбельский, В.В. Программирование на языке Си: учеб. пособие/ Подбельский, С.С. Фоними-финансы и статистика, 2005 – 600с.

7. Шильдт, Г. Самоучитель C++: Пер. с англ. – 3 изд. – СПб.: «BHV – Петербург»/ Г.Шильдт. 2004. – 688 стр.

 

 

ПРИЛОЖЕНИЕ 1

Листинг 1. Листинг программы

#include "player.h" #include "resource.h"   #define TIMEP_PLAY 1   #pragma comment(linker,"\"/manifestdependency:type='win32' \ name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") //Включение современного стиля оформления окон   // Глобальные переменные: HINSTANCE hInst; HWND hMainWnd;     BOOL InitInstance(HINSTANCE, int); INT_PTR CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK ListCtrlProc(HWND hList, UINT message, WPARAM wParam, LPARAM lParam); //свой обработчик для listView typedef LRESULT(CALLBACK* LPDefListCtrlProc) (HWND, UINT, WPARAM, LPARAM); //создаём тип данных указателя на функция обработчик LPDefListCtrlProc DefListCtrlProc; //объявляем переменную   int APIENTRY WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine);   MSG msg;   // Выполнить инициализацию приложения: if (!InitInstance(hInstance, nCmdShow)) { return FALSE; }   // Цикл основного сообщения: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, NULL, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }   return (int)msg.wParam; }     BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной (IDD_PLAYER), HWND_DESKTOP, WndProc);   if (!hMainWnd) { return FALSE; }   return TRUE; }   INT_PTR CALLBACK WndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { static HBITMAP hBMP[5]; static HBITMAP phonPicture; static char str[256] = "asdsadasd"; static PlayerList *player; static HWND list; static int selItem; static HWND slidPos; static int currentPos; static bool sizeWnd = false; static int rc; UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: { hBMP[0] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_NEXT)); hBMP[1] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_PREV)); hBMP[2] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_PLAY)); hBMP[3] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_PAUSE)); hBMP[4] = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_STOP));   SendMessage(GetDlgItem(hDlg, IDC_NEXT_TRACK), BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBMP[0]); SendMessage(GetDlgItem(hDlg, IDC_PREV_TRACK), BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBMP[1]); SendMessage(GetDlgItem(hDlg, IDC_PLAY), BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBMP[2]); SendMessage(GetDlgItem(hDlg, IDC_STOP), BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBMP[4]); //Slider slidPos = GetDlgItem(hDlg, IDC_POSITION); //edit SetDlgItemText(hDlg, IDC_NAME_TRACK, "Название трека..");   HICON hIco = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON_MAIN)); SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIco); //ListView list = GetDlgItem(hDlg, IDC_LIST_PLAYING); ListView_SetExtendedListViewStyleEx(list, LVS_EX_GRIDLINES, LVS_EX_GRIDLINES); ListView_SetExtendedListViewStyleEx(list, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);   LV_COLUMN lvColumn; memset(&lvColumn, 0, sizeof(LV_COLUMN)); lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT; lvColumn.fmt = LVCFMT_LEFT;   lvColumn.pszText = TEXT("Название"); lvColumn.cx = 164; ListView_InsertColumn(list, 0, &lvColumn); lvColumn.pszText = TEXT("Длина"); lvColumn.cx = 45; ListView_InsertColumn(list, 1, &lvColumn); DefListCtrlProc = (LPDefListCtrlProc)::SetWindowLong(list, GWL_WNDPROC, (LONG_PTR)ListCtrlProc); //Присваиваем новый обработчик для списка, нужно это чтобы избежать изменения размеров колонок пользователем ///Наш класс player = new PlayerList(list); }return (INT_PTR)TRUE; case WM_COMMAND: { switch (LOWORD(wParam)) { case IDC_NEXT_TRACK: { if (player->count()!= 0) { if (player->nextTrack()) { SetDlgItemText(hDlg, IDC_STATUS_PLAYING, "Следующий"); SendMessage(hDlg, WM_COMMAND, IDC_STOP, 1); } } }break; case IDC_PREV_TRACK: { if (player->count()!= 0) { if (player->prevTrack()) { SetDlgItemText(hDlg, IDC_STATUS_PLAYING, "Предыдущий"); SendMessage(hDlg, WM_COMMAND, IDC_STOP, 1); } } }break; case IDC_PLAY: { if (SendMessage(GetDlgItem(hDlg, IDC_PLAY), BM_GETCHECK, 0, 0) == BST_CHECKED || lParam == 1) { if (player->plMode!= MODE_PLAYING) { if (player->plMode == MODE_STOP && player->count()!= 0) { SendMessage(GetDlgItem(hDlg, IDC_PLAY), BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBMP[3]); //Рисуем на кнопке картинку паузы player->plMode = MODE_PLAYING; // Проигрываем файл int currenLength = player->wioPlay(hDlg); if (currenLength!= -1) { SendMessage(slidPos, TBM_SETRANGEMAX, 0, currenLength); SendMessage(slidPos, TBM_SETPOS, TRUE, 0); // Создаем таймер SetTimer(hDlg, TIMEP_PLAY, 100, NULL); SetDlgItemText(hDlg, IDC_STATUS_PLAYING, "Играет"); SetDlgItemText(hDlg, IDC_NAME_TRACK, player->getTitle()); } } else if (player->plMode == MODE_PLAYINGPAUSED && player->count()!= 0) { SendMessage(GetDlgItem(hDlg, IDC_PLAY), BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBMP[3]); //Рисуем на кнопке картинку паузы rc = waveOutRestart(player->hWaveOut); if (rc) player->wioOutError(rc); player->plMode = MODE_PLAYING; SetTimer(hDlg, TIMEP_PLAY, 100, NULL); SetDlgItemText(hDlg, IDC_STATUS_PLAYING, "Играет1"); } else { SendMessage(hDlg, WM_COMMAND, IDC_ADD_TRACK, NULL); SendMessage(hDlg, WM_COMMAND, IDC_PLAY, NULL); } } } else { if (player->plMode == MODE_PLAYING) { KillTimer(hDlg, TIMEP_PLAY); player->plMode = MODE_PLAYINGPAUSED; SendMessage(GetDlgItem(hDlg, IDC_PLAY), BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBMP[2]); //Рисуем на кнопке картинку play // Временный останов проигрывания rc = waveOutPause(player->hWaveOut); if (rc) player->wioOutError(rc); SetDlgItemText(hDlg, IDC_STATUS_PLAYING, "Пауза"); } } }break; case IDC_STOP: { if (player->plMode == MODE_PLAYING || player->plMode == MODE_PLAYINGPAUSED) { if (player->hWaveOut) { SetDlgItemText(hDlg, IDC_STATUS_PLAYING, "Остановлен"); KillTimer(hDlg, TIMEP_PLAY); player->plMode = MODE_STOP; // Останавливаем проигрывание rc = waveOutReset(player->hWaveOut); if (rc) player->wioOutError(rc); //// Закрываем устройство вывода rc = waveOutClose(player->hWaveOut); if (rc) player->wioOutError(rc); player->hWaveOut = NULL; SendMessage(GetDlgItem(hDlg, IDC_PLAY), BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBMP[2]); //Рисуем на кнопке картинку play if (lParam!= 1)SendMessage(GetDlgItem(hDlg, IDC_PLAY), BM_SETCHECK, BST_UNCHECKED, NULL); //Чекбокс в ненажатое состояние вернули else { SendMessage(hDlg, WM_COMMAND, IDC_PLAY, 1); } } } }break; case IDC_ADD_TRACK: { // Загружаем новый файл if (!player->WAVELoad()) return 0; }break; case IDC_DELETE_TRACK: { if (!player->deleteTrack(-1)) { MessageBox(hDlg, "Элемент не выбран в списке или проигрывается в данный момент.", "Ошибка", MB_OK); } }break; } }break;   case WM_TIMER: { if (wParam == TIMEP_PLAY && player->plMode == MODE_PLAYING) { MMTIME mmtimeOut; // Определяем текущую позицию внутри записываемого блока mmtimeOut.wType = TIME_MS; waveOutGetPosition(player->hWaveOut, (LPMMTIME)&mmtimeOut, sizeof(MMTIME));   SendMessage(slidPos, TBM_SETPOS, TRUE, (int)(mmtimeOut.u.ms) / 1000000); } }break; case WM_CLOSE: { for (int i = 0; i < 5; i++) { DeleteObject(hBMP[i]); } DeleteObject(phonPicture); player->~PlayerList(); DestroyWindow(hDlg); PostQuitMessage(1); return (INT_PTR)TRUE; }break; } return (INT_PTR)FALSE; }   LRESULT CALLBACK ListCtrlProc(HWND hList, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_NOTIFY:   switch (((LPNMHDR)lParam)->code) { case HDN_BEGINTRACK: { SetWindowLong(hList, DWL_MSGRESULT, 1); return TRUE; }break; case HDN_ITEMCHANGING: { int i = 0; i = i; SetWindowLong(hList, DWL_MSGRESULT, 0); return FALSE; } default: return TRUE; } break;   } return::CallWindowProc(DefListCtrlProc, hList, message, wParam, lParam); };

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-11-10 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: