newasp home
用户管理  |  用户注册
首 页 ┆ 文章中心 ┆ 下载中心 ┆ 社区论坛 ┆ 客户留言
  • 站点首页
  • 电脑网络技术
  • 图形图象技术
  • 网络应用
  • 多媒体技术
  • 电脑入门初步
  • 网络推广技术
  • 数据库设计
  • Linux技术
  • 网络动态
用户名: 密码:
当前位置:PC我爱社区 → 文章中心 → 数据库设计 → 文章内容

用C++ Builder实现桌布自动更新

减小字体 增大字体 作者:网络  来源:转载  发布时间:2008-2-23 14:20:33

COOCO视频会议实现沟通创造价值!    影视制作、广告摄影、3D制作、企业形象策划
文红论文网提供各类论文发表和翻译 像素科技--全力推出主机租用特惠行动!

在C++ Builder中要实现桌布的自动更换功能,我认为主要两个关键点,其一既然要“自动”那就免不了要用到定时器,我们可以用Timer这个组件来完成,这个还好解决,第二个问题可能比较麻烦了,我们如何来设置桌布,好像BCB中并没有提供什么组件,那我们也就只好自力更生了,虽说本人只是一只菜鸟,但这个问题还是难不了我,它主要是用到了SystemParametersInfo 这个Windows API函数,它的声明如下:
BOOL SystemParametersInfo(

 UINT uiAction, // system parameter to query or set

 UINT uiParam, // depends on action to be taken
 PVOID pvParam, // depends on action to be taken
 UINT fWinIni // user profile update flag
);
 

  它是一个非常重量级的函数,主要用来设置或获得系统范围上的相关参数(如:我正在介绍的“如何设置桌布”,还有如:系统字体,屏幕分辨率等),其实光从字面上也能大概知道它的作用。如果只是简单的调用SystemParametersInfo函数的话,问题就变得简单多了,但你要总不能只使用默认的桌布样式,所以在设置桌布之前还应先设置好桌布的样式,比如:桌布的显示位置,是否填满桌面等,然后再调用SystemParametersInfo函数,这个函数会根据注册表里的桌布样式设置情况来设置实际的桌布样式。

    与桌布样式有关的注册表设定:(位于HKEY_CURRENT_USER\Control Panel\Desktop键)


键名 含义
WallPaper 桌布的文件名,但只限于BMP格式的位图
WallPaperStyle 设置桌布样式
 若为0,桌布将以原始尺寸显示在桌面中央
 若为1,桌布将填满桌面
 若为2,将桌布放大的画面大小,图像有可能失真
WallPaperOriginX 如果WallPaperStyle为0,则这表示图像左上角X轴坐标
WallPaperOriginY 如果WallPaperStyle为0,则这表示图像左上角Y轴坐标

  注意:

  其实,上表还漏了TileWallpaper键,这个设定值的优先级最高,即当TileWallpaper这个值为1时,不管其它参数为何值,都会将桌布填满桌面,为了简化程序,一般将其设置为0,然后在根据WallPaperStyle来设置桌布样式,这是比较明智的做法。

  在了解了与桌布相关的注册表的设置情况后,那我们就进入具体的桌布设置吧!

#include <Registry.hpp> //先在注册表里添好桌布样式,在设置桌布 TRegistry *Registry = new TRegistry;
try
{
 Registry->OpenKey(“\\Control Panel\\Desktop”,false);
 Registry->WriteString('TileWallpaper','0');
 //设置桌布样式  Registry->WriteString('WallpaperStyle',wallStyle);
}
__finally
{
 delete Registry;
} } //设置桌布 SystemParametersInfo(SPI_SETDESKWALLPAPER, 0,FileName.c_str(),SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE);
 

  在此,我们已经解决了最为关键的问题,剩下的关于设置定时器那就简单了,只需用一个定时器组件即可完成.

  代码如下:

