Внешний вид сайта:

Работа с ресурсами Windows в Delphi

Написание полноценных 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 := ('test'); //хинт
  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));
  //проигрываем два раза с 1 по 100 кадр
  // так как не знаем точного количества кадров

Следующий вопрос, вывод диалоговых окон, делится на два этапа:

Создание из ресурса диалогового окна

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;

Обработка сообщений компонентов диалогового окна

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);

Комментарии

Нет комментариев. Ваш будет первым!