Скачайте в формате документа WORD

Win32-приложение Картотека аудио дисков

УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ НИВЕРСИТЕТ ИНФОРМАТИКИ Иа РАДИОЭЛЕКТРОНИКИ





ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовому проекту по предмету

Системное программное обеспечение ЭВМФ


Тема: Win32-приложение Картотека аудио дисков


Выполнил:

Проверил:


УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ НИВЕРСИТЕТ ИНФОРМАТИКИ Иа РАДИОЭЛЕКТРОНИКИ

Институт повышения квалификации и переподготовки руководящих работников и специалистов по информационным технологиям и радиоэлектронике

Факультет компьютерных технологий


"УТВЕРЖДАЮФ зав. Каф. ПОИТ


/ В.В. Бахтизин//
" " 2006 г.


Курс: Системное программное обеспечение ЭВМ

Тема курсовой работы: Win32-приложение Картотека аудио дисков.

Задание 3 по курсовой работе студенту гр..

Разработать программный продукт для ведения картотеки аудиодисков.

Для каждого произведения в файле на диске хранится

Наименование диска (группы), наименование произведения, исполнитель, четный номер диска в картотеке, кто взял, дата.

Максимальное количество добавляемых в одном сеансе записей Ц50.


Основные функции приложения:

Меню Файл - создание нового файла данных, загрузка существующего, сохранение, сохранение как...;

Меню Правка - добавление, изменение, удаление элемента списка. Отображение информации элемента списка
в виде окна свойств(Property Scheet;

Меню Вид - команды режима отображения(большие и малые значки, список и таблица). В режиме таблица обеспечивается
сортировка по соответствующему параметру при щелчке мыши по заголовку колонки;

Меню Помощь - вызов помощи и окна информации о программе.


Требования к программе.

Программа должна работать под Windows 95/98

Язык интерфейса - русский. Тип интерфейса - Explorer(Проводник).

Обязательные элементы итерфейса: 1) меню;

2) панель инструментов (ToolBar) с появляющимися подсказками - Tool Tips;

3) элемент TreeView ("древовидное отображение") для списка дисков и исполнителей на каждом диске;

4) элемент ListView ("графический список") для списка произведений выбранного диска и исполнителя;

5) элемент StatusBar (строка состояния )- наименование диска, исполнитель, количество произведений в списке.

6) контекстное меню, вызываемое при щелчке правой кнопкой мыши по элементу графического списка, содержита команду "Свойства" из меню Правка для отображения всех данных записи для выбранного элемента списка " ListView". Данные вывести в диалоговом окне в виде Блокнота свойств(Property Sheed), содержащего не менее двух страниц свойств;

Содержание пояснительной записки

Введение.

1.Анализ задания и постановка задачи.

2.Описание логического представления данных и их назначения.

3.Описание структуры программы.

4. Разработка программы (пояснения к тексту программы, примененным технологияма и принятым решениям, схемы основных алгоритмов)

5.Тестирование программы и тестовые наборы данных.

6.Технические требования и инструкция по применению.

Заключение.

Литература

Приложения - исходные тексты, заголовочные файлы, сценарии ресурсов, тестовые данные.


Срок выдачи задания 15.09.2006г


Срок выполнения курсовой работы 25.12.2006 г Руководитель курсовой работы


Задание принял к исполнению: дата подпись


Содержание

TOC o "1-3" h zВведение

1. Постановка задачи

2. Структура выходных и входных данных

3. Описание основных классов и структур

4. Алгоритм работы программы

5. Результат работы программы

5.1 Ознакомление

5.2 Работа с программой

5.3 Сохранение документа

5.4 Открытие документа

5.5 Добавление информации

5.5.1 Добавление нового диска

5.5.2 Добавление новой композиции

5.6 Редактирование информации

5.6.1 Редактирование диска

5.6.2 Редактирование композиции

5.7 даление информации

5.8 Вид

5.9 О программе

5.10 Выход из программы

6. Тестирование программы

Заключение

Литература

Приложение

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

Исходные тексты

Сценарии ресурсов

br clear="all"> Введение

