返回首页


简介
我想在一个可停靠的工具栏显示一个PropertySheet,我想要的表有一个标题,在停靠和脱开的状态,使用户知道它是什么,我想它而停靠在MDI查看比主框架。我怀疑,如果这些要求将是一个专业的MFC程序员的挑战,但因为我不是一个,我花了一段时间弄明白,我想它可能会节省一些时间,如果我共享代码。
的主要问题如下。首先,获得一个属性表中显示原始CControlBar。二,标准的属性表显示一定(相当大)的最小宽度和高度,但在一般情况下,人们希望的工具栏是相当紧凑。幸运的是,这是一个已经解决了在安东尼奥的优秀文章,我用他的代码,只是略作修改的问题。三,控制条,标题栏和标题在未停靠的浮动状态,而只是显示在停靠状态的夹子,这样的标题必须手工编码栏停靠时。第四,平凡,得到一个工具栏停靠到CView派生类,你要记住,它实际上码头帧的父认为,不视图本身。使用属性表列
功能的实现,这是作为一个在视图中的成员变量实例化类CPropSheetBar。要使用的类,你首先必须构建和添加的CPropertyPage派生的页面,就像你用正常的属性表。这些页面必须住,只要在属性表栏,最好是在堆内认为OnCreate函数构建,创建栏本身之前:
所以,在View.h,我们有:CPropSheetBar m_PropSheetBar;CPage1 *第1页;CPage2 *第2页;CPage3 *第3页;
在View::OnCreate中,我们有:第1页=新CPage1;第2页=新CPage2;第3页=新CPage3;/ /进行数据交换,我给页面视图指针第1页GT; m_pView =;第2页GT; m_pView =;第3页GT; m_pView =;m_PropSheetBar.AddPage(第1页);m_PropSheetBar.AddPage(第2页);m_PropSheetBar.AddPage(第3页);CFrameWnd的* pFrameWnd =(CFrameWnd的*)GetParent();如果(m_PropSheetBar.Create(quot;!测试barquot,pFrameWnd, AFX_IDW_CONTROLBAR_​​FIRST 40)) 返回-1; / /未能创建m_PropSheetBar.EnableDocking(CBRS_ALIGN_ANY);pFrameWnd - GT; EnableDocking(CBRS_ALIGN_ANY);pFrameWnd - GT; DockControlBar(AMP; m_PropSheetBar);
您必须添加的属性页,然后再调用CPropSheetBar:创建,因为创建需要知道它会显示在对话框资源的大小。您可以查看析构函数中删除的网页。通过在创建函数的属性表栏标题。实施CPropSheetBar
CPropSheetBar从CControlBar派生的,并有一个成员变量类CShrinkingPropSheet m_cPropSheet。后者是从一个标准的CPropertySheet派生,并实现了安东尼奥的大小问题的修复。 CPropSheetBar AddPage的效用函数,只是增加了网页嵌入式的属性表:无效AddPage(的CPropertyPage * pPage){m_cPropSheet.AddPage(pPage);}
CPropSheetBar在它的下面覆盖:虚拟无效DrawGripper(CDC * PDC,常量CRECT放大器; RECT);虚拟CSIZE CalcDynamicLayout(INT nLength,DWORD dwMode);虚拟BOOL创建(LPCTSTR lpszWindowName的CWnd * pParentWnd,UINT的NID);
和几个在这些所使用的概念已被拾起从阿尔及尔派克的文章"像一个DevStudio CControlBar"。
CPropSheetBar:创建第一个创建的控制栏本身,然后在其中创建的属性表。这措施的属性表的大小(这是一个萎缩的表,没有微软的感谢)和存储it.BOOL CPropSheetBar:创建(LPCTSTR lpszWindowName的CWnd * pParentWnd,UINT的NID){ / /创建基本窗口 CString的lpszClassName = AfxRegisterWndClass(CS_DBLCLKS LoadCursor(NULL,IDC_ARROW),m_brushBkgd,0); DWORD风格= WS_CHILD | WS_VISIBLE | CBRS_LEFT | CBRS_GRIPPER |  0; CBRS_TOOLTIPS | CBRS_FLYBY; m_dwStyle =风格放大器; CBRS_ALL; (CControlBar::创建(lpszClassName,lpszWindowName 风格,CRECT(0,0,0,0),pParentWnd,NULL)) 返回FALSE; m_strTitle = lpszWindowName; / /创建属性表 m_cPropSheet.Create(这一点,WS_CHILD | WS_VISIBLE); m_cPropSheet.SetTitle(lpszWindowName); CClientDC DC(本); m_sizeTitle = dc.GetTextExtent(m_strTitle); CRECT RC; m_cPropSheet.GetWindowRect(RC); / /屏幕坐标 m_sizePropSheet = rc.Size(); 返回TRUE;}
CPropSheetBar:CalcDynamicLayout是关键的功能,Windows调用时,它显示控制栏。覆盖告诉Windows栏的大小是现在,它包含的属性表,让周围的表合适的利润率。它还移动属性表,酒吧内适当位置,取决于我们是否有手工绘制一个title.CSize CPropSheetBar:CalcDynamicLayout(INT nLength,DWORD dwMode){& #160; IF(IsFloating()) { CRECT RC(连接点(6,6),m_sizePropSheet); m_cPropSheet.MoveWindow(RC); & #160; 返回m_sizePropSheet CSIZE(16,16); } CRECT RC(口岸系统"(4 m_sizeTitle.cy sizeTitleOffset.cy),m_sizePropSheet); m_cPropSheet.MoveWindow(RC); 返回m_sizePropSheet CSIZE(16,10 m_sizeTitle.cy sizeTitleOffset.cy);}
CPropSheetBar::DrawGripper调用默认的,如果因为Windows提供了一个标题栏栏是浮动的,否则它绘制夹子和写入标题。我没有依赖的对接位置的夹持位置,但是这可能是由testing.if(m_dwStyle放大器; CBRS_ORIENT_HORZ)
和编码appropriately.void CPropSheetBar:DrawGripper(CDC * PDC,常量CRECT放大器; RECT)IF(IsFloating()) { CControlBar:DrawGripper(PDC,RECT); 回报; } CFont类的字体;& #160; VERIFY(font.CreateFont( 14,/ / nHeight & #160;0,/ / nWidth 0,/ / nEscapement 0,/ / nOrientation FW_NORMAL,/ / nWeight 为FALSE,/ / bItalic 为FALSE,/ / bUnderline 0,/ / cStrikeOut ANSI_CHARSET,/ /的ncharset OUT_DEFAULT_PRECIS,/ / nOutPrecision CLIP_DEFAULT_PRECIS,/ / nClipPrecision DEFAULT_QUALITY,/ / nQuality DEFAULT_PITCH | FF_SWISS,/ / nPitchAndFamily "; Arialquot")); / / lpszFacename * = PDC - GT的CFont;选择对象(AMP;字体); PDC - GT; SetBkColor(GetSysColor(COLOR_BTNFACE)); PDC - GT的TextOut(rect.left sizeTitleOffset.cx; rect.top sizeTitleOffset.cy,m_strTitle); CSIZE SZ = PDC - GT; GetTextExtent(m_strTitle); / /绘制对接夹子 CRECT rectGrip1(rect.left sz.cx * sizeTitleOffset.cx,7,rect.right - 10 7 3 2); Draw3dRect(rectGrip1 RGB(255,255,255),PDC - GT; &# 160; RGB(128,128,128));&# 160; CRECT rectGrip2(rect.left sz.cx 2 * sizeTitleOffset.cx,11,rect.right - 10,11月3日); PDC - GT; Draw3dRect(rectGrip2,RGB(255,255,255),RGB(128,128,128));}
与酒吧有一个小问题:如果你反复双击栏停靠和移除它,它逐渐滑下缘查看!很容易搬回手工,但它的刺激性,如果有人知道如何解决它,请不要让我知道。
这就是它!这不是火箭科学,但它可能是有用的的。

回答

评论会员:Y 时间:2