Работа с ресурсами Windows в Delphi
Применение данных ресурсов позволяет значительно ускорить написания приложений и придания им профессионального вида. При написании Windows приложений львиную часть времени отнимает проектирование интерфейса, (нахождение нужной иконки, или Avi файла).
С переходом на winxp простое выдёргивание тёх же иконок из системных файлов не даёт желаемого результата, к тому же, такой путь значительно утяжеляет приложение.
Из всего обилия ресурсов находящихся в системной директории Windows возьмём:
- shell32.dll - ресурсы общего назначения
- netshell.dll - ресурсы иконки сети, Bitmap, диалоговые окна, Аvi
- mmsystem.dll - медиа ресурсы
- comdlg32.dll - диалоговые окна
- compstui.dll - ресурсы принтера
Для поиска ресурсов можно использовать программу ResourseExplorer, которая находдится в папке Program files\borland\delphi6\demos\resxplor, которую необходимо предварительно скомпилировать.
Запустив программу и открыв, к примеру, файл netsell.dll мы увидим ресурсы которые хранятся в данной DLL.
Рассмотрим пример размещения иконки из ресурса в трее.
uses shellapi; //Подключаем необходимые библиотеки
const
//определяем сообщение при клике по трею
wm_notifytrayicon = wm_user + 151;
var //определяем переменные
buffer: array [0..255] of char;
path: string; //путь
hwndhicon : hicon; //хендл иконки
tray: tnotifyicondata; //экземпляр трея
//***** определяем путь к файлу с ресурсом ****
function GetPath(stres: string): string;
begin
GetSystemDirectory(buffer, SizeOf(buffer)); //системная директория
path:= buffer;
result:= path + '\' + 'stres';
end;
//***** получение хендла иконки из ресурса ****
function GetHIcon(path:string; idicon: DWORD): HICON;
begin
result:= ExtractIcon(HInstance, PChar(path), idicon);
end;
//***** создаём иконку в трее ****
procedure CreateTray;
begin
with tray do begin
cbsize := SizeOf(TNotifyIconData);
wnd := Form1.Handle;
uid := 0;
uflags := nif_icon or nif_message or nif_tip;
ucallbackmessage := wm_notifytrayicon; //обрабатываемое сообщение
hicon := GetHIcon('netshell.dll' , 112);
sztip := ('test'); //хинт
end;
shell_notifyicon(nim_add, @tray); //добавить в трей
end;
//*****удаляем иконку в трее ****
procedure DeleteTray;
begin
Shell_NotifyIcon(nim_delete , @tray); //удалить из трея
end;
Для обработки клика по трею используется стандартная обработка созданного нами сообщения.
С иконками разобрались, вывод анимации ещё проще. Переносим на форму компонент вывода анимации Animate1. Открываем DLL, в которой cодержатся ресурсы:
var
hlib: integer;
hlib:= LoadLibrary(pchar(getpath('shell32.dll');
SendDlgItemMessage(
Handle, Animate1.Handle, wm_user + 100, hlib, 166);
//открываем анимацию ресурса
id:= 166;
SendDlgItemMessage(
Handle, Animate1.Handle, wm_user + 101, 2, makelong(1, 100));
//проигрываем два раза с 1 по 100 кадр
// так как не знаем точного количества кадров
Следующий вопрос, вывод диалоговых окон, делится на два этапа:
Создание из ресурса диалогового окна
var
hlib: integer;
mainwnd1: hwnd;
begin
lib:= LoadLibrary(pchar(GetPath('shell32.dll');
mainwnd1:= CreateDialog(hLib, MakeIntResource(28672), 0, nil);
//создаём окно форматирования диска
ShowWindow(mainwnd1, sw_shownormal);
//отображаем окно
while GetMessage(mesg, 0, 0, 0) do begin
WindowDlg(mainwnd1, mesg);
//обработчик оконой процедуры
DispatchMessage(mesg);
TranslateMessage(mesg);
end;
end;
Обработка сообщений компонентов диалогового окна
const
pbm_setpos = wm_user+2;
function WindowDlg(wnd: hwnd; msg: tmsg): lResult;
//обработчик оконой процедуры
var
inf: integer;
begin
{далее происходит цикл обработки сообщений}
case msg.message of wm_command:
begin //удаление окна
PostQuitMessage(0);
DestroyWindow(wnd);
exit;
end;
wm_lbuttondown: case GetWindowLong(msg.hwnd, gwl_id) of
//нажатие левой клавиши определяем id компонента
1: begin
//нажатие клавиши "Начать"
SendDlgItemMessage(wnd, 28678 , pbm_setpos, 50, 0);
//сдвигает процесс бар на 50
end;
end;
Для определения ID компонентов диалогового окна необходимо в обработчик оконной процедуры добавить функцию
GetWindowLong (msg.hwnd, gwl_id);
Комментарии