Язык программирования служит двум связанным между собой целям: он дает программисту аппарат для задания действий, которые должны быть выполнены, и формирует концепции, которыми пользуется программист, размышляя о том, что делать. Первой цели идеально отвечает язык, который настолько "близок к машине", что всеми основными машинными аспектами можно легко и просто оперировать достаточно очевидным для программиста образом. С таким мыслом первоначально задумывался C. Второй цели идеально отвечает язык, который настолько "близок к решаемой задаче", чтобы концепции ее решения можно было выражать прямо и коротко. С таким мыслом предварительно задумывались средства, добавленные к C для создания C++.

Связь между языком, на котором мы думаем/программируем, и задачами и решениями, которые мы можем представлять в своем воображении, очень близка. По этой причине ограничивать свойства языка только целями исключения ошибок программиста в лучшем случае опасно. Язык предоставляет программисту набор концептуальных инструментов; если они не отвечают задаче, то их просто игнорируют. Например, серьезные ограничения концепции казателя заставляют программиста применять вектора и целую арифметику, чтобы реализовать структуры, казатели и т.п. Хорошее проектирование и отсутствие ошибок не может гарантироваться чисто за счет языковых средств. Система типов должна быть особенно полезна в нетривиальных задачах. Действительно, концепция классов в C++ показала себя мощным концептуальным средством.



1. Постановка задачи

Разработать программный продукт для ведения картотеки аудиодисков. Программный продукт должен позволять:

  • вести чет всех дисков картотеки (наименование, группа, четный номер в картотеке, кем был взят, дата) Ц добавление, даление, редактирование, сохранение, загрузка сохраненной информации;
  • вести чет каждой композиции на диске (номер трека, исполнитель).

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

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

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


Для реализации поставленной задачи использовать Visual Studio C++ версии не ниже 6.0. В частности применить winapi.


2. Структура выходных и входных данных

Данные предполагается хранить в структурированном файле. Так как структура данных может быть выражена лишь одной таблицей, то нет необходимости прибегать к применению каких либо СУБД. Файл с данными можно размещать как на локальном компьютере, так и в сети, предоставляющей открытый доступ к такому виду ресурса.

Вся структура данных может быть выражена одной таблицей:


Таблица 1 - схема данных

название

тип

название_диска

строка

название_трека

строка

исполнитель

строка

учетный номер

длинное целое

кем_взят

строка

дата_добавления

дата


Скачайте в формате документа WORD

3. Описание основных классов и структур

В проекте были использованы встроенные классы и структуры windows api. Их перечисление дается ниже:


WNDCLASSEX

поле

тип

cbSize

LONG

style

LONG

lpfnWndProc

WNDPROC

cbClsExtra

LONG

cbWndExtra

LONG

hInstance

HANDLE

hIcon

HANDLE

hIconSm

HANDLE

hCursor

HANDLE

lpszMenuName

LPCTSTR

lpszClassName

LPCTSTR


MENUITEMINFO

поле

тип

cbSize

LONG

fMask

LONG

fType

LONG

fState

LONG

dwTypeData

* LPCTSTR

cch

LONG

wID

UINT

hSubMenu

HMENU


OPENFILENAME

поле

тип

lStructSize

LONG

hwndOwner

HWND

lpstrFile

LPCTSTR

nMaxFile

LONG

lpstrFilter

LPCTSTR

nFilterIndex

LONG

lpstrFileTitle

LPCTSTR

nMaxFileTitle

LONG

lpstrInitialDir

LPCTSTR


ACCEL

поле

тип

fVirt

LONG

key

LONG

cmd

LONG


tagBITMAP

поле

тип

bmType

LONG

bmWidth

LONG

bmHeight

LONG

bmWidthBytes

LONG

bmPlanes

WORD

bmBitsPixel

WORD

bmBits

LPVOID



4. Алгоритм работы программы

лгоритм работы программы можно представить диаграммой 1.

Скачайте в формате документа WORD

5. Результат работы программы

Запуск приложения осуществляется традиционным способом (двойным/одинарным кликом по иконке приложения).

Скачайте в формате документа WORD

6. Тестирование программы

Для тестирования программы необходимо проверить ряд функций программы:

  • создание нового документа;
  • сохранение существующего документа;
  • открытие документа;
  • наполнение документа.

Все эти действия можно объединить в группу и проверить одновременно. Для этого достаточно составить один сценарий, в котором будут следующие действия:

  1. запуск программы;
  2. создание нового документа;
  3. наполнение документа;
  4. сохранение документа;
  5. выход из программы;
  6. запуск программы;
  7. открытие документа.

