Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 490
  • Last Modified:

Screensaver preview:

How do I create a preview of my screensaver in the screensaver properties, I need some samples that aren't to hard to understand.
0
koger
Asked:
koger
1 Solution
 
MadshiCommented:
Do you need a "little" preview in stamp size or is it ok to watch the preview in full-screen?
I don't know how to do a stamp preview. But a full-screen preview is very easy:

var si : TStartupInfo;
    pi : TProcessInformation;
begin
  ZeroMemory(@si,sizeOf(si)); si.cb:=sizeOf(si);
  if CreateProcess(nil,'c:\windows\system\marquee.scr',nil,nil,false,0,nil,nil,si,pi) then begin
    CloseHandle(pi.hThread); CloseHandle(pi.hProcess); // Never forget to close handles...
  end;

Regards, Madshi.
0
 
trilloCommented:
When previewing, The preview window calls your program (with SCR extension) with two commandline parameters the first is a "p" and the second one is the handle of the preview window.

I'll paste here some code I used for a screensaver I made.

-----------------begin of code------------
unit Unit_InitProcs;

interface
uses Windows, extctrls, Classes, Graphics, SysUtils, Messages;

procedure ExecPreview;

var
  SaverMode:        Integer;  {one of the consts above}
  ParamHandle:      THandle;  {the Handle passed on command line as parameter}
  ConfigParent:     hWnd;     {the parent window for config-dialog}

  PrevRect:         TRect;
  MyBmp:        TBitmap;
  PreviewCanvas : TCanvas;
  R:    TRect;
implementation

{this is the window-proc for the preview window, it only implements 3 messages}
function MyWndProc (Wnd : HWnd; Msg : Integer; wParam : Word; lParam : Integer) : Integer; far; stdcall;
var
    x,y,cx,cy:  Integer;
begin {I don't know if it is ok to quit on WM_CLOSE, but I had no problems doing so}
    if (Msg = WM_DESTROY) or (Msg = WM_CLOSE) then
        PostMessage (Wnd, WM_QUIT, 0, 0);
    if Msg = WM_PAINT then begin
        x:=Round((PrevRect.Right-R.Right)/2);
        y:=Round((PrevRect.Bottom-R.Bottom)/2);
        cx:=x + R.Right-R.Left;
        cy:=y + R.Bottom-R.Top;
        PreviewCanvas.CopyRect(Rect(x,y,cx,cy),MyBmp.Canvas,R);
    end;
    DefWindowProc (Wnd, Msg, wParam, lParam);
end;
{This executes the preview window,
 and goes in a message loop to keep it running}
procedure ExecPreview;
var
  WndClass : TWndClass;
  Atom     : TAtom;
  DC       : hDC;
  MyWnd    : hWnd;
  Msg      : TMsg;
begin
  {create a new window class}
  with WndClass do begin
    style := CS_PARENTDC;
    lpfnWndProc := @MyWndProc;
    cbClsExtra := 0;
    cbWndExtra := 0;
    hIcon := 0;
    hCursor := 0;
    hbrBackground := 0;
    lpszMenuName := nil;
    lpszClassName := 'Delphi2ScreenSaverPreview';
  end;
  WndClass.hInstance := hInstance;
  Atom := Windows.RegisterClass (WndClass);
  {get some info on parent window}
  GetWindowRect (ParamHandle, PrevRect);
  PrevRect.Right := PrevRect.Right - PrevRect.Left;
  PrevRect.Bottom := PrevRect.Bottom - PrevREct.Top;
  PrevRect.Left := 0;
  PrevRect.Top := 0;
  {and now create the window as child of the window given in ParamHandle}
  MyWnd := CreateWindow ('Delphi2ScreenSaverPreview', 'FunSaver',
    WS_CHILD or WS_DISABLED or WS_VISIBLE, 0, 0, PrevRect.Right,
    PrevRect.Bottom, ParamHandle, 0, hInstance, nil);
  {get the DC for the new created window}
  DC := GetDC (MyWnd);
  PreviewCanvas := TCanvas.Create;
  PreviewCanvas.Handle := DC;
  MyBmp:=TBitmap.Create;
  MyBmp.LoadFromResourceName(hInstance,'INQUILINO');
  R:=Rect(0,0,MyBmp.Width,MyBmp.Height);
  {and now do the message loop, I think I cannot use any predifined loop here}
  while GetMessage(Msg, 0, 0, 0) do begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
  MyBmp.Free;
  PreviewCanvas.Free;
  ReleaseDC(0,DC);
  {I don't care about other resources here, as my app terminates immediately and
   Win95 cleans up after me}
end;

----------------end of code-------------
This block of code makes use of some unusual-in-Delphi functions and structures but it's not so hard to understand. In fact, we only create a new window and we make it a Child of the preview dialog box. Our window doesn't have a border and this is the window we will use to draw our screensaver.

Just tell me when you encounter any problem or if you have any question.

Trillo
0
 
kogerAuthor Commented:
I have got this sample from somewhere (can't remember where) but I still don't get it, could you perhaps create a quick sample that would e.g. display an image.
0
Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

 
dwwangCommented:
Supose you want to preview a screen saver in a panel named panel1:

var
   s:string;
begin
     s:='c:\windows\system\YourScrName.scr /P '+trim(IntToStr(panel1.handle));
      WinExec(pchar(s),0);
end;

0
 
kogerAuthor Commented:
This is not what I'm looking for I don't have a preview in my screensaver.
0
 
dwwangCommented:
Oh, I see, so this site will help you for sure, it describe how to build screen savers as well as how to write the preview part. Full source is included.

http://www.inprise.com/devsupport/delphi/ti_list/TI3335.html
0
 
kogerAuthor Commented:
just what I needed
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now