dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>C/C++>C/C++技术资料>文章内容
利用Visual C++设置桌面墙纸
来源: BLOG 作者: lixiaosan的专栏
  前言:

  论坛上经常有网友发贴问怎么实现设置桌面墙纸,并且使用的是jpg文件。虽然在下知道可以用API函数SystemParametersInfo可以设置bmp文件为墙纸,也知道可以用IActiveDesktop来设置其他格式的文件作为墙纸,但是工作中一直没有使用到该功能,所以也就一直没实现。

  1.用SystemParametersInfo设置墙纸

  很简单,一句话搞定:

SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "C:\\xxx.bmp", SPIF_SENDWININICHANGE| SPIF_UPDATEINIFILE);

  but, 这玩意儿只能用bmp文件,不能用其他文件,MS也不把函数功能扩展一下,BS一下MS。

  再but,这玩意儿也不能设置墙纸的样式,比如平铺,拉伸什么的,虽然可通过修改注册表修改,但是据那位网友说,需要重启才能生效什么的,我没有试,因为这篇文章的主要目的是讨论用IActiveDesktop设置墙纸。

  2.用IActiveDesktop设置墙纸

  习惯上用任何不太熟悉的函数或接口前,查msdn。

  通过msdn,了解到:

  IActiveDesktop是个windows shell interface
  Header shlobj.h
  Minimum operating systems Windows 2000, Windows NT 4.0 with Internet Explorer 4.0, Windows 98, Windows 95 with Internet Explorer 4.0

  同时,在msdn还有一篇文章

  Using the Active Desktop Object

  其实,看了这篇文章你就应该学会如何使用Active Desktop Object了。

  (1)使用IActiveDesktop需要包含的一些头文件,以及进行初始化

  在stdafx.h中

#include <afxwin.h>
#include <wininet.h> //添加这个。注意顺序,顺序乱了也编译不过
#include <afxext.h>
...

  用了com的东西,要进行初始化,不用说了吧。

  在CXXXApp::Initinstance中添加AfxOleInit();

  使用IActiveDesktop的cpp中

#include <shlobj.h>

  (2) 现在开始写实现函数了

  还是我的老的测试工程CTest6Dlg..呵呵

BOOL CTest6Dlg::SetWallPaper(CString strPath)
{
 HRESULT hr;
 IActiveDesktop* pIAD;

 hr = CoCreateInstance( CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,IID_IActiveDesktop, (void**)&pIAD);
 if ( !SUCCEEDED(hr) )
  return FALSE;

 // 设置墙纸前先打开活动桌面开关
 COMPONENTSOPT co = {0};
 co.dwSize = sizeof(COMPONENTSOPT);
 co.fEnableComponents = TRUE;
 co.fActiveDesktop = TRUE;
 hr = pIAD->SetDesktopItemOptions(&co, 0);
 if ( !SUCCEEDED(hr) )
  return FALSE;

 //做以下宽字符的转换是因为SetWallpaper的参数是用的LPCWSTR
 WCHAR wszPath[MAX_PATH];
 LPTSTR lpStr = strPath.GetBuffer(strPath.GetLength());
 MultiByteToWideChar(CP_ACP, 0, lpStr, -1, wszPath, MAX_PATH);
 strPath.ReleaseBuffer();

 // 设置墙纸
 hr = pIAD->SetWallpaper(wszPath, 0);
 if ( !SUCCEEDED(hr) )
  return FALSE;

 // 设置墙纸风格
 WALLPAPEROPT wp = {0};
 wp.dwSize = sizeof(WALLPAPEROPT);
 wp.dwStyle |= WPSTYLE_CENTER;
 hr = pIAD->SetWallpaperOptions(&wp, 0);
 if ( !SUCCEEDED(hr) )
  return FALSE;

 // 应用改变
 hr = pIAD->ApplyChanges(AD_APPLY_ALL);
 if ( !SUCCEEDED(hr) )
  return FALSE;

 // 最后释放接口,不要忘了
 pIAD->Release();
}

  很简单吧。我的测试只做了一个jpg,其他的图片格式没有试,有兴趣的朋友可以帮试试。。。

  测试平台: winxp+vc6+sp6

上一篇:在VC中调用DirectShow全屏播放视频   下一篇:ultraEdit的java编辑环境配置
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·C语言数组排序小结
·Python 与 C++ 程序的简单实例对
·c++ 数组与指针
·C++中的内存管理(new、delete、
·如何用C语言开发DSP嵌入式系统
·如何用C语言开发DSP嵌入式系统
·Linux下C语言编程
·学习arm的话先看哪本书?
·C++初学者应该关心的优秀图书一
·利用C语言小程序来解决大问题
·用C语言写PHP扩展的步骤
·用C语言扩展PHP功能
  相关文章
·在VC中调用DirectShow全屏播放视
·VC下通过直方图变换对图像进行有
·在VC中实现画任意方向椭圆
·Visual C++实现WinXP关机特效
·VC++ 6.0中使用复选框和单选钮
·VC中预处理指令与宏定义的妙用之
·用Visual C++干干净净地清除进程
·VC中预处理指令与宏定义的妙用之
·Visual C++中实现双缓冲的基本原
·用Visual C++编写完整的屏幕保护
·VC++ 6.0中实现三叉切分窗口与多
·基于VC++中ATL创建ActiveX控件的
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763