Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП - методички / OS&SP_Lab_2.6(shell).doc
Скачиваний:
95
Добавлен:
18.05.2015
Размер:
1.12 Mб
Скачать

Обработчики сообщений страницы свойств

Много важного происходит в OnInitDialog(). Параметр lParam опять указывает на структуру PROPSHEETPAGE, использовавшуюся при создании вкладки. Ее член lParam указывает на это вездесущее "имя файла". Поскольку нам необходимо иметь доступ к имени файла в функции OnApply(), мы сохраняем указатель, используя SetWindowLong().

BOOL OnInitDialog ( HWND hwnd, LPARAM lParam )

{

PROPSHEETPAGE* ppsp = (PROPSHEETPAGE*) lParam;

LPCTSTR szFile = (LPCTSTR) ppsp->lParam;

HANDLE hFind;

WIN32_FIND_DATA rFind;

// Сохраним имя файла в данных этого окна для дальнейшего использования

SetWindowLong ( hwnd, GWL_USERDATA, (LONG) szFile );

Затем мы получаем времена создания, модификации и доступа, используя FindFirstFile(). Если это выполнено успешно, DTP инициализируются правильными данными.

hFind = FindFirstFile ( szFile, &rFind );

if ( INVALID_HANDLE_VALUE != hFind )

{

// Инициализируем DTP

SetCombinedDateTime ( hwnd, IDC_MODIFIED_DATE, IDC_MODIFIED_TIME,

&rFind.ftLastWriteTime );

SetCombinedDateTime ( hwnd, IDC_ACCESSED_DATE, 0,

&rFind.ftLastAccessTime );

SetCombinedDateTime ( hwnd, IDC_CREATED_DATE, IDC_CREATED_TIME,

&rFind.ftCreationTime );

FindClose ( hFind );

}

SetCombinedDateTime() - прикладная функция, которая устанавливает содержимое DTP. Код можно найти в конце FileTimeShlExt.cpp.

И в дополнение - полный путь к файлу показывается в надписи вверху страницы.

PathSetDlgItemPath ( hwnd, IDC_FILENAME, szFile );

return FALSE; // Используем встроенную обработку фокуса

}

Обработчик OnApply() напротив, читает информацию из DTP и устанавливает времена создания, модификации и доступа к файлам. Первый шаг - получить при помощи GetWindowLong() указатель на имя файла и открыть файл для записи.

BOOL OnApply ( HWND hwnd, PSHNOTIFY* phdr )

{

LPCTSTR szFile = (LPCTSTR) GetWindowLong ( hwnd, GWL_USERDATA );

HANDLE hFile;

FILETIME ftModified, ftAccessed, ftCreated;

// Открываем файл

hFile = CreateFile ( szFile, GENERIC_WRITE, FILE_SHARE_READ, NULL,

OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );

Если мы смогли открыть файл, считываем из DTP и пишем времена обратно в файл. GetCombinedDateTime() это пара для SetCombinedDateTime().

if ( INVALID_HANDLE_VALUE != hFile )

{

// Извлекаем дату и время из DTP

GetCombinedDateTime ( hwnd, IDC_MODIFIED_DATE, IDC_MODIFIED_TIME,

&ftModified );

GetCombinedDateTime ( hwnd, IDC_ACCESSED_DATE, 0,

&ftAccessed );

GetCombinedDateTime ( hwnd, IDC_CREATED_DATE, IDC_CREATED_TIME,

&ftCreated );

// Изменяем время создания, доступа и последней модификации файла

SetFileTime ( hFile, &ftCreated, &ftAccessed, &ftModified );

CloseHandle ( hFile );

}

else

{

// <<Обработка ошибок опущена>>

}

// Возвращаем PSNRET_NOERROR, чтобы можно было закрыть набор свойств, если пользователь нажал OK.

SetWindowLong ( hwnd, DWL_MSGRESULT, PSNRET_NOERROR );

return TRUE;

}

Соседние файлы в папке ОСиСП - методички