您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > BCB > 正文
用C++ Builder实现桌布自动更新
[文章信息]
作者:ZQGet
时间:2004-05-27
出处:论坛
责任编辑:方舟
[文章导读]
在C++ Builder中要实现桌布的自动更换功能,我认为主要两个关键点,其一既然要“自动”那就免不了要用到定时器
advertisement
热点推荐
· 天极网软件频道改版调查
· 25软件精选 Excel分页汇总
· 提升Win XP性能的20个特殊技巧
· 图解JBuilderX安装与实践
· Fireworks国画:葡萄小鸡图
[正文]

1 2  下一页

  在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函数设置桌布即可搞定.

1 2  下一页

·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载


发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • C++Builder注册表编程实例详解
  • 用C++ Builder开发多层数据库应用程序
  • C++ Builder中消息处理过程及应用
  • 用C++ Builder创建数字签名
  • 计算机短信DIY
  • 在C++ Builder中用Ole控制Excel表
  • 利用C++ Builder 设计实现文件切割机
  • 用C++Builder实现Windows 2000的Messenger
  • 在 C++ Builder中利用串行通信控件编程
  • C++Builder中集合的处理
  • C++ Builder文件任意分割传输技术
  • 盘符混乱咋办 拨乱反正有巧招
  • MotherBoard Monitor入门篇
  • MotherBoard Monitor进阶篇
  • 如何买到一部称心的品牌电脑
  • 关注!国内首款GeForce 6200显卡曝光
  • 《魔兽世界》角色扮演游戏壁纸
  • 天极缉拿假IE4.0为首的仿冒鼠
  • 《魔兽世界》Q版人物头像集
  • Advertisement

    天极无线
    待机彩图    >>更多
    多彩动画    >>更多
    美妙和弦    >>更多
    天使在唱歌
    壁虎漫步
    PrettyBoy
    LoveLoveLove
    我是你的小小狗
    单身情歌
    十面埋伏
    祝酒歌
    回心转意
    波斯猫
    太委屈
    S.H.E
    潘玮柏
    M2M
    蔡依林
    阿牛
    林志炫
    陈弈迅
    刀郎
    黑龙
    S.H.E
    陶晶莹
    情人玫瑰坊
    音乐风云
    新片速递
    神秘测试
    都市约会
    ·天极彩信天天精彩
    ·图铃梦工厂下载无限!
    ·找寻童真,卡通专题
    ·夏日激情交友社区!
    ·星座运程,预测人生

    CSEEK搜索