文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | firefox | WPS | 杀毒软件 | Picasa
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形图像 办公软件 媒体动画 精文荟萃 常用软件 网页编程 技术开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院网站建设HtmlToolbar制作菜单条过程详解
精品推荐
特别推荐
·HTML语言:什么是Unicode 什么是UTF-8
·XHTML编写网页代码的七条基本规范
·HTML和XHTML的区别
·HTML语言:什么是Unicode?什么是UTF-8?
·HTML 和 XHTML 区别
·HTML标记全集
·分析比较:三种简洁的Tab导航简析
·HTML教程-HTML简介
·网页Web标准化教程关于表格的应用
·网页代码常用小技巧总结续,网页制作学习
·HTML 标记参考手册
·用htc实现html编辑器
·HTML 4.0 语言快速入门参考教程
·初学:什么是DIV+CSS?有什么优势?
·网页制作实例CSS用一张图片实现圆角
·DIV CSS网页布局学习中容易出现的问题汇总
·HTML标签语义 科学合理的运用HTML标签
·53个CSS-不可或缺的技巧
·页面显示问题
·CSS标准网页设计UL和DIV使用的技巧总结
热点TOP10
·弹出窗口代码集萃
·图片左右循环连续滚动代码,解决marquee的留白问题
·HTML 4.0 语言快速参考
·html教学+HTML语法大全
·HTML标记全集
·设计一个基于CSS的网页模板
·如何隐藏网页中的层DIV
·超强,用CSS构建iframe效果
·HTML:网页刷新方法集合
·HTML 标记参考手册
·中国地区三级联动下拉菜单代码和示例(附带代码下载)
·弹出网页窗口全攻略(html/hta)
·CSS属性列表
·CSS+DIV设计实例:纯CSS制作下拉导航菜单
·分析比较:三种简洁的Tab导航简析
·使网页文字竖排的三种方法
·CSS标准网页设计UL和DIV使用的技巧总结
·比较漂亮的链接样式
·页面显示问题
·HTML语言:什么是Unicode 什么是UTF-8

Toolbar制作菜单条过程详解

日期:2008年4月13日 作者:清风网络学院 查看:[大字体 中字体 小字体]


现在许多用户界面都使用工具栏制作菜单条,小弟最近对此感兴趣,便从网上求助,可是得到的帮助大多是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);

}

  (经验与建议:如果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;
}
}
}
  (经验与建议:不要试图在此处调用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

[1] [2] 下一页 




上一篇:Java开发精彩教程:JSF系列(三)

下一篇:一款动画Logo制作方法

Toolbar制作菜单条过程详解 相关文章:
·最强安全基础 从0到33600端口详解
·BIOS详解
·Windows2000/XP启动过程详解
·Linux常用命令详解
·反恐精英CS服务器架设详解
·WinXP中常见网络与安全服务详解
·图文详解 Windows 2003服务器集群安装
·Windows XP SP3细节官方详解
·RAID技术详解
·常用网络命令及命令实例详解
Toolbar制作菜单条过程详解 相关软件:
·孙鑫VC++从入门到精通开发详解视频教程FLASH版
·fdisk分区详解电子书教程
·硬盘分区与格式化详解
·TCP-IP详解卷1:协议
·TCP-IP详解卷2:实现
·AutoCAD2002入门与实例详解
·实用C语言详解
·3ds max5_0精彩实例详解室内装潢与展示效果图制作篇
·c++ 语言命令详解(第二版)
·网络端口详解

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.vipcn.com
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.vipcn.com All Rights Reserved. 鄂ICP备05000083号Powered by:vipcn