MFC屏幕标记之透明窗体(一)

来源:互联网 发布:网络机顶盒怎么看中央5 编辑:程序博客网 时间:2024/05/01 21:38

经过查阅资料,要实现屏幕标记,了解到两种办法:一种是通过对当前屏幕进行截图,然后对截图进行相关的标记来实现对当前屏幕的标记;而另外一种则是通过建立一个透明的窗体,将窗体进行置顶,然后对这个透明的窗体进行标记操作,从而实现对当前屏幕的标记。下面要讲的就是第二种方法的实现:

首先是建立一个MFC对话框程序,然后要将这个窗口透明,实现方法如下:

//点击按钮实现窗口透明函数void CScreenMarkerDlg::OnButtonTransparent() {HINSTANCE hInst = GetModuleHandle("User32.dll");if (hInst){//获取模块里的函数BOOL (WINAPI *SetLayeredWindowAttributes)(HWND,COLORREF,BYTE,DWORD)=(BOOL (WINAPI*) (HWND,COLORREF,BYTE,DWORD))GetProcAddress(hInst,"SetLayeredWindowAttributes");//函数指针正确获取if(SetLayeredWindowAttributes){//让窗口具透明的特性::SetWindowLong(m_hWnd,GWL_EXSTYLE, GetWindowLong(m_hWnd,GWL_EXSTYLE)|WS_EX_LAYERED);//设置窗口透明。第4参数为1时,第二个参数是被透明的颜色SetLayeredWindowAttributes(m_hWnd,GetSysColor(COLOR_3DFACE),0,0x1); }FreeLibrary(hInst); //释放调模块句柄}}

1.获得SetLayeredWindowAttributes()函数

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


2.赋予窗口透明特性

要使使窗体拥有透明效果,首先要有WS_EX_LAYERED(旧的sdk没有定义WS_EX_LAYERED,开头加#define WS_EX_LAYERED 0x00080000即可)扩展属性,方法是先声明GetWindowLongSetWindowLong


3.透明窗口函数使用

SetLayeredWindowAttributes(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags)

hwnd:透明窗口的句柄

crKey:颜色值,可用RGB来表示

bAlpha:透明度,取值为0到255

dwFlags:透明方式,取值又三种情况(LWA_ALPHA = 0x2,LWA_COLORKEY=0x1):

当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;

当取值为LWA_COLORKEY时,窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。

当取两个值的组合:LWA_ALPHA | LWA_COLORKEY,颜色值为crKey的地方将变为全透明,而其它地方根bAlpha参数的数值确定透明度。


4.使用举例:

SetLayeredWindowAttributes(m_hWnd, 0, 200, 0x2)即创建的窗体透明度为200;

SetLayeredWindowAttributes(m_hWnd, GetSysColor(COLOR_3DFACE), 0, 0x1)即建立窗口上为系统颜色的地方为全透明;

SetLayeredWindowAttributes(m_hWnd, RGB(255,0,0), 80, 0x1 | 0x2)即颜色为RGB(255,0,0)的地方全透明,其他地方的透明度为80。

原创粉丝点击