Ниже приводятся описанные действия.

1. запуск программы: После запуска программы, на экране должно отобразиться главное окно программы, изображенное на рисунке 3.

2. создание нового документа: После запуска программы можно приступить к созданию нового документа. Это можно сделать при помощи:

  • пункта главного меню Фай→Новый либо аналогичной кнопкой в панели инструментов;
  • ничего не делать - при запуске изначально происходит работа с новой коллекцией.

3. наполнение документа: Для наполнения документа следует добавить в коллекцию диски и треки для них.

Для добавления новых дисков нужно выполнить следующие действия:

  • в древовидной структуре выделить всю коллекцию;
  • посредством пункта главного меню Правка→Удобавить вызвать диалог добавление  диска, изображенного на рисунке 13;
  • в поле группа диалога вписать название Ария;
  • в поле название альбома диалога вписать название Диск Ф;
  • нажать кнопку добавить;
  • должна произойти проверка введенной информации на допустимость введенных значений, добавление данных и вывестись отчет Данные добавлены, изображенный на рисунке 15 (диалог не должен закрыться т.к. он предполагает множественное добавление информации);
  • в поле группа диалога вписать название Ария;
  • в поле название альбома диалога вписать название Диск Ф;
  • нажать кнопку добавить;
  • должна произойти проверка введенной информации на допустимость введенных значений, добавление дынных и вывестись отчет Данные добавлены, изображенный на рисунке 15;
  • после этого следует нажать на кнопку отмена, произойдет выход из диалога;
  • после этих действий в древовидной структуре появятся два новых зла: Ария: Диск Ф и Ария: Диск Ф корнем которых станет коллекция;

Для добавления новых треков к дискам нужно выполнить следующие действия:

1)   

2)    Правка→Удобавить вызвать диалог Удобавление трека, изображенного на рисунке 16;

a)    XФ (вместо УXФ в первой итерации записать УФ);

b)    Кипелов;

c)   

d)   

e)   

3)    a, b, c и d с получение результата из пункта e в количестве четырех итераций с начальным значением 2, в качестве данных брать те же значения изменяя УXФ на номер итерации.

4)   

5)   

В результате всех действий получим пример, изображенный на рисунке 7.

4. сохранение документа: Для сохранения документа необходимо в главном меню выбрать пункт Фай→Сохранить как либо Фай→Сохранить. Кнопка с аналогичной функциональностью есть и в панели инструментов. После выбора пункта сохранения вызывается одноименный диалог, который позволяет задать новое имя документа и/или месторасположение. Его изображение показано на рисунке 9. В диалоге следует задать новое имя документа и его месторасположение и нажать на кнопку Сохранить.

5. выход из программы: Выход из программ можно осуществить путем выбора пункта главного меню Фай→Выход. Также выход осуществляется нажатием кнопки УXФ в заголовке главного окна приложения.

6. запуск программы: смотреть действие 1.

7. открытие документа: Для открытия документа следует выбрать пункт главного меню Фай→Открыть либо воспользоваться аналогичной кнопкой в панели инструментов. В результате всех действий должен получиться результат, как и в У3. наполнение документа Ф, который изображен на рисунке 7.




Заключение

Проделав значительную работу я изучил возможности работы с winapi (и в частности способы манипулирования данными в элементах правления). Изучил механизмы создания пользовательских классов и принципы наследования в языке C++.


Литература

Исходные тексты

#include "includes.h"

#include "main.h"

#define WX 600

#define WY 300

#define COLOR RGB(0xff,0xff,0xff)

#define WIN_STYLE WS_OVERLAPPED|WS_SYSMENU|WS_CAPTION|WS_BORDER|WS_MINIMIZEBOX


#define Error_title "Error"

#define AplicationTitle "Картотека дисков"

#define ClassName "MY_CLASS"


HINSTANCE ghInst;


/* ############################### */

/* ### ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ### */

/* ############################### */


char buf[10]; char* toString(int value,int radix=10){

itoa(value,buf,radix);

return buf;};


/* ######################################### */

/* ### ДИАЛОГИ - ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ### */

/* ######################################### */


