亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

開發精彩實例:窗體自動隱藏

2019-11-17 05:04:24
字體:
來源:轉載
供稿:網友
  實現窗體自動隱藏方法有多種,可以使用定時器,不斷監視鼠標,當鼠標移動到窗體邊緣時,顯示窗體,當鼠標離開后隱藏窗體。也可以在鼠標收到WM_NCMOUSEMOVE或 WM_MOUSEMOVE(無邊框窗體)時激活窗體,然后在窗體消息WM_ACTIVE中設置顯示或隱藏,這種方法在窗體未失去焦點時不會隱藏。
我在原本的設計中便使用這種方法,只是在設計時發現非主窗體不太合適,激活窗體時會出現兩個鍵盤焦點,而且我所需要的焦點是虛假的,可能我的設計不當,那位朋友若能完美實現,不妨交流一下。
 
  本代碼的流程如下:
  
  1. 初始化窗體時設置窗體位置,并設置依靠狀態窗體狀態。
  2. 當接收到WM_MOUSEMOVE消息時,檢查窗體是否顯示,若否,顯示,并打開定時器。
  3. 在WM_MOVING中檢測窗體位置,并自動靠攏邊界。
  4. 在定時器中檢測鼠標,當鼠標離開窗體后,關閉定時器,隱藏窗體。

  當然,在隱藏窗體時首先判定位置,若??吭谶吘墸瑒t隱藏,否則,不隱藏。

  現在我們一步步看代碼。

int alignType; //全局變量,用于記錄窗體??繝顟B
enum
{
ALIGN_NONE, //不???br> ALIGN_TOP, //停靠上邊
ALIGN_LEFT, //??孔筮?br> ALIGN_RIGHT //停靠右邊
};
#define NEAR_SIZE 20 //定義自動??坑行Ь嚯x
#define NEAR_SIDE 2 //窗體隱藏后在屏幕上保留的像素,以使鼠標可以觸及
/*
下面代碼處理窗體消息WM_MOVING,PRect是由參數lParam傳來的指針
*/
void OnMoving(HWND hWnd, LPRECT pRect)
{
//未靠邊界由pRect測試
if (alignType == ALIGN_NONE)
{
if (pRect->top < NEAR_SIZE) //在上邊有效距離內,自動靠攏。
{
alignType = ALIGN_TOP;
pRect->bottom -= pRect->top;
pRect->top = 0;
}
if (pRect->left < NEAR_SIZE) //在左邊有效距離內
{
alignType = ALIGN_LEFT;
pRect->right -= pRect->left;
pRect->left = 0;
}
else if (pRect->right + NEAR_SIZE > ScreenX) //在右邊有效距離內,ScreenX為屏幕寬度,可由GetSystemMetrics(SM_CYSCREEN)得到。
{
alignType = ALIGN_RIGHT;
pRect->left += (ScreenX - pRect->right);
pRect->right = ScreenX;
}

}
else
{
//靠邊界由鼠標測試
更多文章 更多內容請看Wlan組網----家庭專題專題,或 POINT pt;
GetCursorPos(&pt);
if (alignType == ALIGN_TOP)
{
if (pt.y > NEAR_SIZE) //由于我們移動窗體時,鼠標在標題欄內,當鼠標位置超過有效距離后,我們可以考慮用戶要向下拖動鼠標。我們便解除上部停靠。
{
alignType = ALIGN_NONE;
pRect->bottom += NEAR_SIZE;
pRect->top = NEAR_SIZE;
}
else
{
pRect->bottom -= pRect->top;
pRect->top = 0;
if (pRect->left < NEAR_SIZE) //在上部??繒r,我們也考慮左右邊角。
{
pRect->right -= pRect->left;
pRect->left = 0;
}
else if (pRect->right + NEAR_SIZE > ScreenX)

{
pRect->left += (ScreenX - pRect->right);
pRect->right = ScreenX;
}
}

}
if (alignType == ALIGN_LEFT)
{
if (pt.x - pRect->right > 0) //鼠標可以在整個標題條往返移動,所以我們不能簡單用左邊界和鼠標的距離來解除停靠,這里我們在鼠標離開右邊界時解除停靠。
{
alignType = ALIGN_NONE;
pRect->right += NEAR_SIZE;
pRect->left = NEAR_SIZE;
}
else
{
pRect->right -= pRect->left;
pRect->left = 0;
if (pRect->top < NEAR_SIZE) //考慮左上角。
{
pRect->bottom -= pRect->top;
pRect->top = 0;
}
}
}
else if (alignType == ALIGN_RIGHT)
{
if (pt.x < pRect->left) //當鼠標離開左邊界時,解除停靠。
{
alignType = ALIGN_NONE;
pRect->left -= NEAR_SIZE;
pRect->right -= NEAR_SIZE;
}

更多文章 更多內容請看Wlan組網----家庭專題專題,或 else
{
pRect->left += (ScreenX - pRect->right);
pRect->right = ScreenX;
if (pRect->top < NEAR_SIZE) //考慮右上角。
{
pRect->bottom -= pRect->top;
pRect->top = 0;
}
}
}
}
}
  /*
  在窗體初始化是設定窗體狀態,假如可以??浚阃?吭谶吘?br>  我本想尋求其他方法來解決初始化,而不是為它專一尋求一個函數,可是,窗體初始化時不
  發送WM_MOVING消息,我不得不重復類似任務.
  */
