RSS
热门关键字:
当前位置 : 主页>编程开发>Python>列表

有关透明窗口的显示

来源:我要研发网 作者: 时间:1970-01-01 点击:



  第1种

  半透明窗口

  //----------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  long lRt=GetWindowLong(Handle,GWL_EXSTYLE);
  lRt=lRt|WS_EX_LAYERED;
  SetWindowLong(Handle,GWL_EXSTYLE,lRt);
  SetLayeredWindowAttributes(Handle,clBlue,200,LWA_ALPHA);
}
//-----------------------------------------------------------------

字串8

  第2种 字串9

  早就想写一篇我这方面心得, 一直特忙没有空, 不过这次点名找我, 就不再缩头缩脑了. 字串9

  其实我也还有很多问题没有解决, 在这里也向高手请教.

字串7

  此篇在V-Galaxy BBS发表, 如要转贴请和作者联系info@ministars.com

字串3

  1. Windows 2000 GDI 扩充集 字串4

  Windows 2000内部扩充了原有GDI指令集, 将直接提供高效图像处理指令如Alpha Blending等. 在Win2000里有一个专门窗口风格WS_EX_LAYERED提供透明窗口可能. Win2000还提供如 AnimateWindow(...)一类API, 直接支持窗口动画. 字串6

  有关连接 字串9

  http://www.microsoft.com/hwdev/video/GDInext.htm 字串9

  http://x.wonder.ca/stevex/nthack/ 字串7

  2. Win95/NT下实现方法

字串2

  既然Windows不提供现成, 就只自己做了. 原则上是这么过程:

字串4

  a. 获取桌面DC,生成一个兼容Bitmap,送一个WM_PAINT消息,把桌面取到Bitmap里.(就像一个Screen Capture) 字串1

  b. 把自己要开窗口画到另一幅Bitmap

字串3

  c. 用这两幅图片做Alpha Blending, 或者其他效果, 生成第三幅图. 字串2

  d. 最后再把图片BitBlt出来

字串6

  说起来并不难, 但技术上有几个问题.

字串7

  1. 如何把hidden窗口拷贝到图像里?

字串9

  原则上说, 是做不到. 但在自己程序里可以做一些手脚. 我在SafeClean Utilities2里用Wizard窗口,就需要在显示之前获取图像, 再做处理. 我用是WM_PRINT消息, 平时用很少, 但可以把Z-Order低窗口也拦截下来(hidden还不行). 比如我要从第1页(p1)翻到第二页(p2), 我就得在显示新窗口之前, 把p1移到最上面, 再显示p2(被p1遮挡着), 向p2送WM_PRINT消息拦截图片, 再做动画, 关闭p1. 字串7

  2. WM_PRINT问题

字串8

  WM_PRINT其实和WM_PAINT差不多, 但可以拦截被其他窗口遮住部分. 但不是所有窗口都支持WM_PRINT, 比如Static control, 只能自己在Bitmap里把他们画上. 字串6


字串6

  3. 如何把程序下面窗口储存在Bitmap里? 字串5

  要想实现真正象Win2000Transparent Window, 就必须得把自己程序下面窗口存在图片里. 能否实现我也不清楚.

字串8

  我用技术其实只适合做Splash Window和象金山词霸那样静态透明窗口.我用代码列在下面, 因为涉及到一些其他类, 分布在不同地方, 所以并不完整. 仅供参考. 关于使用 Alpha Blending, 可以参看www.codeguru.comBitmap部分, 有很代码. 这段时间实在很忙, 学校又要开始考试, 只是粗略介绍, 请大家谅解. 字串3

  int CFadeWindow::FadeAndSwitchWindow(CWnd* pWndFrom, CWnd* pWndTo)
{
  CWnd* pDesktop = CWnd::GetDesktopWindow();
  CWnd* pMain = AfxGetMainWnd();
  CClientDC dc(pMain);
  CRect rc;
  pWndFrom->GetWindowRect(rc);
  pMain->ScreenToClient(rc);
  CDC *pDCFrom;
  pDCFrom=pWndFrom->GetDC ();
  m_dib1.PasteDC ( pDCFrom, 0, 0, rc.Width(), rc.Height());
  m_dib3.PasteDC ( pDCFrom, 0, 0, rc.Width(), rc.Height());
  pWndFrom->ReleaseDC ( pDCFrom );
  CClientDC dcWndTo(pWndTo);
  CDC dcTo;
  dcTo.CreateCompatibleDC(&dcWndTo);
  CBitmap bmpTo;
  bmpTo.CreateCompatibleBitmap(&dcWndTo, rc.Width(), rc.Height());
  CBitmap * pOldbmp = dcTo.SelectObject(&bmpTo);
  SetWindowPos(pWndFrom->GetSafeHwnd(), HWND_TOP, 0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
  pWndTo->ShowWindow(SW_SHOW); 字串1
  pWndTo->SendMessage(WM_PRINT, (WPARAM) dcTo.GetSafeHdc(), (LPARAM)
  PRF_CLIENT|PRF_CHILDREN|PRF_OWNED);
  m_dib2.PasteDC ( &dcTo, 0, 0, rc.Width(), rc.Height());
  dcTo.SelectObject(pOldbmp);
  SetWindowPos(pWndTo->GetSafeHwnd(), HWND_TOP,0,0,0,0,
   SWP_NOSIZE|SWP_NOMOVE|SWP_NOREDRAW|SWP_SHOWWINDOW);
  SetWindowPos(pWndFrom->GetSafeHwnd(), NULL,0,0,0,0,
   SWP_NOSIZE|SWP_NOMOVE|SWP_NOREDRAW|SWP_NOZORDER|SWP_HIDEWINDOW);
  int index = 5;
  for(int i=0;i< //晕。少了东西了。
  {
   m_dib3.Paste(&m_dib1);
   m_dib3.Blend(&m_dib2, i*256/index);
   m_draw.DrawDib ( &m_dib3, dc.GetSafeHdc(), rc.left, rc.top,
    rc.Width(), rc.Height(), DDF_HALFTONE );
   Sleep(10);
  }
  m_draw.DrawDib ( &m_dib2, dc.GetSafeHdc(), rc.left, rc.top,
   rc.Width(), rc.Height(), DDF_HALFTONE );

字串6


  return 1;
}
字串7

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
相关文章