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

首頁 > 編程 > Java > 正文

Toolbar制作菜單條過程詳解

2020-01-31 16:52:27
字體:
來源:轉載
供稿:網友
文章來源:互聯網 作者:ggg82/CSDN

  現在許多用戶界面都使用工具欄制作菜單條,小弟最近對此感興趣,便從網上求助,可是得到的幫助大多是BCGControlBar的源代碼或者是SizableRebar的源代碼,對于只希望是自己的界面具有該功能的朋友來說,這也許是不錯的選擇,只要看一下demo,然后直接調用別人的類庫就可以了,但對于我等對此話題感興趣,希望弄懂其來龍去脈的讀者來說,直接看這些沒有詳細解釋的源代碼,要從中弄出個所以然來,實不是件容易的是,至少對于像我這樣的菜鳥來說是這樣的,本文出于此種原因,希望對還在尋求此幫助的讀者能提供一些幫助。

   下面我們邊看邊侃:

  在接收到toolbarbutton按下消息時,我們一般使用TrackPopupMenuEx彈出菜單,問題的關鍵是,在菜單未關閉時,TrackPopupMenuEx并不返回,并攔截鼠標和鍵盤消息,使用spy可以看到,此時的工具欄收不到任何消息,當然無從改變熱點,這就需要我們自己探測鼠標位置并在鼠標移動到下一個熱點時關閉上一個菜單并顯示下一個菜單。這里我們使用鉤子函數SetWindowsHookEx在調用TrackPupupMenuEx前安裝WH_MSGFILTER鉤子,代碼如下:
m_hMsgHook = SetWindowsHookEx( WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId() );
MssageProc是鉤子函數,代碼如下:



LRESULT CALLBACK  MessageProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code == MSGF_MENU)
{
HookMessageProc(lParam);
}
return CallNextHookEx(m_hMsgHook, code, wParam, lParam);
}
  函數檢查消息,如果是來自菜單,則將消息傳遞給函數HookMessageProc處理,我們所要做的就是在該函數中檢測消息WM_MOUSEMOVE,并測試鼠標位置,如果鼠標已經移動到另一個按鈕上,則關閉菜單并顯示下一個菜單,關閉菜單使用消息WM_CANCELMODE,當菜單關閉后,我們要釋放鉤子,在下一個菜單彈出時重新安裝鉤子,彈出菜單示例代碼如下:


void TrackPopup(HWND hWndToolBar, int iButton)
{
while (iButton >= 0)
{
SendMessage(hWndToolBar,TB_SETHOTITEM,iButton,0);
iPopup = iButton;
//安裝鉤子
g_hMsgHook = SetWindowsHookEx(WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId());
//彈出菜單
TrackPopupMenuEx(…);
//卸載鉤子
UnhookWindowsHookEx(g_hMsgHook);
iButton = iNextPop; //下一個彈出項,若為負,則退出
}
SendMessage(hWndToolBar,TB_SETHOTITEM,-1,0);

}

 ?。ń涷炁c建議:如果button使用樣式TBSTYLE_DROPDOWN,請不要在消息TBN_DROPDOWN中直接調用該函數,應使用中間消息,然后使用PostMessa個發送該消息,以使TBN_DROPDOWN可以直接返回,否則消除第一個高亮熱點是很麻煩的事。)

  iPopup為當前彈出項,iNextPop為下一個彈出項,這些變量需要在函數HookMessageProc中處理,示例代碼如下:



void HookMessageProc(MSG * pMsg)
{
if (pMsg->message == WM_MOUSEMOVE)
{
int iButton, iCount;
POINT pt = { LOWORD(pMsg->lParam), HIWORD(pMsg->lParam) };
ScreenToClient(hWndToolbar, &pt);
iButton = SendMessage(hWndToolbar, TB_HITTEST, 0, &pt);
iCount = SendMessage(hWndToolbar, TB_BUTTONCOUNT, 0, 0);
if (iPopup != iButton && iButton < iCount && iButton >= 0)
{
iNextPop = iButton;
SendMessage(hWndMain, WM_CANCELMODE, 0, 0);
}
else
{
iNextPop = -1;
}
}
}
 ?。ń涷炁c建議:不要試圖在此處調用TrackPopup,我曾試圖取消該函數內的while循環,直接在此調用該函數,結果是在TrackPopupMenuEx未返回之前,該函數已被調用)

  這里,僅僅處理了鼠標移動消息,真正的菜單還應處理鍵盤導航消息,詳細的代碼可以參考
