[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]
Program Paper;
{$R-,I-,S-,L-,D-,G+}
Uses
WinTypes,WinProcs,WObjects,Strings;
{ Declare undocumented Windows API call }
Procedure SetDeskWallpaper(Name : PChar);
Far; External 'USER' Index 285;
Var
hPal : HPalette;
{---------------------------------------------------}
{ --- App/Win Object declarations --- }
Type
TPaperApp = Object(TApplication)
Procedure InitMainWindow; Virtual;
End;
PPaperWindow = ^PaperWindow;
PaperWindow = Object(TWindow)
Procedure SetupWindow;
Virtual;
Procedure WMQueryNewPalette(Var Msg : TMessage);
Virtual wm_QueryNewPalette;
Procedure WMPaletteChanged(Var Msg : TMessage);
Virtual wm_PaletteChanged;
End;
{---------------------------------------------------}
{ --- App Methods --- }
Procedure TPaperApp.InitMainWindow;
Begin
If hPrevInst = 0
Then MainWindow := New(PPaperWindow,Init(nil,'Paper'))
Else Halt(0);
End {InitMainWindow};
{ --- Window Methods --- }
{---------------------------------------------------}
Procedure PaperWindow.SetupWindow;
Var
PaperStr : Array [0..80] Of Char;
FName : String[80];
DC : HDC;
LogPal : TLogPalette;
hOldPal : HPalette;
Begin
{ Retreive filename - if none: we just fixup the palette }
FName := ParamStr(1);
If FName <> ''
Then Begin
{ Add .BMP to filename, if necess. }
If Pos('.',FName) = 0
Then FName := FName + '.bmp';
{ Put string in "C" style }
StrPCopy(PaperStr,FName);
{ Make sure we keep WIN.INI apprised of our changes }
WriteProfileString('Desktop','Wallpaper',PaperStr);
{ Set the wallpaper }
SetDeskWallpaper(PaperStr); { Undoc'd win call }
End;
{ Invalidate the screen, even if we don't load a new wallpaper - if
we don't do this, the "transparent" areas of icons will be fratzed up }
InvalidateRect(0,Nil,False);
{ Create a small palette to fix the fact that loading the wallpaper
doesn't realize the palette }
LogPal.palVersion := $0300;
LogPal.palNumEntries := 1;
LogPal.palPalEntry[0].peRed := 0;
LogPal.palPalEntry[0].peGreen := 0;
LogPal.palPalEntry[0].peBlue := 0;
LogPal.palPalEntry[0].peFlags := 0;
{ Get a DC and realize our palette }
DC := GetDC(HWindow);
hPal := CreatePalette(LogPal);
hOldPal := SelectPalette(DC,hPal,False);
RealizePalette(DC);
{ Close up our palette stuff }
SelectPalette(DC,hOldPal,False);
DeleteObject(hPal);
ReleaseDC(HWindow,DC);
{ Close ourselves automatically }
PostMessage(HWindow,wm_Close,0,0);
End {SetupWindow};
{---------------------------------------------------}
Procedure PaperWindow.WMQueryNewPalette(Var Msg : TMessage);
Var
ahDC : HDC;
Begin
ahDC := GetDC(HWindow);
SelectPalette(ahDC,hPal,False);
If (RealizePalette(ahDC) > 0)
Then Begin
ReleaseDC(HWindow,ahDC);
InvalidateRect(HWindow,Nil,False)
End
Else ReleaseDC(HWindow,ahDC);
End {WMQueryNewPalette};
{---------------------------------------------------}
Procedure PaperWindow.WMPaletteChanged(Var Msg : TMessage);
Var
ahDC : HDC;
Begin
If Msg.wParam <> HWindow
Then Begin
ahDC := GetDC(HWindow);
SelectPalette(ahDC,hPal,False);
If (RealizePalette(ahDC) > 0)
Then InvalidateRect(HWindow,nil,False);
ReleaseDC(HWindow,ahDC);
End;
End {WMPaletteChanged};
{---------------------------------------------------}
{ --- Main --- }
Var
PaperApp : TPaperApp;
Begin
CmdShow := sw_Minimize;
PaperApp.Init('Paper');
PaperApp.Run;
PaperApp.Done;
End.
[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]