Понедельник, 28.09.2026, 22:42
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Форма входа
Меню сайта
Главная » FAQ [ Добавить вопрос ]

Программирование Delphi [91]
Вопрос-Ответ по программированию

Для того чтобы сделать это выполните следующие шаги:

 
      Срздайте новый проект. 
      Установите FormStyle формы в fsMDIForm 
      Разместите Image на форме и загрузите в него картинку. 
      Найдите { Private Declarations } в обьявлении формы и добаьте следующие строки: 
 
                 FClientInstance : TFarProc; 
                 FPrevClientProc : TFarProc; 
                 procedure ClientWndProc(var Message: TMessage); 
 
      Добаьте следующие строки в разделе implementation: 
 
             procedure TMainForm.ClientWndProc(var Message: TMessage); 
             var 
               Dc : hDC; 
               Row : Integer; 
               Col : Integer; 
             begin 
               with Message do 
                 case Msg of 
                   WM_ERASEBKGND: 
                   begin 
                     Dc := TWMEraseBkGnd(Message).Dc; 
                     for Row := 0 to ClientHeight div Image1.Picture.Height do 
                       for Col := 0 to ClientWidth div Image1.Picture.Width do 
                         BitBlt(Dc, 
                            Col * Image1.Picture.Width, 
                            Row * Image1.Picture.Height, 
                            Image1.Picture.Width, 
                            Image1.Picture.Height, 
                            Image1.Picture.Bitmap.Canvas.Handle, 
                            0, 
                            0, 
                            SRCCOPY); 
                       Result := 1; 
                   end; 
                   else 
                     Result := CallWindowProc(FPrevClientProc, 
                                              ClientHandle, 
                                              Msg, 
                                              wParam, 
                                              lParam); 
               end; 
             end; 
 
             В методе формы OnCreate добавьте: 
 
                FClientInstance := MakeObjectInstance(ClientWndProc); 
                FPrevClientProc := Pointer(GetWindowLong(ClientHandle, 
                                           GWL_WNDPROC)); 
                SetWindowLong(ClientHandle, 
                              GWL_WNDPROC, LongInt(FClientInstance)); 
 
             Добавьте к проекту новую форму и установите ее свойство FormStyle в 
             fsMDIChild. 
 
             У Вас получился  MDI-проект с "обоями" в клиентской области MDI формы. 

В примере для глобального перехвата нажатия клавиши printscreen регистрируется горячая клавиша (hot key).
Пример :

 
            type 
               TForm1 = class(TForm) 
                 procedure FormCreate(Sender: TObject); 
                 procedure FormDestroy(Sender: TObject); 
               private 
                 { Private declarations } 
                 procedure WMHotKey(var Msg : TWMHotKey); message WM_HOTKEY; 
               public 
                 { Public declarations } 
               end; 
 
             var 
               Form1: TForm1; 
 
             implementation 
 
             {$R *.DFM} 
 
             const id_SnapShot = 101; 
 
             procedure TForm1.WMHotKey (var Msg : TWMHotKey); 
             begin 
               if Msg.HotKey = id_SnapShot then 
                 ShowMessage('GotIt'); 
             end; 
 
             procedure TForm1.FormCreate(Sender: TObject); 
             begin 
               RegisterHotKey(Form1.Handle, 
                              id_SnapShot, 
                              0, 
                              VK_SNAPSHOT); 
             end; 
 
             procedure TForm1.FormDestroy(Sender: TObject); 
             begin 
               UnRegisterHotKey (Form1.Handle, id_SnapShot); 
             end; 

Spoolerа печати Windows посылает WM_SPOOLERSTATUS каждый раз при добавлении и удалении заданий в очереди печати. В следующем примере показано как перехватить это сообщение
Пример :

 
             type 
               TForm1 = class(TForm) 
                 Label1: TLabel; 
               private 
                 { Private declarations } 
                 procedure WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS); 
                   message WM_SPOOLERSTATUS; 
               public 
                 { Public declarations } 
               end; 
 
             var 
               Form1: TForm1; 
 
             implementation 
 
             {$R *.DFM} 
 
             procedure TForm1.WM_SpoolerStatus(var Msg : TWMSPOOLERSTATUS); 
             begin 
               Lable1.Caption := IntToStr(msg.JobsLeft) + 
                                 ' Jobs currenly in spooler'; 
               msg.Result := 0; 
             end;

