经过查阅资料,要实现屏幕标记,了解到两种办法:一种是通过对当前屏幕进行截图,然后对截图进行相关的标记来实现对当前屏幕的标记;而另外一种则是通过建立一个透明的窗体,将窗体进行置顶,然后对这个透明的窗体进行标记操作,从而实现对当前屏幕的标记。下面要讲的就是第二种方法的实现:
首先是建立一个MFC对话框程序,然后要将这个窗口透明,实现方法如下:
[cpp] view plaincopyprint?
//点击按钮实现窗口透明函数
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); //释放调模块句柄
}
}
//点击按钮实现窗口透明函数
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即可)扩展属性,方法是先声明GetWindowLong和SetWindowLong
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)
原文转自:http://blog.csdn.net/terrycanny/article/details/8168307