问答1 问答5 问答50 问答500 问答1000
网友互助专业问答平台

2000系统桌面图标字体透明问题!

提问网友 发布时间:2022-04-22 03:47
声明:本网页内容为用户发布,旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:1656858193@qq.com
5个回答
热心网友 回答时间:2023-06-23 06:32
摘要:本文主要介绍了Windows 2000下新增的API函数SetLayeredWindowAttributes()以及通过该函数实现窗体透明特效的一般方法,并结合代码给出了具体的编程实现过程。

关键字:窗体特效;分层窗口

引言

Windows 2000操作系统无论是在品质上还是在用户界面上都有了很大的改善与提高,用户对系统的操作变的更加简单、方便,感觉也更加舒适。如果用户在使用时留意一下,不难发现其中界面上的一些新特性。例如,Windows 2000提供了对带阴影阿尔法混合光标的支持、提供对菜单、提示框淡入淡出效果的支持以及在外壳拖拽具有阿尔法混合效果图片等透明特效。所有这些特效看似不同但实际都是通过对Windows 2000新提供的一个分层窗口API函数的调用而实现的。 既然是Windows 2000系统提供的API函数,那么也就意味着在自己的应用程序中同样能够实现该函数做做支持的各种特效。

在程序设计时,有时一些微小的改善就足以增强用户界面的显示效果。例如,使用一个具有阿尔法混合效果的光标显然要比一只普通光标的感觉要好的多,尤其是在大屏幕显示器或多显示器系统下这种光标也更容易找到。更进一步,显示器的屏幕大小是有限的,如果想同时查看多个窗口的内容显然是不太方便的,尽管采取大屏幕显示器或多显示器系统能在一定程度上缓解但远不如将这些应用程序窗体设置为透明或半透明来的彻底和方便。下图显示的两个应用程序虽然存在覆盖,但位于前台的程序窗体显然没有影响后台Word文档内容的显示。鉴于分层窗口函数在程序设计中的实用作用,本文将对其作具体的介绍以充分挖掘其潜力并将其应用到程序设计中去。

分层窗口

在介绍分层窗口函数之前,首先要介绍一下WS_EX_LAYERED扩展窗口风格。该窗口风格也是Windows 2000新增加的,如果使用了该属性,窗体将具备复合形状、动画、阿尔法混合等方面的视觉特效。

窗口通过被其他窗口的裁剪而在屏幕上以矩形出现。为了实现一个圆形窗体,仅仅简单绘制一个圆形窗体是不够的,这样的话系统还会把窗体按原矩形进行点击检测,而且位于该窗体下的窗口仍将被该窗体矩形所裁剪。或许可以考虑在园形窗体显示出来前取得位于该窗体矩形下可视区域的快照,并在稍后窗体显示完毕后将其绘制到当前窗体。但由于其他窗口能够绘制该窗体覆盖下的区域,而前台程序无法获知这种绘制将于何时发生而不会及时获取下面可视区域的新的快照,因此这种解决方法并不能在多进程、多任务环境下很正常的工作。对于这种情况,在Windows 95/98和Windows NT 4.0下的正确做法是通过SetWindowRgn()API函数指出需要的窗体形状,但是这种处理在频繁更改窗体形状或是在屏幕上拖拽时仍有缺陷存在:前台窗体将要求位于其下的窗体重绘整个区域,这将生过多的消息和计算量。而且使用SetWindowRgn()只能实现窗体的全透明而无法实现半透明效果。或许这也正是分层窗口被提出的原因。

分层窗口真正实现了两个截然不同的概念:分层和重定向。为了能够去除任何一个层,WS_EX_LAYERED标志位必须要设置,这可以在窗体创建时设置也可以在创建后通过以GWL_EXSTYLE标志调用SetWindowLong()来进行设置。接下来,可以通过UpdateLayeredWindows()函数来更新分层窗口。在具体使用时,需要在位图中绘制出可视区域,并将其与关键色、阿尔法混合参数等一起提供给UpdateLayeredWindows()函数。需要注意的是,在使用UpdateLayeredWindows()函数时,应用程序并不需要响应WM_PAINT或其他绘制消息。

