Is there a Preview Handler VCL for Windows 7?

后端 未结 5 1804
别跟我提以往
别跟我提以往 2020-12-28 11:19

This article

http://msdn.microsoft.com/en-gb/library/bb776867.aspx

describes preview handlers in Windows as

Preview handlers are calle

5条回答
  •  长情又很酷
    2020-12-28 11:27

    @Mjn, right know I'm writing an article for my blog to implement Preview Handlers from Delphi, but due to lack of time, I do not know when this is complete, as others users mention by the moment no exist a VCL component in Delphi to implement preview handlers, in the past I implemented a couple of preview handlers for a customer but using Delphi-Prism and C#.

    As starting point here I leave some tips.

    • You must use the IPreviewHandler, InitializeWithFile, InitializeWithStream, IPreviewHandlerFrame, IPreviewHandlerVisuals interfaces.

    This is the Delphi translation of the headers of these interfaces

    uses
      Windows, ActiveX, AxCtrls, ShlObj, ComObj;
    
    type
    
    
      IIPreviewHandler = interface(IUnknown)
        ['{8895b1c6-b41f-4c1c-a562-0d564250836f}']
        function SetWindow(hwnd: HWND; var RectangleRef: TRect): HRESULT; stdcall;
        function SetRect(var RectangleRef: TRect): HRESULT; stdcall;
        function DoPreview(): HRESULT; stdcall;
        function Unload(): HRESULT; stdcall;
        function SetFocus(): HRESULT; stdcall;
        function QueryFocus(phwnd: HWND): HRESULT; stdcall;
        function TranslateAccelerator(PointerToWindowMessage: MSG): HRESULT; stdcall;
      end;
    
      IInitializeWithFile = interface(IUnknown)
        ['{b7d14566-0509-4cce-a71f-0a554233bd9b}']
        function Initialize(pszFilePath: LPWSTR; grfMode: DWORD):HRESULT;stdcall;
      end;
    
      IInitializeWithStream = interface(IUnknown)
        ['{b824b49d-22ac-4161-ac8a-9916e8fa3f7f}']
        function Initialize(pstream: IStream; grfMode: DWORD): HRESULT; stdcall;
      end;
    
      IIPreviewHandlerFrame = interface(IUnknown)
        ['{fec87aaf-35f9-447a-adb7-20234491401a}']
        function GetWindowContext(pinfo: HWND): HRESULT; stdcall;
        function TranslateAccelerator(PointerToWindowMessage: MSG): HRESULT; stdcall;
      end;
    
      IIPreviewHandlerVisuals = interface(IUnknown)
        ['{8327b13c-b63f-4b24-9b8a-d010dcc3f599}']
            function SetBackgroundColor(color: COLORREF ): HRESULT; stdcall;
            function SetFont(plf:LOGFONTW): HRESULT; stdcall;  
            function SetTextColor(color: COLORREF): HRESULT; stdcall;
      end;
    
    • You must create a com dll with a class which descend from these interfaces IIPreviewHandler, IIPreviewHandlerVisuals, IOleWindow, IObjectWithSite to manage the visualization and a second class to load the files to show. this class must descend from IPreviewHandler, IInitializeWithStream.

    something like this

      TMyPreviewHandler = class(IIPreviewHandler, IIPreviewHandlerVisuals, IOleWindow, IObjectWithSite)
    
      TMyStream = class(IIPreviewHandler, IInitializeWithStream, IStream)
    
    • Now you must create your own implementation of the methods for the parent interfaces. this is the list of the methods which you need implement.

      IPreviewHandler -> DoPreview, SetWindow, SetRect, Unload, SetFocus, TranslateAccelerator, QueryFocus.

      IObjectWithSite -> GetSite, SetSite.

      IOleWindow -> GetWindow

      IPreviewHandlerVisuals - > SetBackgroundColor, SetFont, SetColor

      InitializeWithStream -> Initialize

    • finally you must register your COM in the system as well as the file extensions which will use you PrevieHandler class.

    • Check this project as a starting point Windows Preview Handler Pack (is written in C#) and this article View Data Your Way With Our Managed Preview Handler Framework

提交回复
热议问题