Windows 2000/XP中对窗口进行透明化

liuay71866

liuay71866

2016-01-29 11:55

Windows 2000/XP中对窗口进行透明化,Windows 2000/XP中对窗口进行透明化

Windows 2000/XP中对窗口进行透明化
作者:abhinaba 翻译:南京中萃食品有限公司 肖进

下载本文示例工程

来源:http://www.codeproject.com/dialog/WinTrans1.asp

前言

很多文章示范了使用Windows 2000/XP的层次特性来实现窗口的透明化。本文可以通过该特性使任意窗口透明化,即使你没有该程序的源代码。

使用 "WinTrans" 程序你可以选择任意正在运行的程序,用鼠标左键拖拽左上角框内的棒并将它压在该程序的标题栏上,然后放开,则该程序就可以变成透明。你可以调整滑动条的位置来控制透明度。"WinTrans" 有一个非常象 SPY 的界面,还可以示范Win32 APIs的如下用法:用鼠标指针定位窗口,获取例如类名、标题等窗口信息。

用法

在Windows 2000/XP中,User32.dll增加了一个新函数SetLayeredWindowAttributes。要使用该函数,我们必须在生成窗口或使用SetWindowLong函数中设置窗口风格WS_EX_LAYERED (0x00080000)。该风格一旦被设置,我们就可以调用该函数来透明化窗口。该函数所需参数如下:

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/) HWND hWnd: 窗口句柄 COLORREF col: 透明化颜色 BYTE bAlpha: =0:整个窗口透明, =255 完全不透明 DWORD dwFlags: =1:仅颜色 col 透明, =2 :窗口按照bAlpha变量进行透明处理。

代码

首先定义对话框的成员变量(WinTransDlg.h)。

bool m_bTracking;   // 当鼠标被捕捉时设置为TRUEHWND m_hCurrWnd;    // 鼠标所在窗口的句柄HCURSOR m_hCursor;  // 棒型光标句柄
同时定义一个指向SetLayeredWindowAttributes函数的指针。该函数在User32.dll中定义。
// 全局变量typedef BOOL (WINAPI *lpfn) (HWND hWnd, COLORREF cr,               BYTE bAlpha, DWORD dwFlags);lpfn g_pSetLayeredWindowAttributes;
在OnInitDialog事件中获取SetLayeredWindowAttributes函数的指针并且保存在全局变量g_pSetLayeredWindowAttributes中。
BOOL CWinTransDlg::OnInitDialog(){    ....    //  获取函数 SetLayeredWindowAttributes 在User32.dll中的指针    HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL"));    g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32,               "SetLayeredWindowAttributes");    if (g_pSetLayeredWindowAttributes == NULL)        AfxMessageBox (            "Layering is not supported in this version of Windows",             MB_ICONEXCLAMATION);     // 装入棒形光标    HINSTANCE hInstResource = AfxFindResourceHandle(         MAKEINTRESOURCE(IDC_WAND), RT_GROUP_CURSOR);    m_hCursor = ::LoadCursor( hInstResource, MAKEINTRESOURCE(IDC_WAND) );    ...}
然后定义事件 WM_LBUTTONDOWN, WM_LBUTTONUP 和 WM_MOUSEMOVE 的触发函数. M_LBUTTONDOWN 事件代码如下:
void CWinTransDlg::OnLButtonDown(UINT nFlags, CPoint point){    ...    SetCapture();      //鼠标捕获设置到指定的窗口。在鼠标按钮按下的时候,这个窗口会为//当前应用程序或整个系统接收所有鼠标输入    m_hCurrWnd = NULL; //现在还没有窗口透明    m_bTracking = true;     // 设置track标志    ::SetCursor(m_hCursor); // 将光标改为棒形    }
WM_MOUSEMOVE事件处理函数:
void CWinTransDlg::OnMouseMove(UINT nFlags, CPoint point){    ...    if (m_bTracking)    {        ...        //  获取鼠标位置        ClientToScreen(&point);        ...        // 获取鼠标下面所在的窗口句柄        m_hCurrWnd = ::WindowFromPoint(point);        ...        // 显示该窗口的类、标题等信息…        ...    }    ...}

一旦用鼠标左键在窗口内点击并且不释放,鼠标的指针将变为棒形,并且该窗口的信息将显示在WinTrans窗口上。 当鼠标左键被释放后,事件WM_LBUTTONUP处理函数就被调用。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/)
void CWinTransDlg::OnLButtonUp(UINT nFlags, CPoint point){    ...    //释放鼠标捕获    ReleaseCapture();    m_bTracking = false;     //如果鼠标下面的窗口不是本程序WinTrans,我们就要设置层次样式并且通过设置滑动条来实现透明化。        if (g_pSetLayeredWindowAttributes && m_hCurrWnd != m_hWnd)    {        ::SetWindowLong(m_hCurrWnd, GWL_EXSTYLE,                        GetWindowLong(m_hCurrWnd,                         GWL_EXSTYLE) ^ WS_EX_LAYERED);        g_pSetLayeredWindowAttribute      
展开更多 50%)
分享

猜你喜欢

Windows 2000/XP中对窗口进行透明化

C语言教程 C语言函数
Windows 2000/XP中对窗口进行透明化

Windows 8窗口透明化设置教程

电脑入门
Windows 8窗口透明化设置教程

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Windows 8窗口透明化如何设置

windows系统
Windows 8窗口透明化如何设置

Win8窗口透明化怎么设置?

windows系统
Win8窗口透明化怎么设置?

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Win8系统窗口透明化设置方法

电脑入门
Win8系统窗口透明化设置方法

企鹅头像透明化怎么设置

电脑网络
企鹅头像透明化怎么设置

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

PSV《初音未来 歌姬计划F2》港中版完全白金心得

PSV《初音未来 歌姬计划F2》港中版完全白金心得

三维实体速成最简单入门法[第二集]

三维实体速成最简单入门法[第二集]
下拉加载更多内容 ↓