在vc中設定案頭牆紙
作者:lixiaosan
日期:09/21/2006
前言:
今天,csdn上一網友發貼問怎麼實現設定案頭牆紙,並且使用的是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
http://windowssdk.msdn.microsoft.com/en-us/library/ms649721.aspx#accessing_the_active_desktop
其實,看了這篇文章你就應該學會如何使用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();
return TRUE;
}
很簡單吧。我的測試只做了一個jpg,其他的圖片格式沒有試,有興趣的朋友可以幫試試。。。
測試平台: winxp+vc6+sp6