|
大家都知道,我们经常使用的下载工具软件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); } }
共2页: 上一页 1 [2] 下一页
|