Альберт Мамедов
Написание полноценных windows приложений на delphi требует от программиста навыков применения ресурсов windows. Под ресурсами windows подразумеваем ресурсы (bitmap, icon, avi, dialog) содержащиеся в системных файлах . Применение данных ресурсов позволяет значительно ускорить написания приложений и придания им профессионального вида. При написании 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 := ('проба');//хинт
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));//проигрываем 2 раза с1 по 100 кадр
// так как не знаем точного количества кадров
|
Следующий вопрос, вывод диалоговых окон, делится на два этапа:
1. Создание из ресурса диалогового окна:
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;
|
2. Обработка сообщений компонентов диалогового окна:
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);