除此之外,还可以使用传统的Win32绘制机制来实现,这需要调用另一个API函数SetLayeredWindowAttributes()来完成对关键色或阿尔法混合参数值的设定。一旦该函数被调用,系统将开始为分层窗口重定向所有的绘制并自动应用指定的特效。
窗体半透明特效的实现

前面已经对分层窗口做了较为详细的介绍。这里将对SetLayeredWindowAttributes()函数及其使用方法做具体的介绍,并在此基础上实现窗体半透明特效。首先给出SetLayeredWindowAttributes()的函数原形:

BOOL SetLayeredWindowAttributes(
HWND hwnd, // handle to the layered window
COLORREF crKey, // specifies the color key
BYTE bAlpha, // value for the blend function
DWORD dwFlags // action
);

其中dwFlags有LWA_ALPHA(值为2)和LWA_COLORKEY(值为1)两种设置,如果LWA_ALPHA被设置的话,通过bAlpha参数指定窗体的透明度;如果LWA_COLORKEY标志被设置的话,则指定关键色为crKey,该颜色所覆盖的区域将从窗体去除,去除后的区域将不再进行点击检测,其他颜色则正常显示。如果阿尔法混合值设置为0,其窗口区域同样不进行点击检测。

前面说过,SetLayeredWindowAttributes()函数是Windows 2000新增的一个API函数,它所在的模块为USER32.DLL。在用GetMoleHandle()装载USER32.DLL模块并调用GetProcAddress()得到函数 SetLayeredWindowAttributes()在User32.dll中的指针后就可以通过SetLayeredWindowAttributes()函数将窗体设置为半透明了:

// 全局变量
typedef BOOL (WINAPI *lpfn) (HWND hWnd, COLORREF cr, BYTE bAlpha, DWORD dwFlags);
lpfn g_pSetLayeredWindowAttributes;
……
// 获取函数 SetLayeredWindowAttributes 在User32.dll中的指针
HMODULE hUser32 = GetMoleHandle(_T("USER32.DLL"));
g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32, "SetLayeredWindowAttributes");
if (g_pSetLayeredWindowAttributes == NULL)
::PostQuitMessage(0);

这段代码通常在程序初始化时运行以及时将USER32.DLL模块装载到内存并获取得到SetLayeredWindowAttributes()函数指针。在程序退出前需要通过FreeLibrary()函数释放先前加载的模块:

// 卸载模块
if (m_hUser32 != NULL)
FreeLibrary(m_hUser32);

在将窗体设置为半透明时,首先要获取得到该窗体的窗口句柄,以指明要操作的是哪一个窗口。如果是对本应用程序中的某个窗口进行设置,可以通过传递窗口句柄或是用GetSafeHwnd()来动态获取。如果要对本程序外的某个程序窗口进行设置,一般的做法是通过对FindWindow()函数的调用来获取指定窗口标题的窗口句柄。在得到窗口句柄之后并不能直接调用SetLayeredWindowAttributes()进行设置,需要在GetWindowLong()获取得到当前窗口风格设置后在其基础之上添加WS_EX_LAYERED扩展风格,并通过SetWindowLong()函数将其设置:

// 半透明
HWND hWnd = GetSafeHwnd();
LONG lWindowLong = GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED;
::SetWindowLong(hWnd, GWL_EXSTYLE, lWindowLong);
g_pSetLayeredWindowAttributes(hWnd, 0, (BYTE)m_sldAlpha.GetPos(), 2);
::RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);

为了能够使用该函数,还必须在上述语句之前添加预定义语句:

#define WS_EX_LAYERED 0x00080000

异形窗体特效的实现

