Использование ресурсов Windows при написании программ на Delphi

© 2005 Альберт Мамедов (MagDelphi)

Написание полноценных Windows приложений на Delphi требует от программиста навыков использования ресурсов Windows. Под ресурсами Windows подразумеваем ресурсы (BITMAP, ICON, AVI, DIALOG) содержащиеся в системных файлах. Применение данных ресурсов позволяет значительно ускорить написания приложений и придания им профессионального вида. При написании Windows приложений львиную часть времени отнимает проектирование интерфейса (нахождение нужной иконки, или AVI файла). С переходом на WinXP простое выдёргивание тёх же иконок из системных файлов не даёт желаемого результата, к тому же, такой путь значительно утяжеляет приложение.

Из всего обилия ресурсов находящихся в системной директории Windows возьмём:

  1. Shell32.dll - ресурс общего назначения
  2. netShell.dll - ресурс сетевой иконки, bitmap, диалог. окна, АVI
  3. mmsystem.dll - медиа ресурс;
  4. comdlg32.dll - диалог окна;
  5. 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));

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

  1. Создание из ресурса диалогового окна
    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;
  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;
    End;

Для определения ID компонентов диалогового окна необходимо в обработчик оконной процедуры добавить функцию GetWindowLong(msg.hwnd,GWL_ID);

Использование bitmap рассмотрено в примере (3.93K).

Copyright© 2005 Альберт Мамедов (MagDelphi)  Специально для Delphi Plus

2011123456789101112
2010123456789101112
2009123456789101112
2008123456789101112
2007123456789101112
2006123456789101112
2005123456789101112
2004123456789101112
2003123456789101112
2002123456789101112
2001123456789101112
2000123456789101112
1999123456789101112

Последние статьи
Литература