重金悬赏!!如何实现鼠标移上窗口变清晰,鼠标移开窗口变透明,要求有渐变效果!!

zhenwang 2005-04-18 10:33:41
现在有一个对话框窗口MyWindow,要求当鼠标移动到该窗口上时窗口变清晰,当鼠标移动离开窗口时窗口变半透明状,注意,这个变半透明状的过程是渐变过程,不能直接设置成透明或者不透明,请问各位大侠如何实现??希望有实际的代码供参考!!只要有实际可行的参考代码,分不够另开贴再给!!
...全文
301 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
梧桐168 2005-04-30
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include "AlphaBlend.h"

CAlphaBlend::CAlphaBlend(const HWND hWnd, const int nOpactiy, const BOOL bTransparent)
: m_hWnd(hWnd), m_nOpacity(nOpactiy), m_bTransparent(bTransparent)
{
// make sure they have set it up properly
ASSERT(m_nOpacity >= 0 && m_nOpacity <= 255);
ASSERT(m_hWnd && ::IsWindow(m_hWnd));

if (m_bTransparent)
{
SetTransparent();
SetOpacity(nOpactiy);
}
}

void CAlphaBlend::SetOpacity(const int nOpacity)
{
// make sure they have set it up properly
ASSERT(m_nOpacity >= 0 && m_nOpacity <= 255);
ASSERT(m_hWnd && ::IsWindow(m_hWnd));

if (nOpacity >= 0 && nOpacity <= 255)
{
m_nOpacity = nOpacity;
if (m_bTransparent)
SetLayeredWindowAttributes(m_hWnd, 0, m_nOpacity, LWA_ALPHA);
}
}

void CAlphaBlend::SetTransparent(BOOL bTransparent)
{
// make sure they have set it up properly
ASSERT(m_nOpacity >= 0 && m_nOpacity <= 255);
ASSERT(m_hWnd && ::IsWindow(m_hWnd));

if (bTransparent)
{
// make it transparent
long l = GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED;
SetWindowLong(m_hWnd, GWL_EXSTYLE, l);
m_bTransparent = TRUE;
}
else
{
// make it no transparent
long l = GetWindowLong(m_hWnd, GWL_EXSTYLE) ^ WS_EX_LAYERED;
SetWindowLong(m_hWnd, GWL_EXSTYLE, l);
m_bTransparent = FALSE;
}
}

void CAlphaBlend::FadeIn()
{
// make sure they have set it up properly
ASSERT(m_nOpacity >= 0 && m_nOpacity <= 255);
ASSERT(m_hWnd && ::IsWindow(m_hWnd));

for (int i = 0; i <= 100; i++)
{
SetOpacity(i*255/100);
UpdateWindow(m_hWnd);
}
SetTransparent(FALSE);
UpdateWindow(m_hWnd);
}

void CAlphaBlend::FadeOut()
{
ASSERT(m_hWnd && ::IsWindow(m_hWnd));

for (int i = 100; i >= 0; i--)
{
UpdateWindow(m_hWnd);
SetOpacity(i*255/100);
}
}
梧桐168 2005-04-30
  • 打赏
  • 举报
回复
送你一个类

#pragma once

class CAlphaBlend
{
public:
CAlphaBlend(const HWND hWnd, const int nOpacity, const BOOL bTransparent=TRUE);
virtual ~CAlphaBlend(void){}

void SetOpacity(const int nOpacity);
void SetTransparent(BOOL bTransparent=TRUE);
const BOOL IsTransparent(void) { return m_bTransparent; }
const int GetOpacity(){ return m_nOpacity; }
void FadeIn();
void FadeOut();

protected:
BOOL m_bTransparent;
int m_nOpacity;
HWND m_hWnd;
};
jiejie2004 2005-04-22
  • 打赏
  • 举报
回复
听说有高分,俺来看看,
顶以下:-)
wuliangge2001 2005-04-22
  • 打赏
  • 举报
回复
用不着10000分,给1000分,我10分钟给你做出来 :-)
不过,过程大家都说的很明白了,自己试试吧,如果不这样的话,怎么提高?
愿你迈出这一步。
pomelowu 2005-04-22
  • 打赏
  • 举报
回复
补充一下 WM_MOUSELEAVE 消息
pomelowu 2005-04-22
  • 打赏
  • 举报
回复
思路是截获鼠标离开/移动到窗口事件(可以不用定时器,用消息),激活计时器,逐步设置窗口透明。

既然单个功能都知道了,那就自己做啊。自己做了,效果不对,再把代码贴出来大家讨论吧。
Trashy 2005-04-21
  • 打赏
  • 举报
回复
关注学习~
psbeond 2005-04-21
  • 打赏
  • 举报
回复
cxf1976() 说的太对了。
1.怎么做透明窗口
2.怎么使用定时器
3.怎么捕获鼠标事件
第2.3条超简单,就不要讨论了,关于第一条,有很多方法,一般情况下,WM_ERASEBACKGRAOUND直接返回TRUE,然后在OnPaint中绘制你的东西,与背景进行alaph混合。
zhenwang 2005-04-21
  • 打赏
  • 举报
回复
继续顶!
surstar 2005-04-20
  • 打赏
  • 举报
回复
SetLayeredWindowAttributes
xqk 2005-04-20
  • 打赏
  • 举报
回复
up
zhenwang 2005-04-20
  • 打赏
  • 举报
回复
没有会吗?没有遇到过这种情况?
zhenwang 2005-04-20
  • 打赏
  • 举报
回复
继续顶,就不信没有人遇到过!
rainivy 2005-04-20
  • 打赏
  • 举报
回复
Mark
学习
zhenwang 2005-04-19
  • 打赏
  • 举报
回复
希望大家能贴出来一些样例代码,上面说的单个功能实现我都知道,如何做透明窗体,如何使用计时器,如何捕捉鼠标消息,但是就是把这些单个功能组合一起来后就不能实现所需的效果,总是乱闪烁,希望大家能综合谈谈,多谢了!
oyljerry 2005-04-19
  • 打赏
  • 举报
回复
捕获鼠标位置,设置窗口透明度SetLayeredWindowAttributes();
afu1983 2005-04-19
  • 打赏
  • 举报
回复
用定时器
jishufenxi 2005-04-19
  • 打赏
  • 举报
回复
1、使用定时器事件检测鼠标是否离开,当然进入就不必了
2、取得窗口对应的屏幕区域的像素,对像素按照你设置的渐变规律分别计算R、G、B、值
3、最好不要用于大面积的窗口,效率低
warmage 2005-04-19
  • 打赏
  • 举报
回复
渐变 不就可以用定时来控制吗?
菜牛 2005-04-19
  • 打赏
  • 举报
回复
给10000分就有人来做,否则不要说“重金悬赏”。本来,不给分我也做的。
加载更多回复(1)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