Из реестра. См. пример.
Пример :

 
             uses Registry; 
 
             procedure TForm1.Button1Click(Sender: TObject); 
             var 
               reg : TRegistry; 
               ts : TStrings; 
               i : integer; 
             begin 
               reg := TRegistry.Create; 
               reg.RootKey := HKEY_LOCAL_MACHINE; 
               reg.OpenKey('hardware\devicemap\serialcomm', 
                           false); 
               ts := TStringList.Create; 
               reg.GetValueNames(ts); 
               for i := 0 to ts.Count -1 do begin 
                 Memo1.Lines.Add(reg.ReadString(ts.Strings[i])); 
               end; 
               ts.Free; 
               reg.CloseKey; 
               reg.free; 
             end; 

Функция SHELLAPI ExtractIconEx:
Обратите внимание - в примере функции обьявленны иначе, чем в модуле ShellAPI

 
             type ThIconArray = array[0..0] of hIcon; 
             type PhIconArray = ^ThIconArray; 
 
             function ExtractIconExA(lpszFile: PAnsiChar; 
                                     nIconIndex: Integer; 
                                     phiconLarge : PhIconArray; 
                                     phiconSmall: PhIconArray; 
                                     nIcons: UINT): UINT; stdcall; 
               external 'shell32.dll' name 'ExtractIconExA'; 
 
             function ExtractIconExW(lpszFile: PWideChar; 
                                     nIconIndex: Integer; 
                                     phiconLarge: PhIconArray; 
                                     phiconSmall: PhIconArray; 
                                     nIcons: UINT): UINT; stdcall; 
               external 'shell32.dll' name 'ExtractIconExW'; 
 
             function ExtractIconEx(lpszFile: PAnsiChar; 
                                    nIconIndex: Integer; 
                                    phiconLarge : PhIconArray; 
                                    phiconSmall: PhIconArray; 
                                    nIcons: UINT): UINT; stdcall; 
               external 'shell32.dll' name 'ExtractIconExA'; 
 
 
            procedure TForm1.Button1Click(Sender: TObject); 
             var 
                 NumIcons : integer; 
                 pTheLargeIcons : phIconArray; 
                 pTheSmallIcons : phIconArray; 
                 LargeIconWidth : integer; 
                 SmallIconWidth : integer; 
                 SmallIconHeight : integer; 
                 i : integer; 
                 TheIcon : TIcon; 
                 TheBitmap : TBitmap; 
             begin 
               NumIcons := 
               ExtractIconEx('C:\Program Files\Borland\Delphi 3\BIN\delphi32.exe', 
                             -1, 
                             nil, 
                             nil, 
                             0); 
               if NumIcons > 0 then begin 
                 LargeIconWidth := GetSystemMetrics(SM_CXICON); 
                 SmallIconWidth := GetSystemMetrics(SM_CXSMICON); 
                 SmallIconHeight := GetSystemMetrics(SM_CYSMICON); 
                 GetMem(pTheLargeIcons, NumIcons * sizeof(hIcon)); 
                 GetMem(pTheSmallIcons, NumIcons * sizeof(hIcon)); 
                 FillChar(pTheLargeIcons^, NumIcons * sizeof(hIcon), #0); 
                 FillChar(pTheSmallIcons^, NumIcons * sizeof(hIcon), #0); 
                ExtractIconEx('C:\Program Files\Borland\Delphi 3\BIN\delphi32.exe', 
                               0, 
                               pTheLargeIcons, 
                               pTheSmallIcons, 
                               numIcons); 
                {$IFOPT R+} 
                  {$DEFINE CKRANGE} 
                  {$R-} 
                {$ENDIF} 
                 for i := 0 to (NumIcons - 1) do begin 
                   DrawIcon(Form1.Canvas.Handle, 
                            i * LargeIconWidth, 
                            0, 
                            pTheLargeIcons^[i]); 
                   TheIcon := TIcon. Create; 
                   TheBitmap := TBitmap.Create; 
                   TheIcon.Handle := pTheSmallIcons^[i]; 
                   TheBitmap.Width := TheIcon.Width; 
                   TheBitmap.Height := TheIcon.Height; 
                   TheBitmap.Canvas.Draw(0, 0, TheIcon); 
                   TheIcon.Free; 
                   Form1.Canvas.StretchDraw(Rect(i * SmallIconWidth, 
                                                 100, 
                                                 (i + 1) * SmallIconWidth, 
                                                 100 + SmallIconHeight), 
                                            TheBitmap); 
                   TheBitmap.Free; 
                 end; 
                {$IFDEF CKRANGE} 
                  {$UNDEF CKRANGE} 
                  {$R+} 
                {$ENDIF} 
                 FreeMem(pTheLargeIcons, NumIcons * sizeof(hIcon)); 
                 FreeMem(pTheSmallIcons, NumIcons * sizeof(hIcon)); 
               end; 
             end; 
 
             end. 

Наш опрос
Сколько вам лет
Всего ответов: 20
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Поиск