字体和壁纸合并后再更改壁纸--《用delphi开发共享软件》-15.2桌面提示器
1 procedure TFrmPlay.mnDeskPicClick(Sender: TObject); 2 Var s:String; i:Integer; 3 begin 4 //s:=Path+'SetPic.exe'; 5 //EnableDebugPrivilege(True); 6 //ShellExecute(GetDesktopWindow ,'open',Pchar(s), nil,Pchar(Path),SW_SHow); Exit; 7 i:=sgPic.Row; 8 s:=sgPic.Cells[1,i]; //原始图片文件 9 if pos(':',s)=0 then s:=Path+s; //==相对路径 10 if FileExists(s) then MakeWallPic(s); //产生并设置壁纸 11 //SetWallPaper(s,2); 12 end;
1 procedure TFrmPlay.MakeWallPic(sPic:String); //合并新墙纸 2 Var sBMP,sJPG:String; img,imgTmp:TImage; 3 JpegImage:TJpegImage; 4 udtblender:TBlendFunction;//图片效果处理参数 5 begin 6 with udtblender do 7 begin 8 Blendop:=AC_SRC_OVER; 9 Blendflags:=0; 10 SourceConstantAlpha:=255-spTransparent.Value;//透明度 11 AlphaFormat:=0; 12 end; 13 14 //s:=WinPath+'\'+ChangeFileExt(ExtractFileName(sPic),'.JPG'); 15 sBmp:=Path+'DeskPic\'+ChangeFileExt(ExtractFileName(sPic),'.BMP'); 16 sJPG:=Path+'DeskPic\'+ChangeFileExt(ExtractFileName(sPic),'.JPG'); 17 img:=TImage.Create(nil); 18 imgTmp:=TImage.Create(nil); //创建BMP图片 19 JpegImage:=TJpegImage.Create; //创建JPG图片 20 try 21 img.AutoSize :=True; 22 img.Picture.LoadFromFile(sPic); //装载原始图片 //img.Picture.Assign(nil); 23 LoadBMPJPG(img,sPic); 24 //imgTmp.Picture.Assign(img.Picture); 25 imgTmp.Width :=img.Width; 26 imgTmp.Height :=img.Height; 27 imgTmp.Canvas.Draw(0,0,img.Picture.Graphic);//绘制到临时图片中 28 ShowHint(img);//在临时图片中绘制 提示文字信息 29 windows.AlphaBlend(imgTmp.Canvas.Handle,0,0,imgTmp.Width,imgTmp.Height, 30 img.Canvas.Handle,0,0,img.Width,img.Height, 31 udtblender); //关键调用api 32 33 imgTmp.Picture.Bitmap.SaveToFile(sBMP);//保存临时文件到磁盘 34 35 //保存最终的JPG的壁纸文件: 36 JpegImage.Assign(imgtmp.Picture.Graphic); //JpegImage.CompressionQuality:=100; 37 JpegImage.PixelFormat:=jf24Bit; 38 JpegImage.Compress; 39 JpegImage.SaveToFile(sJPG); 40 finally 41 img.Free; 42 imgTmp.Free; 43 JpegImage.Free; //edFile.Text :=sBMP; 44 if Fileexists(sBMP) then SetRegWallPaper(sBMP);//设置壁纸 45 sleep(50); 46 if Fileexists(sJPG) then SetWallPaper(sJPG,2); //设置壁纸 47 //MyDeleteFile(sBMP); //==不需要了!?? 48 end; 49 end; 50 51 procedure TFrmPlay.ShowHint(img:TImage); //合成文字 52 Var i,n,h,w,size:Integer; s,s2,sHint,sfmt:String; 53 begin 54 sHint:=''; //需要回执的特殊格式的文字; 55 if chkShowDate.Checked then sHint:=MyDatestr(SysUtils.Date,True); //显示日期 56 if chkShowWeek.Checked then //显示星期 57 sHint:=sHint+' '+Days[DayofWeek(SysUtils.Date)]; 58 if sHint<>'' then sHint:=sHint+'^^'; 59 60 for i:=sgHint.RowCount -1 downto 1 do //计算文字行数 61 if sgHint.Cells[1,i]<>'' then 62 begin 63 n:=i; 64 Break; 65 end; 66 67 for i:=1 to n do //填加文字 68 sHint:=sHint+sgHint.Cells[1,i]+'^^'; 69 70 n:=ItemsOfStr(sHint,'^^'); 71 //img.Canvas.Font.Size:=24; //max(24,img.Height div 20) ;//==字体大小 72 img.Canvas.Font:=plHintFont.Font; 73 74 h:=img.Canvas.TextHeight('jy'); 75 {while h*10>img.Height do 76 begin 77 img.Canvas.Font.Size:=img.Canvas.Font.Size-1; 78 if img.Canvas.Font.Size<10 then Break; 79 h:=img.Canvas.TextHeight('jy'); 80 end; } 81 //h:=img.Canvas.TextHeight('jy'); 82 size:=img.Canvas.Font.Size; 83 SetFontSmooth(True); //设置文字平滑绘制 84 85 sFmt:=FontToStr(plHintFont.font)+';~~'+colortostr(pledgeColor.Font.Color)+';~~'+inttostr(spedgeWidth.Value);//合成特定格式 86 ShowFmtTxt(img.Canvas,' ~~0~~0~~0~~'+sFmt,''); 87 for i:=1 to min(n,11) do //最多显示11行提示文字 88 begin 89 s2:=TextOfIndex(sHint,'^^',i); 90 s2:=Trim(s2); 91 w:=img.Canvas.TextWidth(s2); 92 s:='~~'+inttostr(img.Width-w-5)+'~~'+intTostr(i*h-h); 93 // s:=s+'~~0~~楷体_BG2312;'+inttostr(h)+';255;255;255;fsItalic~~16;16;16;~~1'; 94 s:=s+'~~0~~'+sFmt; 95 ShowFmtTxt(img.Canvas,s2+s,''); 96 if chkSHowLine.Checked then 97 DrawLineH3(img.Width-w-5,i*h-1,w,img.Canvas,plLineColor.Font.Color,dRight); 98 end; 99 SetFontSmooth(oldTFONTSMOOTHING); //恢复原来的文字平滑方式 100 end;
1 Procedure TFrmPlay.SetRegWallPaper(StrFile:String); 2 Var Reg:TRegistry; 3 begin 4 Reg:=Tregistry.Create;{创建Tregistry对象的实例} 5 Reg.Rootkey:= Hkey_Current_User;{设置根键名称} 6 try 7 if Reg.OpenKey('Control Panel\Desktop',False) then {打开Control Panel\Desktop 路径对应的主键} 8 begin 9 //ShowMessage('打开注册表成功'); 10 Reg.WriteString('TileWallPaper','0'); 11 Reg.WriteString('WallpaperStyle','2'); 12 Reg.WriteString('Wallpaper',StrFile);{向TileWallpaper 和Wallpaper串覆盖写入新值} 13 Reg.WriteString('ConvertedWallpaper',StrFile); 14 Reg.WriteString('OriginalWallpaper',StrFile); 15 Reg.CloseKey;{将更改内容写入注册表并关闭} 16 Systemparametersinfo(SPI_SETDESKWallpaper,0,Pchar(StrFile), 17 SPIF_upDateINIFIle Or SPIF_SENDWININICHANGE); // or SPIF_SendChange);{向Windows发送消息,通知Windows更换壁纸} 18 end; 19 finally 20 Reg.Free; 21 end; 22 end;
1 Procedure TFrmPlay.SetWallPaper(StrFile: String; Style: Integer); 2 Var DT: IActiveDesktop; 3 WPO: TWallpaperOpt; 4 WS: WideString; 5 begin 6 DT := CreateComObject(CLSID_ActiveDesktop) As IActiveDesktop; 7 WS := StrFile; 8 Case Style Of 9 0: WPO.dwStyle := WPSTYLE_CENTER; {居中} 10 1: WPO.dwStyle := WPSTYLE_TILE; {平铺} 11 2: WPO.dwStyle := WPSTYLE_STRETCH; {拉伸} 12 else WPO.dwStyle := WPSTYLE_CENTER; 13 end; 14 WPO.dwSize := SizeOf(WPO); 15 DT.SetWallpaperOptions(WPO, 0); 16 DT.SetWallPaper(PwideChar(WS),0); 17 DT.ApplyChanges(AD_APPLY_ALL); 18 end;