类似flashget的浮动窗口的实现

豆豆网   技术应用频道   2008年06月11日  【字号: 收藏本文

本文详细介绍类似flashget的浮动窗口的实现

  本文示例源代码或素材下载

  一、简介:

  象flashget、迅雷、BT等都有浮动窗口,能详细地显示下载的详细信息,该类型的窗口有一下几个特点:1、窗口无标题栏,窗口的大小跟位图一样大。2、前端显示。3、在客户区内按下鼠标左键可以随意拖动窗口的位置。4、可以改变窗口的透明度。5、双击可以将主窗口激活,并显示。下面就该类型窗口的各个功能实现予以说明。

  二、代码的详细说明:

  1、窗口无标题栏,窗口的大小跟位图一样大。建立一个对话框资源,设置为POPUP类型,并取消Title Bar属性。在上面插入一个图片控件,设置为导入的位图。  //得到位图
  CBitmap m_Bitmap;
  HBITMAP hBitmap = m_Logo.GetBitmap();
  ASSERT(hBitmap);
  //得到位图的信息
  m_Bitmap.Attach(hBitmap);
  BITMAP bmp;
  m_Bitmap.GetBitmap(&bmp);
  //得到位图的大小
  int nX = bmp.bmWidth;
  int nY = bmp.bmHeight;
  //根据位图的大小移动窗口
  MoveWindow(0,0,nX,nY);
  m_Logo.MoveWindow(0,0,nX,nY);
  CenterWindow();
  2、前端显示。  //通过SetWindowsPos函数将窗口前端显示。
  ::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);  
  3、在客户区内按下鼠标左键可以随意拖动窗口的位置。响应WM_HITTEST函数,当鼠标左键按下并在客户区内,返回HTCAPTION,欺骗Windows,达到跟在标题栏拖动窗口一样的效果。UINT CFloatWnd::OnNcHitTest(CPoint pt)
{
  UINT nHitTest = CDialog::OnNcHitTest(pt);
  if (nHitTest == HTCLIENT && ::GetAsyncKeyState(MK_LBUTTON) < 0) // 如果鼠标左键按下,GetAsyncKeyState函数的返回值小于0
    nHitTest = HTCAPTION;
  return nHitTest;
}
  4、改变窗口的透明度。将窗口样式设置为WS_EX_LAYERED,并调用SetLayeredWindowAttributes函数来改变窗口的透明度。WS_EX_LAYERED可能没定义,我们可以直接取值0x80000。  //加入WS_EX_LAYERED扩展属性
  SetWindowLong(m_hWnd,GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
BOOL SetLayeredWindowAttributes(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags);

来源:vckbase    作者:苍竹先生    责编:豆豆技术应用

正在加载评论...