BCGControlBar(http://www.vckbase.com/code/downcode.asp?id=1382)
或SizableRebar(http://www.codeproject.com/docking/sizablerebar/SizableRebar_demo.zip


  有了這底層框架,這些處理過程應該不再困難,文章所涉及到的一些API函數可以參考msdn。
Msdn上相關資料:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/faq/iemenubar.asp
http://www.microsoft.com/msj/0199/c/c0199.aspx
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产久一一精品| 精品中文视频在线| 日韩美女视频免费在线观看| 日韩电影免费观看在线| 国产视频精品免费播放| 亚洲精品色婷婷福利天堂| 国产精品一区二区久久| 成人信息集中地欧美| 91精品国产高清久久久久久91| 国产日韩精品在线播放| 亚洲一级免费视频| 日韩av在线网址| 欧美综合在线观看| 九九综合九九综合| 久久深夜福利免费观看| 久久天天躁狠狠躁夜夜躁2014| 欧美一级淫片aaaaaaa视频| 正在播放欧美视频| 尤物99国产成人精品视频| 国产精品91久久久久久| 日韩免费av在线| 国产精品久久久久久中文字| xxav国产精品美女主播| 欧美激情在线狂野欧美精品| 91在线精品播放| 欧美老妇交乱视频| 国产精品国模在线| 欧美电影《睫毛膏》| 全球成人中文在线| 欧美日韩国内自拍| 久久精品中文字幕电影| 91av在线免费观看视频| 91在线国产电影| 国产一区二区日韩精品欧美精品| 在线视频欧美日韩| 亚洲人成五月天| 欧美黄色小视频| 亚洲精品丝袜日韩| 亚洲欧美一区二区精品久久久| 77777亚洲午夜久久多人| 欧美极度另类性三渗透| 91av网站在线播放| 欧美噜噜久久久xxx| 色婷婷**av毛片一区| 91精品国产91久久久久久| 91精品在线观| 欧美视频二区36p| 亚洲国产精彩中文乱码av在线播放| 91精品免费久久久久久久久| 国产主播欧美精品| 国内精品一区二区三区| 琪琪第一精品导航| 亚洲成人久久电影| 国产一区二区黄| 在线日韩精品视频| 97精品欧美一区二区三区| 九色成人免费视频| 亚洲xxxx在线| 欧美午夜精品久久久久久人妖| 日韩在线观看网址| 九九视频这里只有精品| 日韩在线播放一区| 欧美韩国理论所午夜片917电影| 伊人久久久久久久久久久久久| 国产精品激情自拍| 亚洲欧洲视频在线| 青青草国产精品一区二区| 亚洲电影免费观看高清完整版| 日韩欧美成人精品| 久久久这里只有精品视频| 欧美国产日韩一区二区在线观看| 国产一区二区三区高清在线观看| 亚洲欧美中文日韩v在线观看| 久久亚洲精品国产亚洲老地址| 日韩毛片中文字幕| 国产欧美日韩精品在线观看| 国产97在线视频| 91中文字幕在线观看| 精品女同一区二区三区在线播放| 国产美女精品免费电影| 欧洲亚洲免费在线| 欧美综合在线观看| 国外色69视频在线观看| 日韩成人在线视频网站| 日韩av片电影专区| 欧美高跟鞋交xxxxhd| 精品亚洲一区二区三区在线播放| 一二美女精品欧洲| 这里精品视频免费| 欧美肥老太性生活视频| 在线日韩精品视频| 亚洲免费视频在线观看| 性欧美xxxx交| 一本色道久久88综合日韩精品| 色综合色综合久久综合频道88| 欧洲日本亚洲国产区| 国产日韩在线看| 成人福利免费观看| 日韩欧美在线视频日韩欧美在线视频| 欧美激情va永久在线播放| 狠狠做深爱婷婷久久综合一区| 亚洲娇小xxxx欧美娇小| 国产一区二区三区在线视频| 国产一区二区三区毛片| 亚洲欧洲激情在线| 日韩欧美成人网| 最近2019中文字幕一页二页| 91香蕉国产在线观看| 欧洲成人午夜免费大片| 亚洲电影免费观看高清完整版| 国产精品久久久久久久久粉嫩av| 国产原创欧美精品| 欧美色videos| 78m国产成人精品视频| 国产一区红桃视频| 91久久在线播放| 久久精品男人天堂| 黑人精品xxx一区| 久久av在线播放| 欧美日韩不卡合集视频| 欧美片一区二区三区| 亚洲美女av在线播放| 成人国产精品一区| 欧美性猛交视频| 成人国产亚洲精品a区天堂华泰| 九九精品视频在线| 欧美成人中文字幕在线| 日韩欧美国产中文字幕| 亚洲视频777| 精品女厕一区二区三区| 亚洲综合在线做性| 国产99久久精品一区二区 夜夜躁日日躁| 国产99久久精品一区二区 夜夜躁日日躁| 欧美最猛性xxxxx亚洲精品| 久久青草精品视频免费观看| 亚洲精品日韩欧美| 亚洲色图校园春色| 日本精品久久久久影院| 8050国产精品久久久久久| 欧美怡红院视频一区二区三区| 成人春色激情网| 欧美大片免费观看| 91亚洲精品视频| 国产色综合天天综合网| 亚洲精品一二区| 成人看片人aa| 尤物精品国产第一福利三区| 欧美精品videofree1080p| 欧美激情视频播放| 久久久伊人欧美| 欧美丝袜一区二区三区| 最近2019中文免费高清视频观看www99| 亚洲最大福利网站| 国产原创欧美精品| 国产91精品在线播放| 国产精品成人在线| 欧美极品xxxx| 国产精品综合不卡av| 欧美诱惑福利视频| 精品女厕一区二区三区| 中文字幕一区电影| 欧美日韩精品国产| 精品国产一区二区三区久久狼5月| 日韩精品高清在线观看|