国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
VC對話框隱藏運(yùn)行 (四)懸浮窗

VC對話框隱藏運(yùn)行 (四)懸浮窗

發(fā)表時(shí)間:2010-7-10  閱讀數(shù):544  網(wǎng)友評(píng)論:0
Windows的菜單一層一層的,有時(shí)操作起來不方便,就想自己寫個(gè)工具直接調(diào)用。對迅雷的懸浮窗垂涎好久了,哈,正好趁這個(gè)機(jī)會(huì)搞一搞。在懸浮窗上用快捷菜單不是很方便嗎?
在VC知識(shí)庫中找到了一篇介紹懸浮窗實(shí)現(xiàn)的例子,很好,拿來就用,又做了些增強(qiáng)功能,呵呵,特此Show一下。知識(shí)庫文章地址:點(diǎn)這。
要實(shí)現(xiàn)懸浮窗,就得弄明白懸浮窗是什么,有什么行為和作用。懸浮窗其實(shí)是一個(gè)無邊框可以拖動(dòng)的窗口,再有就是它上面鋪滿一張圖,當(dāng)然也可以是空白,可以設(shè)置透明度,雙擊可實(shí)現(xiàn)主窗口的顯示和隱藏,右鍵有菜單,可以實(shí)現(xiàn)快捷操作;還有一點(diǎn)就是它在任務(wù)欄中不顯示。好了,明白了原理就開始找資料動(dòng)手了。
我的習(xí)慣是先攻克所有的技術(shù)點(diǎn),然后再動(dòng)手寫程序。在資源文件中插入一個(gè)Dialog,給它添加一個(gè)類CFloatWnd。首先是無邊框,這個(gè)容易,將窗口的Border設(shè)為None就可以了。無邊框窗口的拖動(dòng)也很容易,重寫OnNcHitTest就可以了。原理就是當(dāng)用戶點(diǎn)擊了窗口客戶區(qū)后,把它當(dāng)成標(biāo)題欄來傳給操作系統(tǒng),這樣就實(shí)現(xiàn)了拖動(dòng)。代碼如下:
  1. LRESULT CFloatWnd::OnNcHitTest(CPoint point)   
  2. {   
  3.     // TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值   
  4.     LRESULT nHitTest = CDialog::OnNcHitTest(point);   
  5.   
  6.     if (nHitTest == HTCLIENT && GetAsyncKeyState(MK_LBUTTON) < 0 )  //如果是客戶區(qū)//如果鼠標(biāo)左鍵按下,GetAsyncKeyState函數(shù)的返回值小于0   
  7.         nHitTest = HTCAPTION;                       //則把它當(dāng)成標(biāo)題欄   
  8.   
  9.     return nHitTest;   
  10.     //return CDialog::OnNcHitTest(point);   
  11. }   
不要認(rèn)為GetAsyncKeyState沒有用,這樣做的目的是點(diǎn)擊左鍵拖動(dòng),而點(diǎn)擊右鍵則不能拖動(dòng)且要彈出右鍵菜單。
好了,現(xiàn)在窗口能拖動(dòng)了,但是是空白窗口,不好看。那好,加個(gè)位圖,首先添加資源文件Logo.bmp,資源ID設(shè)為IDB_BITMAP_Logo,然后在窗口上放個(gè)Picture Control,Type指定為Bitmap,image設(shè)為IDB_BITMAP_Logo就可以了。至于圖片位置和窗口大小就寫程序控制好了。給圖片添加變量m_Logo。在OnInitDialog中添加如下代碼:
  1. // 讓窗體和Logo相符   
  2. //mfc里的Attach和Detach函數(shù)主要用于對mfc類對象跟sdk句柄   
  3. //之間關(guān)聯(lián)的處理,attach將mfc類對象與句柄關(guān)聯(lián)起來   
  4. //對該對象的操作都會(huì)施加在相應(yīng)的句柄身上   
  5. //detach則消除這種關(guān)聯(lián)關(guān)系   
  6. CBitmap m_Bitmap;   
  7. HBITMAP hBitmap = m_Logo.GetBitmap();   
  8. ASSERT(hBitmap);   
  9. m_Bitmap.Attach(hBitmap);//關(guān)聯(lián)   
  10. BITMAP bmp;   
  11. m_Bitmap.GetBitmap(&bmp);   
  12.   
  13. int nX = bmp.bmWidth;   
  14. int nY = bmp.bmHeight;   
  15. MoveWindow(0,0,nX,nY);              //窗口移到左上角并設(shè)置寬高   
  16. m_Logo.MoveWindow(0,0,nX,nY);       //圖片移到窗口的左上角   
  17. CenterWindow();                                         //窗口居中   
  18. ::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);//窗口置頂   
  19. m_Bitmap.Detach();      //釋放關(guān)聯(lián)   
做完這些以后在主窗口CMainAppDlg中添加成員變量CFloatWnd m_FloatWnd; 然后在CMainAppDlg的OnInitDialog中添加如下代碼,來顯示我們的懸浮窗。
  1. //顯示   
  2. m_FloatWnd.Create(CFloatWnd::IDD,this);//注意父窗口為this   
  3. m_FloatWnd.ShowWindow(SW_SHOW);   
