选择显示字体大小

用c++ builder实现桌布自动更新

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


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons