
-->Am 11:11 的相册 <-- -->Am 11:11 的网上硬盘<--
桌面图标背景透明化VC
还记得WIN98时代有一个软件很牛(当时觉得很神奇)..可以把桌面图标的背景色搞成透明色.我很喜欢那个功能.软件叫阿达XXX.比优化大师提供的透明功能感觉更高效.其实只是感觉.不过这里可不是讨论他们那个更高效的.这里要说的是他们内部实现的方法.
首先要了解桌面,用SPY工具查看可以看到是一个SysListView32 控件,通过查MSDN可以知道了有ListView_GetTextBkColor和ListView_SetTextBkColor函数的支持.意味着只要能找到相关的句柄我们就可以把背景色给弄成任何自己喜欢的颜色.到了XP以后,那个功能也已集成到系统内部了,所以像透明桌面这样的软件也只能在WIN98下工作了.
下面演示一下具体的操作吧.
编译环境 VC6.0
// 以下是查找窗口 SysListView32 的代码:
// 在窗口标题不能确定的情况下可将标题设为NULL
HWND MyFindWindow()
{
const int MyMaxParentWinCount = 3;
// 父窗口类名数组
char *A_szClassName[MyMaxParentWinCount] =
{
"Progman",
"SHELLDLL_DefView",
"SysListView32"
};
// 父窗口标题数组
char *A_szWinName[MyMaxParentWinCount] =
{
"Program Manager",
"",
"FolderView"
};
// 首先求得顶级父窗口
HWND hLastWin = ::FindWindow(A_szClassName[0], A_szWinName[0]);
// 逐次用FindWindowEx函数求出各级子窗口
for(int i=1; i<MyMaxParentWinCount; i++)
{
hLastWin = ::FindWindowEx(hLastWin, NULL,
A_szClassName[i], A_szWinName[i]);
}
return hLastWin;
}
void CDeskTopColorDlg::OnOK()
{
// TODO: Add extra validation here
HWND hLastWin = MyFindWindow();//查找目标
COLORREF Bc=ListView_GetTextBkColor(hLastWin); //获取目标颜色
if (Bc!=0xFFFFFFFF) //如果不是透明色的则将颜色设置为透明色.
ListView_SetTextBkColor(hLastWin,0xffffffff);
::InvalidateRect(hLastWin, NULL, TRUE);//重绘桌面.
//CDialog::OnOK();
}
不得不说一下MSDN 一个类似WINDOWS说明书的东西.看过以后你可以发现可以做许多东西.让我想起了一句话.书中自有XXX,书中自有XXX.了解一个未知的东西最好的办法就是看说明书.这样可以让你更快的了解一些功能.如果人也有说明书该多好呀..呵呵.