bool getFileDlg(HWND hWnd,char *name,char *mask,int mask_size=0){

char szF[1024]="";

OPENFILENAME ofn;

memset(&ofn,0,sizeof(OPENFILENAME));

ofn.lStructSize=sizeof(OPENFILENAME);

ofn.hwndOwner=hWnd;

ofn.lpstrFile=szF;

ofn.nMaxFile=sizeof(szF);

ofn.lpstrFilter=mask;

ofn.nFilterIndex=2;

ofn.lpstrFileTitle=NULL;

ofn.nMaxFileTitle=0;

ofn.lpstrInitialDir=NULL;

ofn.Flags=OFN_FILEMUSTEXIST;

if(GetOpenFileName(&ofn)==TRUE){

sprintf(name,"%s",ofn.lpstrFile);

return 1;}

sprintf(name,"%s","");

return 0;}


/* ##################################### */

/* ### ДИАЛОГИ - ОБРАБОТКА СООБЩЕНИЙ ### */

/* ##################################### */


LRESULT CALLBACK addTrackDlgProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)

{

int id=LOWORD(wParam);

static int ind=lParam,pos=0;

int i;

switch (uMsg)

{

case WM_INITDIALOG:

ind=lParam;

for (i=0;i<dwWkCount;i++)

if (WkRec[i].ind==ind)

pos = i;

SetDlgItemText(hwndDlg,IDC_EDIT_TRACK,WkRec[pos].cTrack);

SetDlgItemText(hwndDlg,IDC_EDIT_SINGER,WkRec[pos].cSinger);

SetDlgItemText(hwndDlg,IDC_EDIT_DATE,WkRec[pos].cDate);

return FALSE;

break;

case WM_COMMAND:

switch (id)

{

case IDC_OK:

GetDlgItemText(hwndDlg,IDC_EDIT_TRACK,WkRec[pos].cTrack,100);

GetDlgItemText(hwndDlg,IDC_EDIT_SINGER,WkRec[pos].cSinger,30);

GetDlgItemText(hwndDlg,IDC_EDIT_DATE,WkRec[pos].cDate,20);

EndDialog(hwndDlg,0);

break;

case IDC_CANCEL:

EndDialog(hwndDlg,1);

break;

}

break;

default:

return FALSE;

}

}

int GetMaxInd()

{

int maxind=0;

for (int i=0;i<dwWkCount;i++)

{

if (WkRec[i].iNum>maxind)

{

maxind=WkRec[i].iNum;

}

}

return maxind;

}


LRESULT CALLBACK aiskDlgProc(HWND hwndDlg,UINT uMsg,

WPARAM wParam,LPARAM lParam)

{

int id=LOWORD(wParam);

static int ind=lParam,pos=0;

int i;

switch (uMsg)

{

case WM_INITDIALOG:

ind=lParam;

for (i=0;i<dwWkCount;i++)

if (WkRec[i].ind==ind)

pos = i;

SetDlgItemText(hwndDlg,IDC_EDIT_GROUP,WkRec[pos].cGroup);

SetDlgItemText(hwndDlg,IDC_EDIT_ALBUM,WkRec[pos].cDisc);

return FALSE;

break;

case WM_COMMAND:

switch (id)

{

case IDC_OK:

GetDlgItemText(hwndDlg,IDC_EDIT_GROUP,WkRec[pos].cGroup,50);

GetDlgItemText(hwndDlg,IDC_EDIT_ALBUM,WkRec[pos].cDisc,30);

WkRec[pos].iNum=GetMaxInd()+1;

EndDialog(hwndDlg,0);

break;

case IDC_CANCEL:

EndDialog(hwndDlg,1);

break;

}

break;

default:

return FALSE;

}

}


LRESULT CALLBACK AboutDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)

{

switch(uMsg)

{

case WM_INITDIALOG: {return TRUE;};

case WM_COMMAND:

switch(LOWORD(wParam)){

case IDOK:{

EndDialog(hDlg,0);

return TRUE;}}

break;

default:

return(FALSE);

}

return(TRUE);

}


UINT AddNewItem(UINT iType,UINT iParent)

