类似flashget的浮动窗口的实现
生活随笔
收集整理的這篇文章主要介紹了
类似flashget的浮动窗口的实现
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?作者:蒼竹先生下載源代碼一、簡(jiǎn)介:象flashget、迅雷、BT等都有浮動(dòng)窗口,能詳細(xì)地顯示下載的詳細(xì)信息,該類(lèi)型的窗口有一下幾個(gè)特點(diǎn):1、窗口無(wú)標(biāo)題欄,窗口的大小跟位圖一樣大。2、前端顯示。3、在客戶(hù)區(qū)內(nèi)按下鼠標(biāo)左鍵可以隨意拖動(dòng)窗口的位置。4、可以改變窗口的透明度。5、雙擊可以將主窗口激活,并顯示。下面就該類(lèi)型窗口的各個(gè)功能實(shí)現(xiàn)予以說(shuō)明。二、代碼的詳細(xì)說(shuō)明:1、窗口無(wú)標(biāo)題欄,窗口的大小跟位圖一樣大。建立一個(gè)對(duì)話(huà)框資源,設(shè)置為POPUP類(lèi)型,并取消Title Bar屬性。在上面插入一個(gè)圖片控件,設(shè)置為導(dǎo)入的位圖。//得到位圖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;//根據(jù)位圖的大小移動(dòng)窗口MoveWindow(0,0,nX,nY);m_Logo.MoveWindow(0,0,nX,nY);CenterWindow();2、前端顯示。//通過(guò)SetWindowsPos函數(shù)將窗口前端顯示。::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE); 3、在客戶(hù)區(qū)內(nèi)按下鼠標(biāo)左鍵可以隨意拖動(dòng)窗口的位置。響應(yīng)WM_HITTEST函數(shù),當(dāng)鼠標(biāo)左鍵按下并在客戶(hù)區(qū)內(nèi),返回HTCAPTION,欺騙Windows,達(dá)到跟在標(biāo)題欄拖動(dòng)窗口一樣的效果。UINT CFloatWnd::OnNcHitTest(CPoint pt) {UINT nHitTest = CDialog::OnNcHitTest(pt);if (nHitTest == HTCLIENT && ::GetAsyncKeyState(MK_LBUTTON) < 0) // 如果鼠標(biāo)左鍵按下,GetAsyncKeyState函數(shù)的返回值小于0nHitTest = HTCAPTION;return nHitTest; }4、改變窗口的透明度。將窗口樣式設(shè)置為WS_EX_LAYERED,并調(diào)用SetLayeredWindowAttributes函數(shù)來(lái)改變窗口的透明度。WS_EX_LAYERED可能沒(méi)定義,我們可以直接取值0x80000。//加入WS_EX_LAYERED擴(kuò)展屬性SetWindowLong(m_hWnd,GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);BOOL SetLayeredWindowAttributes(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags); hwnd是要改變的窗口,當(dāng)dwFlags為L(zhǎng)WA_ALPHA(0x2)時(shí),crKey參數(shù)沒(méi)用,bAlpha為透明度,取值在0~255之間。該函數(shù)要從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函數(shù)指針 pFun = (SLWA)GetProcAddress(hInst,"SetLayeredWindowAttributes");if(pFun){pFun(m_hWnd,0,iTransparent,2);}FreeLibrary(hInst); } }5、雙擊可以將主窗口激活并顯示。由于WM_HITTEST消息的影響,我們雙擊鼠標(biāo)的時(shí)候產(chǎn)生的是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); }關(guān)于調(diào)節(jié)透明度的Slider使用,也寫(xiě)了一些代碼,一并貼出來(lái),供大家參考。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(); //得到最大值、最小值,及頁(yè)大小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; }//設(shè)置Slider位置m_Slider.SetPos(iCurPos);//更新透明度pFloatWnd->OnUpdateTransparent(iCurPos);CDialog::OnHScroll(nSBCode, nPos, pScrollBar); }至于該窗口的右鍵菜單,窗口的顯示與隱藏,程序的退出等簡(jiǎn)單代碼我就不多介紹了。三、該程序在Windows xp sp2和Visual C++6.0下編譯調(diào)試成功。
轉(zhuǎn)載于:https://www.cnblogs.com/65876951/articles/vc1.html
總結(jié)
以上是生活随笔為你收集整理的类似flashget的浮动窗口的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JS的对象及其属性和方法
- 下一篇: Office开发程序集版本及部署问题