void __fastcall TForm1::Timer1Timer(TObject *Sender) { if (ListBox1->Items->Count<=0) { return ; } if (index>=ListBox1->Items->Count) { index=0; } //如果是JPG格式就将其转换为BMP格式,将其存到临时文件夹中 if(UpperCase(ListBox1->Items->Strings[index]).Pos('.JPG')||
UpperCase(ListBox1->Items->Strings[index]).Pos('.JPEG')) { AnsiString fileName=ExtractFileName(ListBox1->Items->Strings[index]); int len=fileName.LastDelimiter('.'); fileName=fileName.SubString(0,len-1)+'.bmp'; unsigned int *size=new unsigned int(256); char * buffer=new char[256]; GetTempPath(*size,buffer); fileName=AnsiString(buffer)+fileName; JPEGToBMP(ListBox1->Items->Strings[index],fileName); //设置桌布 SystemParametersInfo(SPI_SETDESKWALLPAPER,0,ListBox1->Items->Strings[index].c_str(),
 SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE); } else { //设置桌布 SystemParametersInfo(SPI_SETDESKWALLPAPER,0,ListBox1->Items->Strings[index].c_str(),
 SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE); } //重建系统缓存 RebuildIconCache(); index++; }
 

  就这样,我们就完成了桌布自动更换的功能,是不是很简单,不过由于它受限于BMP位图格式,这一点总是使得桌布的爱好者十分苦恼.我们能不能让它支持其它格式的图形文件呢?当然可以,原理是这样的,在设置桌布之前,现将其它格式的文件转换为位图,在用SystemParametersInfo函数设置桌布即可搞定.
JPEG格式转换为位图:
#include <jpeg.hpp> bool __fastcall TForm1::JPEGToBMP(AnsiString jpegFile,AnsiString bmpFile)
{
 //TODO: Add your source code here  TJPEGImage *jpeg = new TJPEGImage();
 jpeg->LoadFromFile(jpegFile);
 Graphics::TBitmap *bitmap = new Graphics::TBitmap();
 try {
  bitmap->Assign(jpeg);
  bitmap->SaveToFile(bmpFile);
 }
__finally {
 delete jpeg;
 delete bitmap;
}
return true;
}

  遗憾的是BCB不直接支持如PNG,GIF等格式与位图的转换,希望在BCB6.0以后的版本中会得到支持.如果要进行PNG,GIF格式的转换,我们可以去寻求控件,这是最简单的办法,还有一种就是自己编写图形格式转换的程序,这个比较困难.首先要知道各种图形格式的标准,然后编写格式转换的算法,这是最重要的,最后进行编码.还有一点我也想说一下,如果你足够细心的话,可能已经发现了我在实现Timer1Timer(TObject *Sender)这个函数的时候用到了一个RebuildIconCache()函数,注释说是重建系统缓存,其实是这样的当你改变了桌布的时候,可能系统来不及重新绘制桌布,这时你需要手动地按下F5来进行刷新,但我们的程序总不能去叫用户刷新吧,所以我增加了一个RebuildIconCache()函数来完成此功能,它是这样实现的。

void __fastcall TForm1::RebuildIconCache()
{
 //TODO: Add your source code here  int IconW;
 IconW= GetSystemMetrics(SM_CXICON);
 TRegIniFile *Reg = new TRegIniFile('Control Panel\\Desktop');
 try
 {
  Reg->WriteString('WindowMetrics', 'Shell Icon Size', IntToStr(IconW));
  SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
 }
 __finally
 {
  delete Reg;
 }
}
 

  这样只要你改变了桌布设置,再广播WM_SETTINGCHANGE窗口消息,系统就会进行桌布的重新绘制。

  提示:如果你想自己体会一下这个程序的功能,你不必通过键盘的输入来达到目的,http://www.zccfamily.com/zqget/ 提供了这个程序的所有源代码,你可以去下载来看一下实际的效果。
 

[] [返回上一页] [打 印]
  • ·上一篇文章:C++Builder中集合的处理
  • ·下一篇文章:利用C++ Builder为计算机增加启动日志

文章评论评论内容只代表网友观点,与本站立场无关!

用户名: ! 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容: !

         (注“!”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码

频道栏目导航

  • 电脑网络技术
  • 图形图象技术
  • 网络应用
  • 多媒体技术
  • 电脑入门初步
  • 网络推广技术
  • 数据库设计
  • Linux技术
  • 网络动态
  • 更多分类

本类热门阅览

  • · 如何建立SQL Server 2005数据库邮件...
  • · C# 怎样实现远程连接SQL Server200...
  • · SQL 2005 XML最佳实施策略用法
  • · SQL Server2005高可用性方面的不足...
  • · 在SQL Server 2005中解决死锁问题
  • · Sql server 2005密码安全追踪与存储...
  • · SQL Server2005数据库连接中常见问...
  • · VS 2008和老的VS 2005附件包的兼容...
  • · 专家预言:PHP将比Java更受开发人员...
  • · Windows操作系统下JSP程序开发环境...
  • · Windows下如何用vc直接编译连接DDK...
  • · 黑客编程:ASP木马代码

相关文章

关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 - 管理登陆

PC我爱社区 站长:子昀 点击这里和我联系
沪ICP备06047794号