{

//Создаем временную рабочую структуру

WorkRecord *temp;

temp=new WorkRecord[dwWkCount];

UINT max=WkRec[0].ind;

//Копируем во временную структуру рабочую. Находим последний индекс

// в рабочей структуре

for (int i=0;i<dwWkCount;i++)

{

if (max<WkRec[i].ind)

max=WkRec[i].ind;

temp[i]=WkRec[i];

}

// Пересоздаем рабочую структуру с новым размером

delete [] WkRec;

WkRec=new WorkRecord[++dwWkCount];

//Копируем записи из временной структуры в рабочую

for (i=0;i<dwWkCount-1;i++)

{

//ZeroMemory(&WkRec[i],sizeof(WorkRecord));

WkRec[i]=temp[i];

}


// Очищаем последний "новый" элемент рабочей

// структуры и заносит значения по молчанию

ZeroMemory(&WkRec[dwWkCount-1],sizeof(WorkRecord));

WkRec[dwWkCount-1].ind=++max;

WkRec[dwWkCount-1].iType=iType;

WkRec[dwWkCount-1].indParent=iParent;

delete []temp;

return max;

}


BOOL DeleteRec(int index)

{

// Проверяем есть ли связанные записи

for (int i=0;i<dwWkCount;i++)

if (WkRec[i].indParent==index)

{

MessageBox(NULL,"Удалите связанные данные","Ошибка",MB_OK);

return FALSE;

}

// Ищем позицию удаляемого элемента

int pos;

for (i=0;i<dwWkCount;i++)

if (WkRec[i].ind==index)

pos=index;

// Если даляемый элемент не последний,

//то переносим последний на место даляемого.

dwWkCount--;

if (pos!=dwWkCount)

WkRec[pos] = WkRec[dwWkCount];

// Копируем записи во временную структуру

WorkRecord *temp;

temp=new WorkRecord[dwWkCount];

for ( i=0;i<dwWkCount;i++)

{

temp[i]=WkRec[i];

}

//Удаляет рабочие записи

delete [] WkRec;

// Создает новые рабочие записи

WkRec=new WorkRecord[dwWkCount];

for (i=0;i<dwWkCount;i++)

{

WkRec[i]=temp[i];

}

delete []temp;

return TRUE;

}


void MakeTree()

{

TV_DeleteAll();

WkRec[0].ind=0;

WkRec[0].indParent=0;

WkRec[0].iType=5;

WkRec[0].hTree=а TV_InsertItem("Коллекция", HANDLES.hWndTreeView, TVI_ROOT, 0,0);

HTREEITEM parent=WkRec->hTree;

// Инициализация дисков

for (int i=1;i<dwWkCount;i++)

{

if (WkRec[i].iType==0)

WkRec[i].hTree=TV_InsertItem(WkRec[i].cDisc,

HANDLES.hWndTreeView,parent,1,WkRec[i].ind);

if (WkRec[i].iType==1)

for (int j=1;j<dwWkCount;j++)

if (WkRec[i].indParent==WkRec[j].ind)

WkRec[i].hTree=TV_InsertItem(WkRec[i].cTrack,

HANDLES.hWndTreeView,WkRec[j].hTree,2,WkRec[i].ind);

}

LV_RemoveAllItems(HANDLES.hWndListView);

}


// Инициализация списка при выборе нового элемента

void MakeList(UINT selDisk)

{

LV_RemoveAllItems(HANDLES.hWndListView);

for (int i=0;i<dwWkCount;i++)

{

if (WkRec[i].indParent==selDisk)

LV_AddItem(HANDLES.hWndListView, 0, WkRec[i].cTrack,&WkRec[i]);

}

}


void InitTree()

{

TV_DeleteAll();

lstrcpy(FileName, "");

dwWkCount=1;

delete []WkRec;

WkRec=new WorkRecord[dwWkCount];

ZeroMemory(WkRec,sizeof(WorkRecord));

HANDLES.iSelDisk=-1;

HANDLES.iSelTrack=-1;

MakeTree();

}


/* ####################################### */


bool WndProc_OnCreate(HWND hWnd,LPCREATESTRUCT lpCreateStruct)

{

HANDLES.hWndMain=hWnd;

if (!SB_Create(hWnd))

return FALSE;

if (!TB_Create(hWnd))

return FALSE;

if (!LV_Create(hWnd))

return FALSE;

if (!TV_Create(hWnd))

return FALSE;

InitTree();

ResizeWindows(hWnd);

return TRUE;

return 1;

}


void WndProc_OnResize(HWND hWnd,int cx, int cy, int cz)

