Win32-приложение Картотека аудио дисков
Реферат - Компьютеры, программирование
Другие рефераты по предмету Компьютеры, программирование
/p>
// Очищаем последний "новый" элемент рабочей
// структуры и заносит значения по умолчанию
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)addDiskDlgProc,
(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:
=0)">if (HANDLES.iSelTrack>=0)
{
DialogBoxParam(ghInst,MAKEINTRESOURCE(IDD_DIALOG_ADD_TRACK),
hWnd,(DLGPROC)addTrackDlgProc,(LPARAM) HANDLES.iSelTrack);
MakeTree();
break;
}
=0)">if (HANDLES.iSelDisk>=0)
{
DialogBoxParam(ghInst,MAKEINTRESOURCE(IDD_DIALOG_ADD_DISK),
hWnd,(DLGPROC)addDiskDlgProc,
(LPARAM) HANDLES.iSelDisk);
MakeTree();
}
break;
case IDM_EDIT_DELETE:
=0)">if (HANDLES.iSelTrack>=0)
{
DeleteRec(HANDLES.iSelTrack);
MakeTree();
break;
}
=0)">if (HANDLES.iSelDisk>=0)
{
DeleteRec(HANDLES.iSelDisk);
MakeTree();
}
break;
case IDM_PROPERTY:
=0)">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;
}