Solved

Screensaver preview:

Posted on 1998-12-04
7
463 Views
Last Modified: 2010-04-04
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
Comment
Question by:koger
7 Comments
 
LVL 20

Expert Comment

by:Madshi
ID: 1349328
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
 
LVL 2

Expert Comment

by:trillo
ID: 1349329
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
 

Author Comment

by:koger
ID: 1349330
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
Active Directory Webinar

We all know we need to protect and secure our privileges, but where to start? Join Experts Exchange and ManageEngine on Tuesday, April 11, 2017 10:00 AM PDT to learn how to track and secure privileged users in Active Directory.

 
LVL 4

Expert Comment

by:dwwang
ID: 1349331
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
 

Author Comment

by:koger
ID: 1349332
This is not what I'm looking for I don't have a preview in my screensaver.
0
 
LVL 4

Accepted Solution

by:
dwwang earned 200 total points
ID: 1349333
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
 

Author Comment

by:koger
ID: 1349334
just what I needed
0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Intraweb download file link ? 1 156
tidtcpserver connection lost handle 2 103
Twebbrowser in Fire monkey android scrolling to bottom 1 45
Delphi Seattle StructureView color 1 14
A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…

830 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question