還有,別忘記在MainAppDlg.h 中添加這個(gè):#include "FloatWnd.h"
好了,現(xiàn)在運(yùn)行。感覺上挺不錯(cuò)了,但是雙擊不能顯示主窗口,也沒有右鍵菜單。嗯,繼續(xù)做吧。添加成員函數(shù)afx_msg void OnShowHide(); //顯示隱藏具體代碼如下:
  1. //顯示的時(shí)候隱藏,隱藏的時(shí)候顯示   
  2. void CFloatWnd::OnShowHide()    
  3. {   
  4.     CWnd *pParent = GetParent();    //得到父窗口,即主窗口   
  5.     ASSERT(pParent);   
  6.     if(pParent->IsWindowVisible())      //如果顯示   
  7.         pParent->ShowWindow(SW_HIDE);       //則隱藏   
  8.     else                                    //否則顯示   
  9.         pParent->ShowWindow(SW_SHOW);   
  10. }   
  11. //在窗口雙擊事件中調(diào)用   
  12. void CFloatWnd::OnNcLButtonDblClk(UINT nHitTest, CPoint point)   
  13. {   
  14.     // TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值   
  15.     OnShowHide();   
  16.     CDialog::OnNcLButtonDblClk(nHitTest, point);   
  17. }   
運(yùn)行一下,雙擊能夠顯示和隱藏,效果還是不錯(cuò)的。下一步添加右鍵菜單。在資源文件里添加個(gè)新菜單,ID設(shè)為IDR_MENU_FloatWnd,然后添加兩個(gè)子菜單項(xiàng):1、Caption為顯示/隱藏主窗口(&S) ,ID為ID_ShowHide;2、Caption為退出(&E) ,ID為ID_Exit。給CFloatWnd添加菜單成員變量:CMenu m_Right; //右鍵菜單在OnInitDialog中加載:
  1. //加載右鍵菜單   
  2. m_Right.LoadMenu(IDR_MENU_FloatWnd);   
  3. //加載好了就要在OnRButtonUp中顯示了:   
  4. //鼠標(biāo)右鍵顯示彈出菜單   
  5. void CFloatWnd::OnRButtonUp(UINT nFlags, CPoint point)   
  6. {   
  7.     // TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值   
  8.     CMenu *pSub = m_Right.GetSubMenu(0);            //取第一個(gè)子菜單   
  9.     ClientToScreen(&point);                         //轉(zhuǎn)換坐標(biāo)為窗口坐標(biāo)   
  10.     pSub->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this,NULL);//顯示   
  11.     CDialog::OnRButtonUp(nFlags, point);   
  12. }   
  13. //顯示是顯示了,可沒有功能,嗯,那就做消息映射寫代碼嘍:   
  14. ON_COMMAND(ID_Exit, OnExit)             //右鍵退出   
  15. ON_COMMAND(ID_ShowHide, OnShowHide)     //右鍵顯示/隱藏   
  16. //OnShowHide的代碼有了,下面是OnExit:   
  17. //退出   
  18. void CFloatWnd::OnExit()    
  19. {   
  20.     CWnd *pParent = GetParent();   
  21.     this->DestroyWindow();          //銷毀自己   
  22.     pParent->DestroyWindow();       //銷毀主窗口   
  23. }   
運(yùn)行一下,效果很棒。但還沒有透明度設(shè)置。
在主窗口上放一個(gè)Slider Control,給它添加變量m_Slider,最大值設(shè)為255,最小值設(shè)為0。然后重寫窗口的OnHScroll事件,在事件中根據(jù)滑動(dòng)條的值來設(shè)置窗口的透明度。關(guān)于窗口的透明度,在VC2005中可以直接用SetLayeredWindowAttributes來設(shè)置,在VC6中要用LoadLibrary("User32.DLL")來實(shí)現(xiàn)。好了,完整代碼如下:
  1. //在CMainAppDlg::OnInitDialog()中   
  2. //設(shè)定滑動(dòng)條最大值和最小值   
  3. m_Slider.SetRangeMax(255,TRUE);   
  4. m_Slider.SetRangeMin(1,TRUE);   
  5. //鼠標(biāo)單擊時(shí)一次滾動(dòng)個(gè)單位   
  6. m_Slider.SetPageSize(10);   
  7. //設(shè)置透明度函數(shù)   
  8. void CFloatWnd::OnUpdateTransparent(int iTransparent)   
  9. {   
  10.     SetLayeredWindowAttributes(0,iTransparent,2);   
  11.     //在VC6中請用如下代碼   
  12.     //HINSTANCE hInst = LoadLibrary("User32.DLL");   
  13.     //if(hInst)   
  14.     //{   
  15.     //  typedef BOOL (WINAPI *SLWA)(HWND,COLORREF,BYTE,DWORD);   
  16.     //  SLWA pFun = NULL;   
  17.     //  //取得SetLayeredWindowAttributes函數(shù)指針   
  18.     //  pFun = (SLWA)GetProcAddress(hInst,"SetLayeredWindowAttributes");   
  19.     //  if(pFun)   
  20.     //  {   
  21.     //      pFun(m_hWnd,0,iTransparent,2);   
  22.     //  }   
  23.     //  FreeLibrary(hInst);    
  24.     //}   
  25. }   
  26. //在CFloatWnd::OnInitDialog()中給窗體加入擴(kuò)展屬性,否則無法設(shè)置透明度   
  27.     //加入WS_EX_LAYERED擴(kuò)展屬性   
  28. SetWindowLong(m_hWnd,GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);   
  29.     //默認(rèn)不透明   
  30.     OnUpdateTransparent(255);   
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
VC 位圖按鈕CBitmapButton的使用
轉(zhuǎn):VC屬性表屬性頁之間的數(shù)據(jù)傳遞
DialogBar的用法技巧
WIN32界面開發(fā)之四:CPaintManagerUI類構(gòu)建
MFC判斷滾動(dòng)條到底部
(轉(zhuǎn))走出MFC子類化的迷宮:子類化,SUBCLASSWINDOW ,MFC消息機(jī)制
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服