formRenderer.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:7k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1.     (*********************************************************************
  2.      *                                                                   *
  3.      * The contents of this file are used with permission, subject to    *
  4.      * the Mozilla Public License Version 1.1 (the "License"); you may   *
  5.      * not use this file except in compliance with the License. You may  *
  6.      * obtain a copy of the License at                                   *
  7.      * http://www.mozilla.org/MPL/MPL-1.1.html                           *
  8.      *                                                                   *
  9.      * Software distributed under the License is distributed on an       *
  10.      * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or    *
  11.      * implied. See the License for the specific language governing      *
  12.      * rights and limitations under the License.                         *
  13.      *                                                                   *
  14.      * (C) 2004 Milenko Mitrovic <dcoder@dsp-worx.de>                    *
  15.      *                                                                   *
  16.      *********************************************************************)
  17. {.$DEFINE DEBUG}
  18. unit formRenderer;
  19. interface
  20. uses
  21.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  22.   Dialogs, BaseClass, Direct3D9, DirectShow9, StdCtrls;
  23. type
  24.   TfrmRenderer = class(TForm)
  25.     procedure FormCreate(Sender: TObject);
  26.   private
  27.     fWidth : integer;
  28.     fHeight : integer;
  29.     fFormat : TVideoInfoHeader;
  30.     fMessageDrain : hWnd;
  31.   protected
  32.     procedure WndProc(var Message: TMessage); override;
  33.   public
  34.     property MessageDrain : hWnd read fMessageDrain write fMessageDrain;
  35.     function DoSetWindowStyle(Style, WindowLong : LongInt) : HRESULT;
  36.     function DoGetWindowStyle(out Style : LongInt; WindowLong : LongInt) : HRESULT;
  37.     function DoShowWindow(ShowCmd: Longint): HResult;
  38.     procedure DoPaintWindow(Erase : Boolean);
  39.     procedure DoRenderSample(Sample : IMediaSample);
  40.     procedure DoInitializeDirectDraw(Info : PVideoInfoHeader);
  41.   end;
  42. var
  43.   frmRenderer: TfrmRenderer;
  44. implementation
  45. {$R *.dfm}
  46. function PossiblyEatMessage(hwndDrain : hWnd; Msg : Cardinal; wParam : WPARAM; lParam : LPARAM) : Boolean; stdcall;
  47. begin
  48.   if ((hwndDrain <> 0) and not InSendMessage) then
  49.   begin
  50.     case Msg of
  51.       WM_CHAR,
  52.       WM_DEADCHAR,
  53.       WM_KEYDOWN,
  54.       WM_KEYUP,
  55.       WM_LBUTTONDBLCLK,
  56.       WM_LBUTTONDOWN,
  57.       WM_LBUTTONUP,
  58.       WM_MBUTTONDBLCLK,
  59.       WM_MBUTTONDOWN,
  60.       WM_MBUTTONUP,
  61.       WM_MOUSEACTIVATE,
  62.       WM_MOUSEMOVE,
  63.       // If we pass this on we don't get any mouse clicks
  64.       // WM_NCHITTEST,
  65.       WM_NCLBUTTONDBLCLK,
  66.       WM_NCLBUTTONDOWN,
  67.       WM_NCLBUTTONUP,
  68.       WM_NCMBUTTONDBLCLK,
  69.       WM_NCMBUTTONDOWN,
  70.       WM_NCMBUTTONUP,
  71.       WM_NCMOUSEMOVE,
  72.       WM_NCRBUTTONDBLCLK,
  73.       WM_NCRBUTTONDOWN,
  74.       WM_NCRBUTTONUP,
  75.       WM_RBUTTONDBLCLK,
  76.       WM_RBUTTONDOWN,
  77.       WM_RBUTTONUP,
  78.       WM_SYSCHAR,
  79.       WM_SYSDEADCHAR,
  80.       WM_SYSKEYDOWN,
  81.       WM_SYSKEYUP:
  82.       begin
  83.         {$IFDEF DEBUG}
  84.         DbgLog('Delphi Video Renderer: Forwarding Message $' + inttohex(Msg,8) + ' drain');
  85.         {$ENDIF}
  86.         PostMessage(hwndDrain, Msg, wParam, lParam);
  87.         Result := True;
  88.         Exit;
  89.       end;
  90.     end;
  91.   end;
  92.   Result := False;
  93. end;
  94. procedure TfrmRenderer.WndProc(var Message: TMessage);
  95. begin
  96.   if PossiblyEatMessage(fMessageDrain,Message.Msg,Message.WParam,Message.LParam) then Exit;
  97.   case Message.Msg of
  98.     WM_ERASEBKGND:
  99.     begin
  100.       Message.Result := 0;
  101.       Exit;
  102.     end;
  103.   end;
  104.   inherited WndProc(Message);
  105. end;
  106. function TfrmRenderer.DoSetWindowStyle(Style, WindowLong : LongInt) : HRESULT;
  107. var
  108.   WindowRect : TRect;
  109.   WindowFlags : Cardinal;
  110. begin
  111.   // Set the new style flags for the window
  112.   SetWindowLong(Handle,WindowLong,Style);
  113.   WindowFlags := SWP_SHOWWINDOW or SWP_FRAMECHANGED or SWP_NOACTIVATE;
  114.   WindowFlags := WindowFlags or SWP_NOZORDER or SWP_NOSIZE or SWP_NOMOVE;
  115.   // Show the window again in the current position
  116.   if Visible then
  117.   begin
  118.     SetWindowPos(Handle,            // Base window handle
  119.                  HWND_TOP,          // Just a place holder
  120.                  0,0,0,0,           // Leave size and position
  121.                  WindowFlags);      // Just draw it again
  122.     Result := NOERROR;
  123.     Exit;
  124.   end;
  125.   // Move the window offscreen so the user doesn't see the changes
  126.   MoveWindow(Handle,                            // Base window handle
  127.              GetSystemMetrics(SM_CXSCREEN),     // Current desktop width
  128.              GetSystemMetrics(SM_CYSCREEN),     // Likewise it's height
  129.              Width,                             // Use the same width
  130.              Height,                            // Keep height same to
  131.              True);                             // May as well repaint
  132.   // Now show the previously hidden window
  133.   SetWindowPos(Handle,            // Base window handle
  134.                HWND_TOP,          // Just a place holder
  135.                0,0,0,0,           // Leave size and position
  136.                WindowFlags);      // Just draw it again
  137.   ShowWindow(Handle,SW_HIDE);
  138.   if (ParentWindow > 0) then MapWindowPoints(HWND_DESKTOP,ParentWindow,WindowRect,2);
  139.   MoveWindow(Handle,               // Base window handle
  140.              WindowRect.left,      // Existing x coordinate
  141.              WindowRect.top,       // Existing y coordinate
  142.              Width,                // Use the same width
  143.              Height,               // Keep height same to
  144.              True);                // May as well repaint
  145.   Result := NOERROR;
  146. end;
  147. function TfrmRenderer.DoGetWindowStyle(out Style : LongInt; WindowLong : LongInt) : HRESULT;
  148. begin
  149.   Style := GetWindowLong(Handle,WindowLong);
  150.   Result := NOERROR;
  151. end;
  152. function TfrmRenderer.DoShowWindow(ShowCmd: Longint): HResult;
  153. begin
  154.   ShowWindow(Handle,ShowCmd);
  155.   Result := NOERROR;
  156. end;
  157. procedure TfrmRenderer.DoPaintWindow(Erase : Boolean);
  158. begin
  159.   InvalidateRect(Handle,nil,Erase);
  160. end;
  161. procedure TfrmRenderer.DoRenderSample(Sample : IMediaSample);
  162. var
  163.   Bits: PByte;
  164. begin
  165.   Sample.GetPointer(Bits);
  166.   Canvas.Lock;
  167.   StretchDIBits(Canvas.Handle,
  168.     0, 0, ClientWidth, ClientHeight,
  169.     0, 0, FWidth, FHeight,
  170.     Bits, PBitmapInfo(@fFormat.bmiHeader)^,
  171.     DIB_RGB_COLORS, SRCCOPY);
  172.   Canvas.Unlock;
  173. end;
  174. procedure TfrmRenderer.DoInitializeDirectDraw(Info : PVideoInfoHeader);
  175. begin
  176.   fFormat := Info^;
  177.   fWidth  := Info.bmiHeader.biWidth;
  178.   fHeight := Info.bmiHeader.biHeight;
  179.   ClientWidth := fWidth;
  180.   ClientHeight := fHeight;
  181. end;
  182. procedure TfrmRenderer.FormCreate(Sender: TObject);
  183. begin
  184.   fMessageDrain := 0;
  185. end;
  186. end.