Календарь на Май 2024 года: calendar2008.ru/2024/may/
Навигация
Главная »  Delphi 

Использование ресурсов 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);



 

 Работаем со строками.
 Delphi - начало.
 Модальные формы.
 Embarcadero RAD Studio XE3.
 RAD Studio XE3 - изменения в EULA?.


Главная »  Delphi 

© 2024 Team.Furia.Ru.
Частичное копирование материалов разрешено.