最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Toolbar制作菜單條過程詳解

 更新時間:2006年12月23日 00:00:00   作者:  
文章來源:互聯(lián)網(wǎng) 作者:ggg82/CSDN

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

   下面我們邊看邊侃:

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



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


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; //下一個彈出項,若為負(fù),則退出
}
SendMessage(hWndToolBar,TB_SETHOTITEM,-1,0);

}

 ?。ń?jīng)驗與建議:如果button使用樣式TBSTYLE_DROPDOWN,請不要在消息TBN_DROPDOWN中直接調(diào)用該函數(shù),應(yīng)使用中間消息,然后使用PostMessa個發(fā)送該消息,以使TBN_DROPDOWN可以直接返回,否則消除第一個高亮熱點是很麻煩的事。)

  iPopup為當(dāng)前彈出項,iNextPop為下一個彈出項,這些變量需要在函數(shù)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;
}
}
}
  (經(jīng)驗與建議:不要試圖在此處調(diào)用TrackPopup,我曾試圖取消該函數(shù)內(nèi)的while循環(huán),直接在此調(diào)用該函數(shù),結(jié)果是在TrackPopupMenuEx未返回之前,該函數(shù)已被調(diào)用)

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


  有了這底層框架,這些處理過程應(yīng)該不再困難,文章所涉及到的一些API函數(shù)可以參考msdn。
Msdn上相關(guān)資料:
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

相關(guān)文章

  • Spring MVC集成springfox-swagger2構(gòu)建restful API的方法詳解

    Spring MVC集成springfox-swagger2構(gòu)建restful API的方法詳解

    這篇文章主要給大家介紹了關(guān)于Spring MVC集成springfox-swagger2構(gòu)建restful API的相關(guān)資料,文中介紹介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-06-06
  • java清除u盤內(nèi)存卡里的垃圾文件示例

    java清除u盤內(nèi)存卡里的垃圾文件示例

    手機(jī)內(nèi)存卡空間被用光了,但又不知道哪個文件占用了太大,一個個文件夾去找又太麻煩,開發(fā)了個小程序把手機(jī)所有文件(包括路徑下所有層次子文件夾下的文件)進(jìn)行一個排序,這樣你就可以找出哪個文件占用了內(nèi)存太大了
    2014-02-02
  • idea創(chuàng)建SpringBoot自動創(chuàng)建Lombok無效果的問題解決方案

    idea創(chuàng)建SpringBoot自動創(chuàng)建Lombok無效果的問題解決方案

    這篇文章主要介紹了idea創(chuàng)建SpringBoot自動創(chuàng)建Lombok無效果的問題解決方案,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • SpringBoot中Redis自動配置的介紹、原理和使用詳解

    SpringBoot中Redis自動配置的介紹、原理和使用詳解

    這篇文章主要介紹了SpringBoot中Redis自動配置的介紹、原理和使用詳解,Redis是一種高性能的鍵值對存儲數(shù)據(jù)庫,它支持多種數(shù)據(jù)結(jié)構(gòu)和豐富的功能,如緩存、消息隊列、計數(shù)器、分布式鎖等,需要的朋友可以參考下
    2023-08-08
  • springboot整合shiro實現(xiàn)記住我功能

    springboot整合shiro實現(xiàn)記住我功能

    這篇文章主要介紹了springboot整合shiro實現(xiàn)記住我功能,配置類 ShiroConfig,通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • Java多線程提交按照時間順序獲取線程結(jié)果詳解流程

    Java多線程提交按照時間順序獲取線程結(jié)果詳解流程

    在工作中是否存在這樣的場景,多個線程提交執(zhí)行,你不想全部線程執(zhí)行結(jié)束了獲取結(jié)果,而是有線程完成返回結(jié)果就獲取消費。本文提供該場景的工具類,可以直接用哦
    2021-11-11
  • Java Swing窗體關(guān)閉事件的調(diào)用關(guān)系

    Java Swing窗體關(guān)閉事件的調(diào)用關(guān)系

    這篇文章主要為大家詳細(xì)介紹了Java Swing窗體關(guān)閉事件的調(diào)用關(guān)系,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Mybatis generator自動生成代碼插件實例解析

    Mybatis generator自動生成代碼插件實例解析

    這篇文章主要介紹了Mybatis generator自動生成代碼插件實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • Springboot讀取templates文件html代碼實例

    Springboot讀取templates文件html代碼實例

    這篇文章主要介紹了Springboot讀取templates文件html代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Java的深拷貝和淺拷貝深入了解

    Java的深拷貝和淺拷貝深入了解

    這篇文章主要為大家介紹了Java的深拷貝和淺拷貝,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01

最新評論

吉安县| 土默特左旗| 乌鲁木齐县| 安顺市| 清原| 车险| 龙江县| 锡林浩特市| 德州市| 仁化县| 鄯善县| 湖州市| 政和县| 即墨市| 丰宁| 郸城县| 锡林浩特市| 包头市| 连江县| 金平| 庆云县| 广汉市| 富锦市| 广宁县| 吴川市| 铅山县| 湘乡市| 衡南县| 东源县| 胶南市| 大名县| 女性| 思茅市| 三门峡市| 成武县| 泗水县| 崇明县| 皋兰县| 增城市| 宜丰县| 清原|