Использование ресурсов Windows при написании программ на Delphi
© 2005 Альберт Мамедов (MagDelphi)
Написание полноценных 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');
//открываем анимацию ресурса ID:=166;
senddlgitemmessage(Handle,animate1.Handle,wm_user+100,hLib,166);
//проигрываем 2 раза с1 по 100 кадр
// так как не знаем точного количества кадров
senddlgitemmessage(Handle,animate1.Handle,wm_user+101,2,MAKELONG(1,100));
Следующий вопрос, вывод диалоговых окон, делится на два этапа:
-
Создание из ресурса диалогового окна
var
hLib: integer;
MainWnd1:HWND;
begin
hLib:=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;
End;
Для определения ID компонентов диалогового окна необходимо в обработчик оконной процедуры добавить функцию GetWindowLong(msg.hwnd,GWL_ID);
Использование bitmap рассмотрено в примере (3.93K).
Copyright© 2005 Альберт Мамедов (MagDelphi) Специально для Delphi Plus
| 2011 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2010 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2009 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2008 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2007 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2006 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2005 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2004 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2003 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2002 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2001 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 2000 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 1999 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
- Услуги аутсорсинга в области программирования
- Как продлить срок службы картриджей
- Мошенничество во Всемирной Паутине. Осторожно: фишинг!
- Web-студия
- Как легально поднять уровень индекса цитирования.
- Мы реально сможем помочь вам в управлении предприятием
- Создание сайтов – популяризация вашего замысла
- Свой сайт. Управление ресурсом
- Семантическое ядро сайта или правила подбора ключевых фраз
- Инфо-Предприятие: выгоды явные и не явные
- Программирование в среде Delphi 8 for .NET
- Практикум по Delphi для решения прикладных задач
- Фундаментальные алгоритмы и структуры данных в Delphi
- Delphi 6. Программирование на Object Pascal
- Delphi и технология COM
- Delphi в шутку и всерьез: что умеют хакеры
- Программирование в Delphi глазами хакера
- Delphi 2005. Секреты программирования
- Искусство создания компонентов Delphi
- Приемы программирования в Delphi на основе VCL
- Программирование баз данных в Delphi 7
- Программирование баз данных в Delphi
- Программирование в среде Delphi
- Программирование в Delphi 7
- Язык SQL в Delphi 5