类似flashget的浮动窗口的实现

 

类似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);
hwnd是要改变的窗口,当dwFlags为LWA_ALPHA(0x2)时,crKey参数没用,bAlpha为透明度,取值在0~255之间。该函数要从User.dll中载入。
//更新窗口透明度的代码,其中iTransparent为透明度。
void CFloatWnd::OnUpdateTransparent(int iTransparent)
{
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
typedef BOOL (WINAPI *SLWA)(HWND,COLORREF,BYTE,DWORD);
SLWA pFun = NULL;
//取得SetLayeredWindowAttributes函数指针
pFun = (SLWA)GetProcAddress(hInst,"SetLayeredWindowAttributes");
if(pFun)
{
pFun(m_hWnd,0,iTransparent,2);
}
FreeLibrary(hInst);
}
}
  5、双击可以将主窗口激活并显示。由于WM_HITTEST消息的影响,我们双击鼠标的时候产生的是WM_NCLBUTTONDBLCLK消息,而不是WM_LBUTTONDBLCLK消息。
void CFloatWnd::OnNcLButtonDblClk(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
CWnd *pParent = GetParent();
ASSERT(pParent);
//显示窗口
if(!pParent->IsWindowVisible())
pParent->ShowWindow(SW_SHOW);
//置窗口到最前面
pParent->SetForegroundWindow();

CDialog::OnNcLButtonDblClk(nFlags, point);
}
  关于调节透明度的Slider使用,也写了一些代码,一并贴出来,供大家参考。
void CMainDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
// TODO: Add your message handler code here and/or call default
//得到Slider的位置
int iCurPos = m_Slider.GetPos();
//得到最大值、最小值,及页大小
int nMax = m_Slider.GetRangeMax();
int nMin = m_Slider.GetRangeMin();
int nPageSize = m_Slider.GetPageSize();

switch(nSBCode)
{
case SB_LINELEFT:
if(iCurPos > nMin)
iCurPos --;
break;
case SB_LINERIGHT:
if(iCurPos < nMax)
iCurPos ++;
break;
case SB_PAGELEFT:
if(iCurPos > nMin)
iCurPos = max(nMin,iCurPos - nPageSize);
break;
case SB_PAGERIGHT:
if(iCurPos < nMax)
iCurPos = min(nMax,iCurPos + nPageSize);
break;
case SB_THUMBTRACK:
iCurPos = nPos;
break;
case SB_THUMBPOSITION:
iCurPos = nPos;
break;
}
//设置Slider位置
m_Slider.SetPos(iCurPos);
//更新透明度
pFloatWnd->OnUpdateTransparent(iCurPos);

CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
  至于该窗口的右键菜单,窗口的显示与隐藏,程序的退出等简单代码我就不多介绍了。

三、该程序在Windows xp sp2和Visual C++6.0下编译调试成功。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值