<!-- Search Google -->
输入您的搜索字词 提交搜索表单
|
<!-- Search Google -->
集成开发环境中各个窗口的行为都是事先实现的,比如,文档编辑窗口对应着多文档类的视图窗口,负责对用户的输入进行响应,更新窗口的内容,主窗口负责调度各个视图窗口。Visual Studio的集成开发环境(IDE)没有给我们提供任何接口实现在IDE中添加一个窗口,并且这个窗口能够和IDE中其他窗口分享消息的功能,也就是说正常情况下插件无法干涉IDE环境中窗口的正常行为。但是,这并不意味着我们只能老老实实的作些本分工作,因为通过窗口的子类化技术(Subclassing),我们一样可以Hook窗口的消息。Visual Studio的插件是工作在IDE的进程空间的,这就给我们提供了Hook IDE内任何窗口的机会。从理论上讲,我们可以使用自己的窗口消息处理过程代替IDE中各个窗口的标准窗口消息处理过程,完成对特定消息的响应,甚至完全改变某个窗口的行为。著名的VC商业插件软件Visual Assist就是替换了文档编辑的视图窗口,从而使其比默认的文档编辑窗口提供更多的便利功能。
Visual Studio的IDE环境有很多窗口,我们关心的只有三个(类)窗口,一个是主框架窗口,一个是MDI子框架窗口,一个是文档窗口。TabBars的标签栏其实并不依赖主框架窗口的消息约束自己的行为,子类化主框架窗口主要是为了处理WM_GETTEXT消息。当用户在不同的文档窗口之间切换时,主框架窗口就会相应的改变窗口标题栏上显示的文字,Hook WM_GETTEXT消息可以使Tabbars插件自己创建的窗口能够在第一时间获得这个消息并做出相应的处理。子类化MDI子框架窗口有两个主要目的,一个是截获窗口大小和位置变更的消息以便能够适时的调整标签栏的大小和位置;另一个是向文档窗口报告MDI子框架窗口新的客户区位置,新客户区排除了标签栏窗口占用的位置,如果不处理这个消息,框架窗口会将文档窗口会按照默认的位置摆放,这会遮挡标签栏窗口。子类化文档窗口是为了处理WM_DESTROY消息,以便能够在用户关闭文档窗口时有机会更新标签栏上的按钮。下图是TabBars插件的窗口类关系图:
图1. Tabbars窗口类关系图
关系图中的核心是CTabManagerWindow类,这个类虽然名为TabManager,但是并不直接管理标签栏,它通过CTabBarsWnd管理标签栏。CTabBarsWnd是一个MFC的CWnd派生类,他的作用有两个,一个是周期的产生定时器事件,驱动TabBars插件完成文件自动保存之类的工作;另一个作用就是作为容器窗口承载一个Table控件。
子类化窗口的关键是找到窗口的句柄,Visual Studio的内置插件接口没有提供获取这些窗口句柄的方法,TabBars使用了很多小的Trick来达到这个目的,首先是hook主框架窗口,先看下面的代码:
pApp->put_Active(VARIANT_FALSE);
pApp->put_Active(VARIANT_TRUE);
hWnd = ::GetActiveWindow();
while (hWnd && hWnd != hDesktopWnd)
{
hDevStudioWnd = hWnd;
hWnd = ::GetParent(hWnd);
}
g_pDevStudioWnd = new CDevStudioWnd(hDevStudioWnd); //CWnd::FromHandle(hDevStudioWnd);
put_Active是操作IApplication接口的Active属性,确保Visual Studio的IDE窗口是当前活动窗口,紧跟着调用GetActiveWindow获得这个窗口。不过,GetActiveWindow通常得到的是IDE下的活动子窗口,所以通过向上查找父窗口最终可以得到真正的主框架窗口。
得到主框架窗口之后就可以顺藤摸瓜得到MDI子框架窗口,MDI子框架窗口使用了固定的类名:MDIClient,所以遍历主框架窗口的所有子窗口就可以找到MDI客户区窗口:
char cClassName[256];
hMDIWnd = g_pDevStudioWnd->GetTopWindow()->m_hWnd;
::GetClassName(hMDIWnd, (LPTSTR)cClassName, sizeof(cClassName));
while (strcmp(cClassName, "MDIClient") != 0)
{
hMDIWnd = ::GetNextWindow(hMDIWnd, GW_HWNDNEXT);
ASSERT(hMDIWnd);
GetClassName(hMDIWnd, (LPTSTR)cClassName, sizeof(cClassName));
}
子类化这些关键窗口,使得TabBars插件自己创建的窗口可以hook适当的消息,通过响应这些消息,TabBars插件可以调整标签栏的位置,更新标签栏并通知其他窗口MDI客户区的改变,从而使TabBars窗口能够融入到Visual Studio的集成开发环境(IDE)中。
分享到:
相关推荐
微信小程序——自定义tabbar(截图+源码).zip 微信小程序——自定义tabbar(截图+源码).zip 微信小程序——自定义tabbar(截图+源码).zip 微信小程序——自定义tabbar(截图+源码).zip 微信小程序——自定义...
"IOS应用源码——TabBar+Table+UISearchDisplayController.rar" 这个标题揭示了我们正在处理一个iOS应用的源代码,它包含三个关键组件:TabBar、Table和UISearchDisplayController。TabBar是iOS界面设计中常见的底部...
在iOS和Android应用开发中,TabBar通常作为底部导航栏使用,用于展示多个主要功能间的切换。本主题聚焦于如何自定义TabBar,以便更好地适应应用程序的视觉风格和交互需求,同时移除系统的默认TabBar。 一、iOS中的...
在iOS应用开发中,TabBarController是用户界面设计中常见的组件之一,它允许用户通过底部的标签栏在不同的视图控制器间切换。然而,系统默认的TabBar可能无法满足所有设计需求,因此开发者经常需要自定义TabBar来...
4. 在Activity中设置ViewPager,并将适配器与之关联。 5. 创建TabLayout实例,并将其与ViewPager关联。 6. 设置TabLayout的样式和标签,可以使用`TabLayout.addTab()`方法。 7. 添加事件监听,以便在Tab切换时执行...
本教程将探讨如何通过几行代码实现导航栏的透明渐变效果以及TabBar中间按钮的凸起设计,这两种特性都能使你的应用程序更加吸引人。我们将主要使用Swift语言进行讲解,同时也适用于使用Storyboard或纯代码布局的应用...
"IOS应用源码——TabBarCustom (所有TabBar——间切换)" 这个标题揭示了我们正在处理一个iOS应用的源代码,它专注于TabBar的自定义功能,特别是涉及到在多个TabBar之间进行切换。TabBar是iOS应用中常见的组件,通常...
本资源“IOS应用源码——TabBarCustom (所有TabBar——间切换).zip”提供了一个自定义TabBar的实现,帮助开发者了解并掌握如何在iOS应用中实现TabBar的自定义以及在多个TabBar间平滑切换的技巧。 首先,...
小程序源码 自定义tabbar (代码+截图)小程序源码 自定义tabbar (代码+截图)小程序源码 自定义tabbar (代码+截图)小程序源码 自定义tabbar (代码+截图)小程序源码 自定义tabbar (代码+截图)小程序源码 自定义tabbar ...
TabBar是Flutter中的一个核心组件,它用于在多个页面或视图之间切换,通常位于屏幕底部。TabBar包含了多个Tab,每个Tab代表一个页面或视图。在默认情况下,TabBar会随着页面的切换而改变选中状态,但并不会随着内容...
本项目聚焦于在MVP架构下如何封装导航栏(Navigation Bar)和TabBar,以实现更加高效且整洁的代码组织。 首先,我们来详细了解MVP架构。MVP中的“Model”代表数据模型,负责处理应用程序的数据存储和业务逻辑;“View...
2001年的时候我在网上见到了一款名为“WndTab”的VC插件,它提供了一个集成在编辑窗口的table标签栏,每个打开的文档对应一个标签栏的按钮,通过鼠标点击按钮可以在文件之间快速切换,大大方便了代码查看和编辑,除...
在iOS应用开发中,创建一个类似“映客”这样的视频直播平台界面,常常需要实现一些高级的UI交互效果,比如中间凸出的TabBar、在上下滑动时动态隐藏或显示导航栏及标签栏。本教程将重点讲解如何用Swift语言实现这个...
在网站开发中,Tabbar(标签栏)是用户界面中常见的元素,用于组织和导航不同功能或内容区域。自定义Tabbar可以根据项目需求提供独特的设计和交互体验,使其与网站的整体风格保持一致并提高用户体验。本资源“源代码...
本资源"IOS应用源码——一个复杂的tabbar视图.zip"提供了一个iOS应用的源代码,该应用使用了复杂的TabBar视图设计,非常适合iOS开发者学习和参考。 1. TabBarController基础:TabBarController是iOS中的...
在iOS应用开发中,导航栏(Navigation Bar)和Tabbar(Tab Bar)是两种非常重要的界面元素,它们为用户提供了一种直观的交互方式,引导用户在应用的不同部分之间进行导航。本篇将深入探讨这两个组件的基本概念、...
在Qt编程环境中,`Qt5多行自适应TabBar`是一个设计用于解决窗口Tab栏在空间有限时如何优雅地展示多个标签页的功能。通常,TabBar控件在窗口顶部或侧边显示,用于切换不同的工作区。然而,当标签数量增多,而窗口宽度...
自定义tabbar底部导航栏,简洁,方便,二开 使用教程 将组件拷贝到uni_modules目录内,然后其他页面进行引用即可 <TC-tabBar :zhi="zhi"></TC-tabBar> </template>
这个“IOS应用源码——一个复杂的tabbar视图.rar”文件提供了一个具体实现,让我们来深入探讨这个复杂TabBar视图的相关知识点。 1. **UITabBarController**:作为苹果iOS SDK中的核心类,`UITabBarController`是...
本教程将详细讲解如何使用纯代码实现一个自定义的TabBar,包括调整大小、设置图片、改变背景颜色以及动态添加TabBarItem。我们将主要关注Swift编程语言,但基本原理在Objective-C中同样适用。 首先,我们需要创建一...