Читать «Виртуальная библиотека Delphi» онлайн - страница 70

Unknown

////////////////////////////////////////////////////////////////////////////////

// Конструктор

////////////////////////////////////////////////////////////////////////////////

constructor TLiteFrame.Create(AWndParent: THandle);

begin

  inherited Create;

  // Запоминаем дескриптор родительского окна

  FWndParent := AWndParent;

  // Создаем место под блок обратного вызова

  FWndCallback := VirtualAlloc(nil,12,MEM_RESERVE or

MEM_COMMIT,PAGE_EXECUTE_READWRITE);

  // Формируем блок обратного вызова

  asm

    mov  EAX, Self

    mov  ECX, [EAX].TLiteFrame.FWndCallback

    mov  word  ptr [ECX+0], $6858               // pop  EAX

    mov  dword ptr [ECX+2], EAX                 // push _Self_

    mov  word  ptr [ECX+6], $E950               // push EAX

    mov  EAX, OFFSET(TLiteFrame.WindowCallback)

    sub  EAX, ECX

    sub  EAX, 12

    mov  dword ptr [ECX+8], EAX                 // jmp  TLiteFrame.WindowCallback

  end;

end;

////////////////////////////////////////////////////////////////////////////////

// Деструктор

////////////////////////////////////////////////////////////////////////////////

destructor TLiteFrame.Destroy;

begin

  // Уничтожаем структуру блока обратного вызова

  VirtualFree(FWndCallback, 0, MEM_RELEASE);

  // Уничтожение по умолчанию

  inherited;

end;

////////////////////////////////////////////////////////////////////////////////

// TLiteFrame

// ___________________________________________________________

// Функции обработки сообщений

////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////

// Функция обратного вызова для получения оконных сообщений

////////////////////////////////////////////////////////////////////////////////

function TLiteFrame.WindowCallback(hWnd: HWnd;

Msg, WParam, LParam: Integer): Longint;

var

  WindowMsg : TMessage;

begin

  // Запоминаем дескриптор окна, если это первый вызов

// оконной процедуры

  if FWndHandle = 0 then FWndHandle := hWnd;

  // Формируем сообщение

  WindowMsg.Msg    := Msg;

  WindowMsg.WParam := WParam;

  WindowMsg.LParam := LParam;

  // Обрабатываем его

  WindowProcedure(WindowMsg);

  // Возвращаем результат обратно системе

  Result := WindowMsg.Result;

end;

////////////////////////////////////////////////////////////////////////////////

// Виртуальная функция для обработки оконных сообщений

////////////////////////////////////////////////////////////////////////////////