|
Навигация
|
Главная » 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
|