字体和壁纸合并后再更改壁纸--《用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;
View Code
  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;
View Code

 

 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;
SetRegWallPaper通知windows改变壁纸

 

 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;
SetWallPaper用指定方式改变壁纸

 

posted @ 2015-04-27 16:24  海蓝7  阅读(200)  评论(0编辑  收藏  举报