{

if (!ResizeWindows(hWnd))

MessageBox(NULL, "Window resizing failed!", NULL, MB_OK);

}


void WndProc_OnDestroy(HWND hWnd)

{

PostQuitMessage(0);

}


void Main_OnCommand( HWND hWnd, int iCmd, HWND hwndCtl, UINT uCode )

{

int wCommand = iCmd;

int iTypeEdit,iNumRec;

GetStateOfCommonControls();

switch(iCmd)

{

case IDM_FILE_NEW:

iTypeEdit=MessageBox(NULL,"Вы хотите сохранить изменения?",

"Предупреждение",MB_YESNO);

if (iTypeEdit==IDYES)

{

if (strlen(FileName)==0)

{

if (!GetFlNameDialog(HANDLES.hWndMain,1))

break;

else

{

if (!SaveItems(FileName))

MessageBox(NULL,"Ошибка сохранения файла.","Ошибка",MB_OK);

else

InitTree();

}

}

else

{

if (!SaveItems(FileName))

MessageBox(NULL,"Ошибка сохранения файла.","Ошибка",MB_OK);

else

InitTree();

}


}

else

{

InitTree();

}

break;

case IDM_FILE_OPEN:

if (GetFlNameDialog(HANDLES.hWndMain,0))

{

if (!LoadItems(FileName))

MessageBox(NULL,"Ошибка загрузки файла.","Ошибка",MB_OK);

else MakeTree();

}

else

MessageBox(NULL,"Файл не выбран.","Ошибка",MB_OK);

break;

case IDM_FILE_SAVEAS:

if (!GetFlNameDialog(HANDLES.hWndMain,1))

{

MessageBox(NULL,"Файл не выбран.","Ошибка",MB_OK);

}

else

if (!SaveItems(FileName))

MessageBox(NULL,"Ошибка сохранения файла.","Ошибка",MB_OK);

break;

case IDM_FILE_SAVE:

if (strlen(FileName)==0)

{

if (!GetFlNameDialog(HANDLES.hWndMain,1))

{

break;

// MessageBox(NULL,"Файл не выбран.","Ошибка",MB_OK);

}

else

if (!SaveItems(FileName))

MessageBox(NULL,"Ошибка сохранения файла.","Ошибка",MB_OK);

}

break;

case IDM_EDIT_ADD:

if (HANDLES.iSelDisk<0)

{

iNumRec=AddNewItem(0,0);

iTypeEdit=DialogBoxParam(ghInst,MAKEINTRESOURCE(IDD_DIALOG_ADD_DISK),

hWnd,(DLGPROC)aiskDlgProc,

(LPARAM) iNumRec);

if (iTypeEdit)

DeleteRec(iNumRec);

}

else

{

iNumRec=AddNewItem(1,HANDLES.iSelDisk);

iTypeEdit=DialogBoxParam(ghInst,MAKEINTRESOURCE(IDD_DIALOG_ADD_TRACK),

hWnd,(DLGPROC)addTrackDlgProc,(LPARAM)а iNumRec);

if (iTypeEdit)

DeleteRec(iNumRec);

}

MakeTree();

break;

case IDM_EDIT_CHANGE:

if (HANDLES.iSelTrack>=0)

{

DialogBoxParam(ghInst,MAKEINTRESOURCE(IDD_DIALOG_ADD_TRACK),

hWnd,(DLGPROC)addTrackDlgProc,(LPARAM)а HANDLES.iSelTrack);

MakeTree();

break;

}

if (HANDLES.iSelDisk>=0)

{

DialogBoxParam(ghInst,MAKEINTRESOURCE(IDD_DIALOG_ADD_DISK),

hWnd,(DLGPROC)aiskDlgProc,

(LPARAM) HANDLES.iSelDisk);

MakeTree();

}

break;

case IDM_EDIT_DELETE:

if (HANDLES.iSelTrack>=0)

{

DeleteRec(HANDLES.iSelTrack);

MakeTree();

break;

}

if (HANDLES.iSelDisk>=0)

{

DeleteRec(HANDLES.iSelDisk);

MakeTree();

}

break;

case IDM_PROPERTY:

if (HANDLES.iSelTrack>=0)

CreatePropertySheet(hWnd,1);

break;

case IDM_VIEW_BIG:

case IDM_VIEW_SMALL:

case IDM_VIEW_LIST:

case IDM_VIEW_TABLE:

LV_ChangeView(wCommand);

break;

case IDM_HELP_ABOUT:

DialogBox(ghInst,MAKEINTRESOURCE(IDD_DIALOG_HELP_ABOUT),hWnd,(DLGPROC)AboutDlgProc);

break;

case IDM_FILE_EXIT:

SendMessage(hWnd,WM_DESTROY,0,0);

break;

default:

break;

}

}