使用SetLayeredWindowAttributes()创建异形窗体是非常简单的,具体过程与半透明窗体的实现极为类似,所不同的只是将标志设置为LWA_COLORKEY并指定需要透明显示的关键色:

// 指定关键色
HWND hWnd = GetSafeHwnd();
LONG lWindowLong = GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED;
::SetWindowLong(hWnd, GWL_EXSTYLE, lWindowLong);
g_pSetLayeredWindowAttributes(hWnd, RGB(255, 255, 255), 0, 1);
::RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);

小结

本文通过对Windows 2000新增API函数SetLayeredWindowAttributes()的使用非常简单的实现了窗体的半透明设置和异形窗体的创建。除了SetLayeredWindowAttributes()函数,Windows 2000还提供了其他许多类似的特效函数比如用于窗体动态滑动显示的AnimateWindow()。由于这些函数是系统提供的API函数,因此不会受编程语言的制约,也就是说,并不只在VC++下可以实现上述特效。在C++ Builder、Delphi等其他开发环境下也是可以用类似的方法来实现的。本文所述程序代码在Windows 2000 Professional下由Microsoft Visual C++ 6.0编译通过。
热心网友 回答时间:2023-06-23 06:32
优化大师的图标字体透明功能应该可以的啊,我以前试过的,楼主试试重启一下机子呢。
热心网友 回答时间:2023-06-23 06:33
不行看他的我晕我告诉你个方法但不能解决你的半透明的问题
是可以给你的字体改该
你可以使用右键单击出来“属性”可以看到“外观”在他下面有个“项目”对他下面的任何一个修改都会让你高兴的
热心网友 回答时间:2023-06-23 06:33
大哥们你们有没搞错呀
优化大师 优化完了行 但是它不能刷新一刷它又game over了
就得改注册表呀
热心网友 回答时间:2023-06-23 06:35
看了好多个帖子 结论是2000不能透明。。。。。

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

桌面颜色和字体都变的很淡,像透明的感觉,怎么恢... 如何恢复桌面图标下的文字透明颜色状态 怎样还原系统桌面的透明字体 每天上班为什么心累? 为什么心累会比身体上的累还累? 心烦,心累怎么办? 心累,感觉对什么都提不起兴趣 上班感觉心累了怎么办? 身体上的累永远不上心累,这句话对吗?求大神帮助 心累怎么安慰 上班的时候总是需要小心翼翼,心很累怎么办? 心好累,突然不想上班了这么办? 心好累,不想上班 什么感觉叫心累? 为什么上班时会感到心累 这两天觉得心好累,心脏给不上劲,都不想说话,感... 每天上班就觉得心好累,一点也不想上班 觉得上班很心累怎么办 心好累不想上班怎么办 心累不想上班,怎么办 window10电脑字体和WPS字体变成透明的怎么恢复? 桌面的快捷方式字体都弄成了蓝色了,怎么把它变回... 电脑桌面的图标下的字原是透明现在成了有蓝底该如... 电脑桌面图标下文字原是透明现成有蓝底如何恢复? 怎样能将桌面图标文字变回透明? 桌面变成这样了怎么弄回透明的字体 windows7怎么字体变透明了,怎么变回来 桌面图标字体框的颜色怎么恢复透明 电脑桌面图标下面的文字变透明 电脑上的字怎么变透明 电脑桌面图标字体透明怎么设置? 电脑桌面图标下边的文字变成半透明得了,怎么办 电脑的桌面字体怎样弄成透明的啊?帮帮忙! 淘宝如果买家不好评,默认多少天自动好评啊? 淘宝店客人没评价的多久会默认好评 淘宝网上多少天不评价系统会自动好评? macbook做表怎么华斜线 苹果电脑怎么恢复出厂设置?边成斜杠了 苹果mac的除号在哪里 苹果电脑台式一体机屏幕出现圈中间一斜杠怎么回事
Top