2/10/92 SPLASHSCREEN DEMO Files: Splash.pas - splashscreen unit source Splash.res - splashscreen bitmap resource Zwindow.pas - generic demo program Zilch.res -resource file for Zwindow.pas Splash.txt - this file This small project grew out of looking at the TPW bitmap that pops up every time you start the program. It is my understanding that Object Graphics has a method that creates this type of splash- screen, but rather than buy a library to accomplish this, I hacked around until I came up with something that worked. The result is the unit contained in SPLASH.PAS, which pops up a borderless bitmap window for ten seconds when your program starts. The window is modeless to the extent that it does not halt tasks in other currently executing programs, but greys out the parent program and does not allow the user to close it for the ten seconds it is onscreen. If the user clicked on the greyed parent program, he could actually access it while the splashscreen is visible, but the fact that the parent program appears inactive would discourage most users from doing so. This is probably not very memory efficient(as a sizable bitmap resource has to be loaded into memory every time the parent program executes) but it is quite slick and professional looking and is ideal for a shareware announcement. I have to mention that it drives me crazy that some shareware programmers use timed system modal dialog boxes that bring ALL Windows processes to a halt while their announcement displays. A few times I have loaded these programs while downloading remote data or in the midst of DDE processes and have lost data (it doesn't exactly make me want to run for my checkbook and register their programs). I think this splashscreen method is much more considerate of your end user. ABOUT ZWINDOW.PAS This is a generic TWindow descendent that does nothing except display the splashscreen. It has a menu with an exit command and an about dialog. I included this program as a demo of how to add the splashscreen object to your existing programs. Since the splashscreen is a parentless popup window, the only way you can keep it from being overlapped by the parent window is to call it in between the TApplication.Init and .Run methods : var ZApp : ZilchApp; begin ZApp.Init('ZilchApp'); {this inits the splashscreen object} Application^.MakeWindow(New(PPicWindow, Init(nil, ws_Popup or ws_visible and not ws_OverlappedWindow))); ZApp.Run; ZApp.Done; end. The NIL statement in the splashscreen's init method registers it as a parentless popup that technically is owned by the application but can act independently of it. A normal child window would have a "@self" statement in that position. The _ws parameters define it's behavior and appearance and are described (in not very much detail) in the TPW Programmer's Ref. Note: I have tried dozens of combinations of _ws parameters and this was the only one that gave me the desired results. I hope some of you will fool around with this a little more- if you come up with other settings that work, please let me know. Other than this init statement, all you have to do to use the splashscreen in your program is to add it to your USES clause. ABOUT SPLASH.PAS {TPicWindow} TPicWindow.Init(AParent : PWindowsObject; AStyle : LongInt); Begin TWindow.Init(AParent,''); with Attr do begin Style := AStyle; X := 110; Y := 100; W := 390; H := 255; end; hOpenBmp := LoadBitmap(HInstance,id_OpenBmp); End; The TpicWindow constructor contains other parmeters that affect it's appearance. Using the AStyle:LongInt parameter allows you to access a child window's ws_style field to change it's width, height, (W,H) and the location at which it will open(X,Y). When you change the bitmap resource, be sure to change W and H to the dimensions of the new bitmap. The final statement loads the bitmap itself. {WM_Timer} procedure TpicWindow.WMTimer; Begin DeleteObject(hOpenBmp); KillTimer(hWindow, timer_ID); TWindow.CloseWindow; End; TPicWindow initializes a timer in it's Setup Window method: SetTimer(hWindow, timer_ID, 10000, nil); The third parameter( 10000 ) represents 10000 milleseconds, roughly 10 seconds. By using this statement, you can execute a function when Windows returns a WM_Timer message to the window( hWindow) at the interval (10000) stated in SetTimer. Here, it closes TPicWindow, deletes the bitmap resource and and kills the timer itself (The timer is a global resource that will continue to take up memory if not deleted): Paint The paint method is an abbreviated version of the one contained in TWindow that can display bitmaps of up to 16 colors. A 256 color bitmap would not display properly here because of the lack of a palette handling method. Changing the Bitmap-this must be done on the .res file itself with a resource editor. If you rename the resource, you also have to change the id_bitmap statement. Note : The GetWindowClass and GetClassName functions are included for compatibility with the Windows MDI interface. They are not needed for non-MDI apps like the sample program. Enjoy Scott Hanrahan[70144,3033] P.S. -to give credit where due, I would like to mention two books that have been a great help to me in this and other projects: Turbo Pascal for Windows 3.0 Programming by Tom Swan, and Programming Windows by Charles Petzold