C++ Builder完成桌布自動(dòng)更新
發(fā)表時(shí)間:2024-01-05 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在C++ Builder中要實(shí)現(xiàn)桌布的自動(dòng)更換功能,我認(rèn)為主要兩個(gè)關(guān)鍵點(diǎn),其一既然要“自動(dòng)”那就免不了要用到定時(shí)器,我們可以用Timer這個(gè)組件來完成,這個(gè)還好解決,第二個(gè)問題可能比較麻煩了,我們?nèi)绾蝸碓O(shè)置桌布,好像BCB中并沒有提供什么組件,那我們也就只好自力更生了,雖說本人只是一只菜鳥,但這個(gè)...
在C++ Builder中要實(shí)現(xiàn)桌布的自動(dòng)更換功能,我認(rèn)為主要兩個(gè)關(guān)鍵點(diǎn),其一既然要“自動(dòng)”那就免不了要用到定時(shí)器,我們可以用Timer這個(gè)組件來完成,這個(gè)還好解決,第二個(gè)問題可能比較麻煩了,我們?nèi)绾蝸碓O(shè)置桌布,好像BCB中并沒有提供什么組件,那我們也就只好自力更生了,雖說本人只是一只菜鳥,但這個(gè)問題還是難不了我,它主要是用到了SystemParametersInfo 這個(gè)Windows API函數(shù),它的聲明如下:
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 );
|
它是一個(gè)非常重量級(jí)的函數(shù),主要用來設(shè)置或獲得系統(tǒng)范圍上的相關(guān)參數(shù)(如:我正在介紹的“如何設(shè)置桌布”,還有如:系統(tǒng)字體,屏幕分辨率等),其實(shí)光從字面上也能大概知道它的作用。如果只是簡單的調(diào)用SystemParametersInfo函數(shù)的話,問題就變得簡單多了,但你要總不能只使用默認(rèn)的桌布樣式,所以在設(shè)置桌布之前還應(yīng)先設(shè)置好桌布的樣式,比如:桌布的顯示位置,是否填滿桌面等,然后再調(diào)用SystemParametersInfo函數(shù),這個(gè)函數(shù)會(huì)根據(jù)注冊(cè)表里的桌布樣式設(shè)置情況來設(shè)置實(shí)際的桌布樣式。
與桌布樣式有關(guān)的注冊(cè)表設(shè)定:(位于HKEY_CURRENT_USERControl PanelDesktop鍵)
鍵名 | 含義 |
WallPaper | 桌布的文件名,但只限于BMP格式的位圖 |
WallPaperStyle | 設(shè)置桌布樣式 若為0,桌布將以原始尺寸顯示在桌面中央 若為1,桌布將填滿桌面 若為2,將桌布放大的畫面大小,圖像有可能失真 |
WallPaperOriginX | 如果WallPaperStyle為0,則這表示圖像左上角X軸坐標(biāo) |
WallPaperOriginY | 如果WallPaperStyle為0,則這表示圖像左上角Y軸坐標(biāo) |
注意:
其實(shí),上表還漏了TileWallpaper鍵,這個(gè)設(shè)定值的優(yōu)先級(jí)最高,即當(dāng)TileWallpaper這個(gè)值為1時(shí),不管其它參數(shù)為何值,都會(huì)將桌布填滿桌面,為了簡化程序,一般將其設(shè)置為0,然后在根據(jù)WallPaperStyle來設(shè)置桌布樣式,這是比較明智的做法。
在了解了與桌布相關(guān)的注冊(cè)表的設(shè)置情況后,那我們就進(jìn)入具體的桌布設(shè)置吧!
#include 〈Registry.hpp〉
//先在注冊(cè)表里添好桌布樣式,在設(shè)置桌布
TRegistry *Registry = new TRegistry; try { Registry-〉OpenKey(“Control PanelDesktop”,false); Registry-〉WriteString("TileWallpaper","0"); //設(shè)置桌布樣式
Registry-〉WriteString("WallpaperStyle",wallStyle); } __finally { delete Registry; }
}
//設(shè)置桌布
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0,FileName.c_str(),SPIF_UPDATEINIFILE SPIF_SENDWININICHANGE);
|
在此,我們已經(jīng)解決了最為關(guān)鍵的問題,剩下的關(guān)于設(shè)置定時(shí)器那就簡單了,只需用一個(gè)定時(shí)器組件即可完成.
代碼如下:
void __fastcall TForm1::Timer1Timer(TObject *Sender) { if (ListBox1-〉Items-〉Count〈=0) { return ; }
if (index〉=ListBox1-〉Items-〉Count) { index=0; }
//如果是JPG格式就將其轉(zhuǎn)換為BMP格式,將其存到臨時(shí)文件夾中
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);
//設(shè)置桌布
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,ListBox1-〉Items-〉Strings[index].c_str(), SPIF_UPDATEINIFILE SPIF_SENDWININICHANGE);
}
else
{
//設(shè)置桌布
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,ListBox1-〉Items-〉Strings[index].c_str(), SPIF_UPDATEINIFILE SPIF_SENDWININICHANGE);
}
//重建系統(tǒng)緩存
RebuildIconCache();
index++;
}
|
就這樣,我們就完成了桌布自動(dòng)更換的功能,是不是很簡單,不過由于它受限于BMP位圖格式,這一點(diǎn)總是使得桌布的愛好者十分苦惱.我們能不能讓它支持其它格式的圖形文件呢?當(dāng)然可以,原理是這樣的,在設(shè)置桌布之前,現(xiàn)將其它格式的文件轉(zhuǎn)換為位圖,在用SystemParametersInfo函數(shù)設(shè)置桌布即可搞定.