void NearSide(HWND hWnd)
{
int change = 0;
RECT rect;
GetWindowRect(hWnd, &rect);
alignType = ALIGN_NONE;
if (rect.left < NEAR_SIZE)
{
alignType = ALIGN_LEFT;
if ((rect.left != 0) && rect.right != NEAR_SIDE)
{
rect.right -= rect.left;
rect.left = 0;
change = 1;
}
}
else if (rect.right > ScreenX - NEAR_SIZE)
{
alignType = ALIGN_RIGHT;
if (rect.right != ScreenX && rect.left != ScreenX - NEAR_SIDE)
{
rect.left += (ScreenX - rect.right);
rect.right = ScreenX;
change = 1;
}
}
//調整上
更多文章 更多內容請看Wlan組網----家庭專題專題,或 else if (rect.top < NEAR_SIZE)
{
alignType = ALIGN_TOP;
if (rect.top != 0 && rect.bottom != NEAR_SIDE)
{
rect.bottom -= rect.top;
rect.top = 0;
change = 1;
}
}
if (change)
{
MoveWindow(hWnd, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, TRUE);

}

}
/*
窗體的顯示隱藏由該函數完成,參數hide決定顯示還是隱藏.
*/
void HideSide(HWND hWnd, BOOL hide)
{
RECT rc;
int moves = 20; //動畫滾動窗體的步數,假如你覺得不夠平滑,可以增大該值.
int xStep, yStep;
int xEnd, yEnd;
int width;
int height;
register int i;
GetWindowRect(hWnd, &rc);
width = rc.right - rc.left;
height = rc.bottom - rc.top;

//下邊判定窗體該如何移動,由??糠绞經Q定
switch (alignType)
{
case ALIGN_TOP:
{
//向上移藏
xStep = 0;
xEnd = rc.left;
if (hide)
{
yStep = -rc.bottom / moves;
yEnd = -height + NEAR_SIDE;
}
else
{
yStep = -rc.top / moves;
yEnd = 0;
}
break;
}
case ALIGN_LEFT:
{
//向左移藏
更多文章 更多內容請看Wlan組網----家庭專題專題,或 yStep = 0;
yEnd = rc.top;
if (hide)
{
xStep = -rc.right / moves;
xEnd = -width + NEAR_SIDE;
}
else
{
xStep = -rc.left / moves;
xEnd = 0;
}
break;
}
case ALIGN_RIGHT:
{
//向右移藏
yStep = 0;
yEnd = rc.top;
if (hide)
{
xStep = (ScreenX - rc.left) / moves;
xEnd = ScreenX - NEAR_SIDE;
}
else
{
xStep = (ScreenX - rc.right) / moves;
xEnd = ScreenX - width;
}
break;
}
default:
return;
}
//動畫滾動窗體.
for (i = 0; i < moves; i++)
{
rc.left += xStep;
rc.top += yStep;
SetWindowPos(hWnd, NULL, rc.left, rc.top, 0, 0, SWP_NOSIZE SWP_NOSENDCHANGING);
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE RDW_UPDATENOW);
Sleep(5);
}
SetWindowPos(hWnd, NULL, xEnd, yEnd, 0, 0, SWP_NOSIZE);
if (!hide) //假如窗體已被顯示,設置定時器.監視鼠標.
{
SetTimer(hWnd, WM_TIMER, 500, NULL);
}
}
  //下面就是通過窗體回調函數將這些函數組織起來.
