Использование ресурсов Windows при написании программ на Delphi (исходники)

Источник: Articles
Альберт Мамедов

Написание полноценных 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);


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=8110