void WndProc_OnMenu(HWND hwnd, HWND hwndCtl, UINT xPos, UINT yPos)

{

HMENU hMenu,hMenuTrackPopup ;

if (hwndCtl == HANDLES.hWndListView)

{

// Get the context menu from the resource file.

hMenu = LoadMenu(HANDLES.hInst, MAKEINTRESOURCE(IDR_TRACKPOPUP));

// Get the first item in the menu for TrackPopupMenu().

hMenuTrackPopup = GetSubMenu(hMenu, 0);

// Draw and track the "floating" menu.

TrackPopupMenu(hMenuTrackPopup,

TPM_LEFTALIGN | TPM_RIGHTBUTTON,

xPos, yPos,

0, HANDLES.hWndMain, NULL);

// Destroy the menu

DestroyMenu(hMenu);

}

}


LRESULT WINAPI CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam,

LPARAM lParam)

{

switch(msg)

{

HANDLE_MSG(hWnd, WM_CONTEXTMENU, WndProc_OnMenu );

HANDLE_MSG(hWnd,WM_CREATE,WndProc_OnCreate);

HANDLE_MSG(hWnd,WM_DESTROY,WndProc_OnDestroy);

HANDLE_MSG(hWnd, WM_SIZE, WndProc_OnResize);

HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand );

case WM_NOTIFY:

if (TV_NotifyHandler(hWnd, msg, wParam, lParam))

{

break;

}

if (TT_NotifyHandler(hWnd, msg, wParam, lParam))

{

break;

}


аif (LV_NotifyHandler(hWnd, msg, wParam, lParam))

а{

аbreak;

}

default:

return(DefWindowProc(hWnd,msg,wParam,lParam));

}

return 0;}


ATOM RegisterAppClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

wcex.cbSize=sizeof(WNDCLASSEX);

wcex.style=CS_HREDRAW|CS_VREDRAW;

wcex.lpfnWndProc=(WNDPROC)WndProc;

wcex.cbClsExtra=0;

wcex.cbWndExtra=0;

wcex.hInstance=hInstance;

wcex.hIcon=LoadIcon(hInstance,(LPCTSTR)IDI_ICON_APP);

wcex.hIconSm=LoadIcon(hInstance,(LPCTSTR)IDI_ICON_APP);

wcex.hCursor=NULL;

wcex.hbrBackground=CreateSolidBrush(COLOR);

wcex.lpszMenuName=MAKEINTRESOURCE(IDM_MENU_MAIN);

wcex.lpszClassName=ClassName;

return RegisterClassEx(&wcex);

}


BOOL InitInstanceWindow(HINSTANCE hInstance,int nCmdShow)

{

HWND hWnd=CreateWindow(ClassName,AplicationTitle,

WS_OVERLAPPEDWINDOW | WS_MAXIMIZE,CW_USEDEFAULT,

CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,

hInstance,NULL);

if(!hWnd) return 0;

ShowWindow(hWnd,nCmdShow);

UpdateWindow(hWnd);

return 1;

};


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,

LPSTR lpCmdLine,int nCmdShow)

{

HANDLES.hInst=hInstance;

InitCommonControls();

if(!RegisterAppClass(hInstance))

{

MessageBox(NULL,"Ошибка регистрации класса окна!!!",

Error_title,MB_OK|MB_ICONERROR);

return 0;

}


if(!InitInstanceWindow(hInstance,nCmdShow))

{

MessageBox(NULL,"Ошибка создания окна!!!",

Error_title,MB_OK|MB_ICONERROR);

return 0;

}


HWND hwndDlg=(HWND)0;

MSG msg;

while(GetMessage(&msg,NULL,0,0)){

if(!IsDialogMessage(PropHandle,&msg)){

TranslateMessage(&msg);

DispatchMessage(&msg);}}


return msg.wParam;

}