Файловые операции
Коды функций SetGraphPoints, ReadData и DoRead возьмите из приложения OG, которое мы разработали ранее. При этом не забудьте изменить заголовки функций. Например, функция SetGraphPoints теперь является членом класса COpenGL, а не COGView, как было ранее. Кроме того, метод ReadData теперь стал экспонируемым, а это означает, что он описывается как STDMETHODIMP COpenGL::ReadData (void) и должен возвращать значения во всех ветвях своего алгоритма. В связи с этими изменениями приведем полностью код функции ReadData.
STDMETHODIMP COpenGL::ReadData(void) { //=== Строка, в которую будет помещен файловый путь TCHAR szFile[MAX_PATH] = { 0 }; //=== Строка фильтров демонстрации файлов TCHAR *szFilter = TEXT("Graphics Data Files (*.dat)\0") TEXT("*.dat\0") TEXT("All FilesX()") TEXT("*.*\0"); //=== Выявляем текущую директорию TCHAR szCurDir[MAX_PATH]; ::GetCurrentDirectory(MAX_PATH-l,szCurDir); // Структура данных, используемая файловым диалогом OPENFILENAME ofn; ZeroMemory(&ofn,sizeof(OPENFILENAME)); //=== Установка параметров будущего диалога ofn.lStructSize = sizeof(OPENFILENAME); //=== Окно-владелец диалога ofn.hwndOwner = GetSafeHwnd(); ofn.IpstrFilter = szFilter; //=== Индекс строки фильтра (начиная с единицы) ofn.nFilterlndex= 1; ofn.IpstrFile = szFile; ofn.nMaxFile = sizeof(szFile); //=== Заголовок окна диалога ofn.IpstrTitle = _Т("Найдите файл с данными"); ofn.nMaxFileTitle = sizeof(ofn.IpstrTitle); //=== Особый стиль диалога (только в Win2K) ofn.Flags = OFN_EXPLORER; //=== Создание и вызов диалога // В случае неудачи GetOpenFileName возвращает О if (GetOpenFileName(&ofn)) { // Попытка открыть файл, который должен существовать HANDLE hFile = CreateFile(ofn.IpstrFile, GENERIC READ, FILE SHARE READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); //===== В случае неудачи CreateFile возвращает -1 if (hFile == (HANDLE)-1) { MessageBox(_T("He удалось открыть файл")); return S_FALSE; } //=== Попытка прочесть данные о графике if (IDoRead(hFile)) return S_FALSE; //====== Создание нового изображения DrawScene(); //====== Перерисовка окна OpenGL Invalidate(FALSE); } return S_OK; }
Если вы используете операционную систему Windows 2000, то файловый диалог, который создает функция GetOpenFileName, должен иметь другой стиль. Он задан флагом OFN_EXPLORER.