更多文章 更多內容請看Wlan組網----家庭專題專題,或   //這里僅列出使用的消息
case WM_TIMER: //定時器消息
{
POINT pt;
RECT rc;
GetCursorPos(&pt);
GetWindowRect(hWnd, &rc);
if (!PtInRect(&rc, pt)) //若鼠標不在窗體內,隱藏窗體.
{
KillTimer(hWnd, WM_TIMER);

HideSide(hWnd, TRUE);
}
break;
}
case WM_CREATE:
case WM_INITDIALOG: //初始化消息
{
SetWindowPos(...) //程序保存窗體上次靠位置,在這里恢復.
NearSide(hWnd);
break;
}
//這兩個消息是在窗體移動開始時和結束時產生的,我們在窗體開始移動時關閉定時器,移動結束后再打開,這樣避免窗體移動時隱藏,金山快譯的浮動條就有這種情況出現.
case WM_ENTERSIZEMOVE:
{
KillTimer(hWnd, WM_TIMER);
break;
}
case WM_EXITSIZEMOVE:
{
SetTimer(hWnd, WM_TIMER, 500, NULL);
break;
}
case WM_MOUSEMOVE: //受到窗體移動消息時,判定窗體是否顯示,
{
RECT rc;
GetWindowRect(hWnd, &rc);
if (rc.left < 0 rc.top < 0 rc.right > ScreenX) //未顯示
HideSide(hWnd, FALSE);
break;
}
case WM_MOVING: //處理窗體移動時消息,實現自動???br>{
OnMoving(hWnd, (LPRECT) lParam);
break;
}
case WM_MOVE:
{
//保存窗體位置
}
  這些代碼是從程序中摘錄出來的, 筆者已盡量檢查它們的完整性, 但人總有犯錯的時候, 假如發現這些代碼有問題, 或有更好的建議, 請聯系筆者:ggg82@sina.com
