- •Использование редактора ресурсов
- •Добавление пиктограмм
- •Добавление курсоров
- •Добавление битовых образов
- •Использование фонографа (Sound Recorder)
- •94. Разработка ресурсов меню и акселераторов клавиатуры. Файл заголовков (resource.H). Файл ресурсов (menu3.Rc). Файл приложения (menu3.Cpp).
- •95. Получение списка файлов каталогов. Файл заголовков (resource.H). Файл ресурсов (menu4.Rc). Файл приложения (menu4.Cpp).
95. Получение списка файлов каталогов. Файл заголовков (resource.H). Файл ресурсов (menu4.Rc). Файл приложения (menu4.Cpp).
Получение списка файлов каталогов
Resource.h - Файл заголовка, создаваемый средой разработки; содержит определения символов.
В четвертом приложении используется одно меню, которое позволяет пользователю выбрать диск (от А: до D:) и получить список файлов (содержимое) каталога на этом диске. Затем список выводится в окне. Поскольку список файлов может быть достаточно длинным, окно снабжено вертикальной полосой прокрутки. Меню не позволяют пользователю вводить данные непосредственно с клавиатуры, так что приложение ограничивается четырьмя вышеупомянутыми дисками.
Основным недостатком данной программы является то, что можно вывести список файлов только текущего каталога; для перехода из одного каталога в другой не предусмотрено никаких средств.
Ниже приведен листинг файла заголовков MENU4.H. Данный файл используется для хранения информации об идентификаторах, используемых в приложении.
// файл заголовков menu4.h
// информация о системе
Idefine IDM_AFILES 501 Idefine IDMJ3FILES 502 Idefine IDM_CFILES 503 Idefine IDM DFILES 504
Ниже приведен текст файла ресурсов MENU4.RC, в котором содержатся определения меню и пунктов меню, используемых для получения содержимого каталогов.
#include "windows.h" linclude "menu4.h"
Directory MENU {
POPUP "&Directory_Information"
IDM_AFILES
IDM_BFILES IDM_CFILES IDM DFILES
MENUITEM "Directory A:", MENUITEM "Directory B:", MENUITEM "Directory C:", MENUITEM "Directory D:",
}
}
Текст приложения MENU4.C похож на тексты трех предыдущих примеров. Тем не менее, читая этот листинг, обратите внимание на подключение вертикальной полосы прокрутки.
// menu4.с
// Использование меню для получения информации о содержимом
// каталогов дисков А, В, С или D.
// Copyright (с) Chris Н. Pappas and William Н. Murray, 1994
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include "menu4.h"
#define SCROLLLINES 50
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
char szProgName [ ] ="ProgName" ;
char szApplName[]="Directory";
char szMessage[44];
char szMyfile[10];
int sLength;
int WINAPI WinMain (HINSTANCE hlnst, HINSTANCE hPrelnst, LPSTR IpszCmdLine,int nCmdShow)
{
HWND hWnd;
MSG lpMsg;
=szProgName;
=hlnst;
=WndProc;
=LoadCursor(NULL,IDC_ARROW);
=NULL;
=szApplName;
=GetStockObject(WHITE_BRUSH);
=CS_HREDRAW|CS_VREDRAW;
=0;
=0;
wcApp.IpszClassName wcApp.hlnstance wcApp.lpfnWndProc wcApp.hCursor wcApp.hicon wcApp.IpszMenuName wcApp.hbrBackground wcApp.style wcApp.cbClsExtra wcApp.cbWndExtra
if(!RegisterClass(&wcApp))
return 0;
}
hWnd=CreateWindow(szProgName,"Directory Listings", WS_OVERLAPPEDWINDOW|WS_VSCROLL,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, (HWND)NULL,(HMENU)NULL,
(HANDLE)hlnst,(LPSTR)NULL);
ShowWindow (hWnd, nCmdShbw);
UpdateWindow(hWnd);
…
InvalidateRect(hWnd,NULL, TRUE) ;
break;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps) ;
// Начало фрагмента пользователя
i=0;
SetCurrentDirectory(szMyfile);
hFindFile=FindFirstFile(IpszSearchFile,&ffd);
sLength=sprintf(szMessage,ffd.cFileName);
TextOut(hdc,0,charht*(i-NewVPos), szMessage,sLength);
i++;
for(;;) {
fRC=FindNextFile(hFindFile,&ffd);
if (fRC==FALSE) {
FindClose(hFindFile) ;
break;
}
else
FindNextFile(hFindFile, &ffd);
sLength=sprintf(szMessage,ffd.cFileName);
TextOut(hdc,0,charht*(i-NewVPos), szMessage,sLength);
i++;
}
// Конец фрагмента пользователя
ValidateRect(hWnd,NULL) ;
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage(0) ;
break;
default:
return (DefWindowProc (hWnd,messg, wParam, lParam));
}
return(0);
}
Кроме этих трех файлов потребуется создать файл проекта для компилятора C/C++. После создания файла проекта убедитесь в том, что в список файлов для построения приложения включены файлы MENU4.RC и MENU4.C.
Файл заголовков (MENU4.H)
Файл заголовков содержит четыре неповторяющихся идентификатора и связанные с ними числа для каждого из дисков:IDM_AFILES,IDM_BFILES, IDM_CFILES и IDM_DFILES. Найдите эти идентификаторы в листинге файла MENU4.H.
Файл ресурсов (MENU4.RC)
В приложении используется одно меню, которое называется Directory_Information. Четыре пункта меню позволяют пользователю выбрать текущий каталог на диске А, В, С или D.
Файл приложения (MENU4.C)
Приложение обслуживает меню стандартным образом. Обрабатываются пять важных сообщений: WM_CREATE, WM_SIZE, WM_VSCROLL, WM_COMMAND и WM_PAINT.
При обработке сообщения WM_CREATE с помощью функции GetTextMetrics() получаются предварительные сведения о текущей высоте текста.
При обработке WM_CREATE также устанавливается начальное положение движка вертикальной полосы прокрутки и диапазон полосы прокрутки (при помощи функций SetScrollPos() и SetScrollRange(), соответственно).
При обработке сообщения WM_SIZE приложение получает информацию о текущих размерах окна. Приложение интересует только размер окна по вертикали. Эта информация необходима для организации прокрутки на страницу.
При обработке WM COMМAND запоминается выбранный из меню диск. Как указывалось ранее, данное приложение позволяет выбирать из А:, В:, С: и D:. Независимо от выбранного значения, оно заносится в переменную szMyfile. При обработке сообщения WM PAINT эта строка используется при вызове некоторых функций Windows.
Обработка сообщения WM__COMMAND заканчивается вызовом функции InvalidateRect() Напомним, что эта функция передает сообщение WM_PAINT для обновления изображения.
При обработке сообщения WM PAINT для получения списка файлов каталога используются вызовы трех функций Windows: SetCurrentDirectory(), FindFirstFile() и FindNextFile(). Текущий каталог устанавливается на основании информации, содержащейся в szMyfile.
SetCurrentDirectory(szMyfile);
После выбора диска вызывается функция FindFirstFile(), позволяющая найти в каталоге первый файл, отвечающий критерию IpszSearchFile.
hFindFile=FindFirst(lpszSearchFile, &ffd);
sLength=sprintf(szMessage, ffd.cFileName);
TextOut(hdc, 0, charht*(i-NewVPos), szMessage, sLength);
В данном случае для поиска всех файлов с любыми расширениями используется критерий поиска Адрес переданной информации содержится в переменной ffd, которая является экземпляром структуры Windows WIN32_FIND_DATA.
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReservedO;
DWORD dwReserved1;
CHAR cFileName[MAX_PATH];
CHAR cAlternateFileName[14];
} WIN32_FIND_DATA;
Информация, возвращаемая в структуру, обрабатывается при помощи функции sprintf(), заносится в szMessage и выводится в окно при помощи функции TextOut().
Вызов следующей функции выполняется в цикле for. Возвращаемое функцией FindNextFiIe() значение проверяется, чтобы определить, не достигнут ли конец каталога.
i++;
for (;;} {
fRC=FindNextFile(hFindFile, &ffd);
if (fRC==FALSE) {
FindClose(hFindFile);
break;
}
else
FindNextFile(hFindFile, &ffd);
sLength=sprintf (szMessage, ffd.cFileName);
TextOut(hdc, 0, charht*(i-NewVPos), szMessage, sLength);
i++;
}
Если пройдены все файлы в каталоге, то вызывается функция FindClose(); в противном случае возвращается и выводится на экран имя следующего файла.
Имена файлов выводятся с использованием текущего шрифта окна, около левой границы окна (смещение по горизонтали X при вызове функции TextOut() установлено в 0). Положение по вертикали определяется произведением высоты символа (charht) и разности номера файла (i) и положения вертикальной полосы прокрутки (NewVPos):
положение по вертикали = charht*(i — NewVPos)
