如何让窗口半透明,总在最前,但不接收输入?

[复制链接]
查看11 | 回复2 | 2009-10-11 10:00:05 | 显示全部楼层 |阅读模式
看看这个可不可以,是VCSDI下改造了现成的about帮助对话框。BOOLCAboutDlg::OnInitDialog(){CDialog::OnInitDialog();//TODO:在此添加额外的初始化ModifyStyleEx(0,WS_EX_LAYERED);//自己加的SetLayeredWindowAttributes(0,150,LWA_ALPHA);//自己加的SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);//自己加的EnableWindow(FALSE);//自己加的returnTRUE;//returnTRUEunlessyousetthefocustoacontrol//异常:OCX属性页应返回FALSE}=======================================恩,BlueWanderer说的是,没有常规方法。输入事件分两种:一种是硬件输入事件,一种是虚拟输入事件,我们一般处理的是虚拟输入事件,很少涉及硬件输入事件。而这两种事件都会影响我们的窗口行为。你是不是想实现迅雷窗口的效果?这个是需要自己加工的,不是调用3、5个函数能解决的。我给的是个模型而已。另外,你提到说下面的窗口可以响应鼠标单击事件,这个想法有点不靠谱了。


回复

使用道具 举报

千问 | 2009-10-11 10:00:05 | 显示全部楼层
你说的第一个好办BOOL CMainFrame::SetWndTransparence(int nTrans){ m_nTrans = nTrans; int nt = m_nTrans*255/100; if(nt 255) nt = 255; DWORD Style = GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE)^ 0x80000; SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, Style); SetLayeredWindowAttributes(0,nt, 2); return false;}//上面的这个事一个SDI程序CMainFrame类里的一个设置窗口透明度的函数,参数nTrans即为透明度,值的范围是0——100至于第二个,本应该上面窗口接受的消息,非要下面的窗口接收,那你只能试试自己发送了,你可以试试这个方法:透明窗口接收到消息之后,用ClientToScreen(hWnd, lpPoint);将鼠标点击的坐标从窗口坐标转换成屏幕坐标,然后用::EnumWindowsProc列举出所有显示的窗口,并判断是否鼠标的点击在该窗口之内,是,则向该窗口发送鼠标消息。你可以看看这个例子,里面有设置窗口透明度和列举窗口的方法:http://hi.baidu.com/hanjiangying/blog/item/b6d27aa684566d9dd0435801.html不过对于窗口重叠的情况,很容易出问题说实话,你这第二个要求太难实现了
回复

使用道具 举报

千问 | 2009-10-11 10:00:05 | 显示全部楼层
窗口半透明,要在XP及以上才方便点,那几个API函数记不得了,但是倒处都可以查到,实在查不到就HI我吧要达到第二个要求,那就让窗口的属性为Disable和TopWnd吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行