Метод OnOnTop
Метод OnOnTop во многом похож на уже описанный нами метод OnDblclkFtpLis, но используется не для входа, а для выхода из каталогов. Если вы вошли в каталог и желаете выйти из него на верхний уровень, вы должны нажать кнопку On top. В ответ на сообщение от этой кнопки вызывается метод OnOnTop. Он блокирует список IDC_FTP_LIST, вызывая метод EnableWindow для объекта m_FtpList, управляющего этим списком:
// Блокируем список IDC_FTP_LIST
m_FtpList.EnableWindow(FALSE);
Затем с помощью метода ReverseFind класса CString мы ищем последнее вхождение символа / в строке sCurentDirectory, содержащей имя текущего каталога сервера, содержимое которого показывается на экране.
Если метод ReverseFind не обнаруживает в строке с путем каталога символов /, он возвращает значение -1. Это означает что мы уже находимся в корневом каталоге сервера:
int iNum = sCurentDirectory.ReverseFind('/');
if(iNum == -1)
{
// Если символ / не обнаружен, значит мы находимся в
// корневом каталоге
AfxMessageBox("No top directory");
}
Если же символ / найден, то обращаясь к методу Left мы удаляем все символы, расположенные справа от него (включительно). Таким образом, в строке sCurentDirectory теперь будет записан путь каталога верхнего уровня.
Так как мы изменили текущий каталог, содержимое которого показывается на экране, вызываем метод DirectoryView. Он просмотрит имена каталогов и файлов, расположенных по новому пути, и заполнит список:
else
{
// Удаляем из строки с именем текущего каталога названия
// последнего каталога
sCurentDirectory = sCurentDirectory.Left(iNum);
// Меняем форму курсора (курсор “ожидание”)
CWaitCursor wait;
// Отображаем содержимое каталога верхнего уровня
DirectoryView();
}
Перед тем как вызывать метод DirectoryView, мы создаем объект wait класса CWaitCursor. При этом автоматически изменится внешний вид курсора приложения. Как только метод DirectoryView закончит свою работу и управление выйдет из блока else, объект wait будет удален, а внешний вид курсора восстановится.
После этого снимаем блокировку со списка IDC_FTP_LIST и отображаем новый текущий путь в поле IDC_STATUS:
// Снимаем блокировку списка IDC_FTP_LIST
m_FtpList.EnableWindow(TRUE);
// Отображаем на диалоговой панели новый путь каталога
m_Status.SetWindowText(sCurentDirectory);