返回首页

{A}简介我想在我的应用程序的浮动工具栏,除了标准的停靠工具栏。浮动工具栏不停靠。因此,它总是看起来像这样:
{S0}
在右上角的那个小"X"?我想禁用它,使用户无法解雇工具栏。正如你猜想的,原来不可怕明显,如何禁用它。背景在MFC中的工具栏上的变化。我们有CToolBar,CDialogBar等。我选择CToolBar为基类。在MFC SDI应用程序中,您创建您的工具栏在大型机的OnCreate()成员函数,并做相应的巫术停靠或浮动。在我的应用程序,它看起来像这样。


if (!m_wndToolBar.CreateEx(this) || !m_wndToolBar.LoadToolBar(IDR_TOOLBAR))

{

    TRACE0("Failed to create toolbar\n");

    return -1;      // fail to create

}



CPoint pt(0, 25);



ClientToScreen(&pt);

m_wndToolBar.EnableDocking(0);

FloatControlBar(&m_wndToolBar, pt);

创建工具栏,禁用特定的工具栏上的对接,并呼吁FloatControlBar()指定初始屏幕坐标的工具栏。
我们知道,暴露在我们的CToolBar对象的窗口句柄是一个Win32的工具栏控件的句柄,我们也知道,这样的控制没有标题,厚厚的框架或系统菜单/关闭按钮。显然,那么,我们的工具栏控件在另一个窗口主办。
在窗口层次使用Spy挖掘,发现在m_wndToolBar中的窗口句柄对象是一个孩子AfxControlBar(确切的类的名称各不相同),这又是一个顶层窗口的子。
MFC源代码的时间。
切割长话短说,您选择停靠或浮动的工具栏控制窗口创建后。在这两种如果AfxControlBar创建作出我们的工具栏的父。然后,如果你对接的窗口,AfxControlBar是大型机窗口的孩子。但是,如果你是浮动的工具栏,另一个窗口创建父AfxControlBar。其他窗口是一个CMiniDockFrameWnd和窗口已关闭按钮。CMiniDockFrameWnd这是一个在MFC中的无证helper类从CMiniFrameWnd派生。该框架创建一个CMiniDockFrameWnd一旦需要,并适当的法宝线我们的工具栏控件,并它连接到我们的主机窗口。
标准的方法对这个问题可能是从CMiniDockFrameWnd派生我们自己的类,无论是代一个新的关闭按钮的消息处理程序,或修改在创建时的窗口样式,甚至防止关闭按钮
不幸的是,这种方法不会工作。问题是有没有办法从CMiniFrameWnd派生一个新类,框架使用这个类,除非你准备创建自己的私有版本的MFC。特别是,既不EnableDocking()也不FloatControlBar()是虚拟的,所以你不能取代的,小部分一个覆盖,将创建您CMiniDockFrameWnd衍生的框架。您Dunno,但有没有办法我准备创建自己的私有版本的MFC。也不是,对于这个问题,我准备剪切和粘贴一个显著到我自己的类定义的比例,允许创建和使用的CMiniDockFrameWnd推导的MFC。
因此,我们必须另谋出路。如何继承CMiniDockFrameWnd?不,这不会工作。 "窗口已经是子类的MFC,你会打断言,如果您尝试。 (我所说的子类有关MFC风格在这里。直接子类可能的工作 - 我没有尝试)。我的最终解决方案也许有点"快速和肮脏的",但它的作品相当不错。解决的办法是从工具栏,导航窗口层次结构控制窗口的CMiniDockFrameWnd,系统菜单和禁用"关闭"项。这将禁用收盘按钮。我也从菜单中删除"关闭"项。后者是因为你可以右键点击工具栏上的标题和获得系统菜单。代码看起来像这样。{C}该代码是基于假设有一个连接到我们的工具栏窗口的祖父母或外祖父母的菜单上。那将是真正的两个MFC7目前的化身停靠和浮动窗口。由于安全检查,我们确保我们不修改我们的主机系统菜单。我们还检查每一步,我们的一些假设的有效性,通过验证,该指针我们得到的是有效的。使用代码源代码下载这两个文件添加到您的项目。你可能想给类一个更好的名字比CMyToolBar。在您CMainFrm的类变化的CToolBar CMyToolBar。然后,在年初的某个时候生活的工具栏,但后大型机窗口被创建后,你所谓的FloatControlBar()

回答