更多文章 更多內容請看Wlan組網----家庭專題專題,或

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久中文精品视频| 亚洲精品免费网站| 欧美与黑人午夜性猛交久久久| 韩国v欧美v日本v亚洲| 欧美激情亚洲视频| 欧美乱妇高清无乱码| 在线色欧美三级视频| 色综合久久悠悠| 成人福利免费观看| 亚洲第一国产精品| 美女av一区二区| 九九久久久久久久久激情| 亚洲一二在线观看| 欧美一级淫片丝袜脚交| 国产中文字幕91| 日本久久久久久久久| 国语自产精品视频在线看抢先版图片| 色婷婷综合久久久久中文字幕1| 亚洲一区免费网站| 精品亚洲国产成av人片传媒| 日韩av免费观影| 宅男66日本亚洲欧美视频| 久久综合色影院| 国产精品99久久久久久久久久久久| 日韩乱码在线视频| 久久精品影视伊人网| 伊人久久男人天堂| 亚洲精品美女久久| 欧美专区中文字幕| 亚洲成人精品视频| 日韩精品中文在线观看| 精品国产自在精品国产浪潮| 在线视频精品一| 国产精品久久久久久久av电影| 精品亚洲国产成av人片传媒| 中文国产成人精品久久一| 日韩免费av在线| 色偷偷噜噜噜亚洲男人| 亚洲美女黄色片| 欧美成人在线免费视频| 亚洲欧美制服丝袜| 国产精品网红直播| 久久久精品免费视频| 欧美区二区三区| 久久久久久91香蕉国产| 国产精品九九久久久久久久| 欧美日韩成人在线视频| 538国产精品一区二区在线| 中文字幕成人精品久久不卡| 国产成人a亚洲精品| 亚洲自拍偷拍色片视频| 久久欧美在线电影| 97精品视频在线| 中文字幕亚洲欧美在线| 精品视频一区在线视频| 青草青草久热精品视频在线观看| 久久精品国产2020观看福利| 日韩欧美精品中文字幕| 日本精品一区二区三区在线播放视频| 日韩av影院在线观看| 亚洲欧美国产一区二区三区| 欧美成人精品在线视频| 7m精品福利视频导航| 亚洲欧美日韩第一区| 丁香五六月婷婷久久激情| 久久精品国产欧美激情| 国产91网红主播在线观看| 高清欧美一区二区三区| 国产啪精品视频网站| 国产欧美在线播放| 日韩视频免费大全中文字幕| 亚洲美女免费精品视频在线观看| 日韩中文字幕欧美| 亚洲国产精品久久91精品| 亚洲аv电影天堂网| 成人久久久久久久| 国产精品一区二区三区久久久| 美日韩精品视频免费看| 777精品视频| 91啪国产在线| 欧美日韩亚洲国产一区| 久久久免费在线观看| 91成人天堂久久成人| 亚洲美腿欧美激情另类| 国产盗摄xxxx视频xxx69| 欧美大全免费观看电视剧大泉洋| 亚洲成人网在线| 亚洲伦理中文字幕| 伊人伊人伊人久久| 欧美亚洲在线播放| 在线观看免费高清视频97| 亚洲综合精品伊人久久| 欧美第一黄网免费网站| 久久精品视频99| 中文字幕日韩电影| 亚洲天堂日韩电影| 麻豆精品精华液| 日韩经典中文字幕| 91久久中文字幕| 国产激情久久久久| 狠狠躁夜夜躁久久躁别揉| 日韩av理论片| 精品久久久久人成| 一区二区成人av| 亚洲天堂男人天堂| 国产欧美精品日韩精品| 成人免费视频网址| 一本久久综合亚洲鲁鲁| xxxxx91麻豆| 成人夜晚看av| 久久成人人人人精品欧| 精品无码久久久久久国产| 久久免费国产精品1| 亚洲va电影大全| 亚洲天堂日韩电影| 欧美性受xxxx黑人猛交| 亚洲第一中文字幕| 亚洲第一中文字幕在线观看| 91精品中国老女人| 蜜臀久久99精品久久久无需会员| 中文字幕av一区| 日韩在线观看免费全| 欧美大片欧美激情性色a∨久久| 97色在线观看免费视频| 亚洲国产精品99| 国产精品视频免费在线| 亚洲japanese制服美女| 伊人久久久久久久久久久久久| 国产精品国内视频| 国产精品久久久久久久久久三级| 日韩中文字幕免费| 日韩av一区二区在线| 欧美在线一级va免费观看| 欧美日韩中文字幕日韩欧美| 中文字幕亚洲一区二区三区五十路| 中文字幕亚洲综合久久筱田步美| 国产精品99久久久久久白浆小说| 国产主播欧美精品| 66m—66摸成人免费视频| 日韩精品欧美激情| 一区二区亚洲欧洲国产日韩| xxx成人少妇69| 日韩精品在线第一页| 久久影视三级福利片| 日韩av网址在线观看| 国产精品日韩av| 中文字幕国产亚洲| 国产精品永久免费| 国产精品av网站| 日韩中文在线视频| 国产在线精品自拍| 亚洲国产精品网站| 日本电影亚洲天堂| 久久精品国产成人| 欧美激情三级免费| 欧美亚洲另类激情另类| 国产精品久久久久久av福利软件| 日韩经典一区二区三区| 欧美日韩国产黄| 欧美在线视频一区二区| 国产精品久久久久久久久久久久久久| 热re99久久精品国产66热| 欧美性受xxxx黑人猛交| 91精品在线一区|