日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC模拟360悬浮窗加速球窗口

發布時間:2023/12/10 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC模拟360悬浮窗加速球窗口 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1,目標


實現類似360懸浮窗口這樣的效果,當窗口在屏幕邊緣時,鼠標移開,就自動向邊緣隱藏,鼠標放上去,就又平滑顯示出來。


正常狀態:


邊緣自動隱藏:



2,原理


首先是實現圓角或橢圓這種不規則形狀的窗口,可以參考另一篇文章:

MFC實現不規則窗口

?然后需要給沒有標題欄的窗口增加拖拽移動的功能,這個就是自己手動發送一個消息,使windows認為鼠標在標題條上

對于窗口的移動顯示隱藏,使用了定時器。

其中有一些做判斷的函數,如判斷在窗口在屏幕某個邊緣,判斷鼠標是否在窗口內部等。


3,實現


①新建MFC對話框程序Test360.去掉默認控件和屬性中的邊框。參考上面所說的文章實現一個帶圓角及背景圖片的窗口。


由于這里還是截圖然后用PS簡單選擇了個范圍,所以還有毛邊,若是有美工原圖或PS仔細些,是沒問題的。


②給Dlg類CTest360Dlg添加一條消息響應OnLButtonDown,在其中傳送WM_NCLBUTTONDOWN消息,達到拖動效果。

void CTest360Dlg::OnLButtonDown(UINT nFlags, CPoint point) {CDialog::OnLButtonDown(nFlags, point);// 實現拖動窗口// 發送WM_NCLBUTTONDOWN消息// 使Windows認為鼠標在標題條上// 或SendMessage(WM_SYSCOMMAND,SC_MOVE | HTCAPTION,0); PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x, point.y)); }
③添加幾個判斷窗口是否在屏幕邊緣的函數:

//是否靠近屏幕左邊緣 BOOL CTest360Dlg::NearLeftBorder() {CRect rc;GetWindowRect(rc);//窗口左邊界在屏幕左邊界20像素內都算“靠近”if (rc.left < 20){return TRUE;}return FALSE; } //是否靠近屏幕上邊緣 BOOL CTest360Dlg::NearUpBorder() {CRect rc;GetWindowRect(rc);if(rc.top<20){return TRUE;}return FALSE; } //是否靠近右邊緣 BOOL CTest360Dlg::NearRightBorder() {CRect rc;GetWindowRect(rc);int nWidth = GetSystemMetrics(SM_CXSCREEN);if (rc.left>nWidth - rc.Width()){return TRUE;}return FALSE; }
④判斷鼠標是否在窗口內。

BOOL CTest360Dlg::MouseInWnd() {CRect rc;GetWindowRect(rc);POINT pt;GetCursorPos(&pt);if (PtInRect(&rc,pt)){return TRUE;}return FALSE; }⑤定義一個定時器, #define TIMER_MOVE 1在CTest360Dlg::OnInitDialog()中啟動:

BOOL CTest360Dlg::OnInitDialog() {CDialog::OnInitDialog();// 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動// 執行此操作SetIcon(m_hIcon, TRUE); // 設置大圖標SetIcon(m_hIcon, FALSE); // 設置小圖標//設置窗口形狀SetRegion(GetDC(),IDB_BITMAP_360RGN,RGB(0,0,0));//初始時居中CenterWindow();//設置定時器,處理懸浮窗的顯隱移動SetTimer(TIMER_MOVE,10,NULL);return TRUE; }
處理如下:

void CTest360Dlg::OnTimer(UINT_PTR nIDEvent) {if (nIDEvent == TIMER_MOVE){//鼠標按著的,就怎么都不移動if (GetKeyState(VK_LBUTTON)<0){return;}//靠近屏幕上邊緣if (NearUpBorder()){//根據鼠標動作進行窗口的移動(鼠標進入區域就向下平移顯示,鼠標離開就向上平移隱藏)MoveUp();return;}//靠近屏幕左邊緣if (NearLeftBorder()){//根據鼠標動作進行窗口的移動(鼠標進入區域就向右平移顯示,鼠標離開就向左平移隱藏)MoveLeft();return;}//靠近屏幕右邊緣if (NearRightBorder()){//根據鼠標動作進行窗口的移動(鼠標進入區域就向左平移顯示,鼠標離開就向右平移隱藏)MoveRight();return;}}CDialog::OnTimer(nIDEvent); }
其中GetKeyState先強行過濾掉鼠標按下,讓這種情況不移動。避免剛拖動窗口到屏幕邊緣時鼠標還沒松開就直接開始移動了。

3個Move函數,是真正按像素移動窗口的地方,包括來回(出屏幕和進屏幕)。原理是一樣的,看明白一個就OK了。

void CTest360Dlg::MoveUp() {CRect rc;GetWindowRect(rc);//鼠標進入則下移,顯示出來if(MouseInWnd()){int height = rc.Height();if (rc.top>=0){rc.top = 0;}else{rc.top++;}rc.bottom = rc.top + height;MoveWindow(rc);}//鼠標在別處,窗口就往上移出屏幕else{int height = rc.Height();//窗口向上移動一像素,如果快隱藏(露20)就不移了if (rc.top<= 20 - height){rc.top = 20 - height;ShowWindow(SW_HIDE);m_upDlg->m_Test360Dlg = this;m_upDlg->DoModal();}else{rc.top--;}rc.bottom = rc.top + height;MoveWindow(rc);} } void CTest360Dlg::MoveLeft() {CRect rc;GetWindowRect(rc);//鼠標進入則下移,顯示出來if(MouseInWnd()){int width = rc.Width();if (rc.left>=0){rc.left = 0;}else{rc.left++;}rc.right = rc.left + width;MoveWindow(rc);}//鼠標在別處,窗口就往上移出屏幕else{int width = rc.Width();//窗口向左移動一像素,如果快隱藏(留20像素)就不移了if (rc.left<= 20 - width){rc.left = 20 - width;}else{rc.left--;}rc.right = rc.left + width;MoveWindow(rc);} } void CTest360Dlg::MoveRight() {CRect rc;GetWindowRect(rc);int sysWidth = GetSystemMetrics(SM_CXSCREEN);//鼠標在窗口內則窗口左移,顯示出來if(MouseInWnd()){int width = rc.Width();if (rc.left<= sysWidth - width){rc.left = sysWidth - width;}else{rc.left--;}rc.right = rc.left + width;MoveWindow(rc);}//鼠標沒在窗口上,窗口就往右移出屏幕else{int width = rc.Width();//窗口向右移動一像素,如果快隱藏了(還留20像素)就不移了if (rc.left>= sysWidth - 20){rc.left = sysWidth - 20;}else{rc.left++;}rc.right = rc.left + width;MoveWindow(rc);}}對MoveUp做說明:

當Timer中判斷到窗口在屏幕上邊緣時,進入MoveUp,如果此時鼠標進入窗口內,窗口就往下方移動直到完全顯示;如果鼠標離開窗口,那么窗口會立即往上隱藏,直到留下一小截。 360官方軟件現在是換了個半圓形的窗口“趴”在屏幕邊上。這里主要是模擬觸發移動的效果。


4,效果

幾張截圖

左側:

上側:

右側:


5,源碼


MFC模擬360懸浮窗加速球Test360_VS2008工程.rar




總結

以上是生活随笔為你收集整理的MFC模拟360悬浮窗加速球窗口的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。