MFC屏幕标记之透明窗体

发表于:2013-06-21来源:Csdn作者:terrycanny点击数: 标签:软件测试
经过查阅资料,要实现屏幕标记,了解到两种办法:一种是通过对当前屏幕进行截图,然后对截图进行相关的标记来实现对当前屏幕的标记;而另外一种则是通过建立一个透明的窗体,将窗体进行置顶,然后对这个透明的窗体进行标记操作,从而实现对当前屏幕的标记。下

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

  首先是建立一个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