Chinaunix首页 | 论坛 | 博客
  • 博客访问: 455136
  • 博文数量: 724
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(724)

文章存档

2011年(1)

2008年(723)

我的朋友

分类:

2008-10-13 17:22:49

conry:第一个问题解决比较麻烦,mfc的机制就是这样的,在CWnd::RepositionBars函数通过枚举所有的子窗口处理停靠。所以创建的循序不同,停靠的位置也不一样。要解决这个问题的话估计要在frame类里重写RepositionBars函数,但是RepositionBars不是虚函数,所以相关调用的函数也要重写
(发表于2006-9-26 9:47:00)

cutejade:在vc.8中编译出现下面错误,不知道是什么问题?
正在编译...
AutoHideBar.cpp
c:\documents and settings\acer\桌面\vcdotnet\vcdotnetmdi\src\autohidebar.cpp(99) : error C2440: “static_cast”: 无法从“UINT (__thiscall CAHFloatWnd::* )(CPoint)”转换为“LRESULT (__thiscall CWnd::* )(CPoint)”
        从基类型到派生类型的强制转换需要 dynamic_cast 或 static_cast
DockPageBar.cpp
c:\documents and settings\acer\桌面\vcdotnet\vcdotnetmdi\src\dockpagebar.cpp(322) : error C2440: “static_cast”: 无法从“UINT (__thiscall CDockPageBar::* )(CPoint)”转换为“LRESULT (__thiscall CWnd::* )(CPoint)”
        从基类型到派生类型的强制转换需要 dynamic_cast 或 static_cast
sizecbar.cpp
c:\documents and settings\acer\桌面\vcdotnet\vcdotnetmdi\src\sizecbar.cpp(109) : error C2440: “static_cast”: 无法从“UINT (__thiscall CSizingControlBar::* )(CPoint)”转换为“LRESULT (__thiscall CWnd::* )(CPoint)”
        从基类型到派生类型的强制转换需要 dynamic_cast 或 static_cast
(发表于2006-9-26 12:27:00)

conry:前面我写的有点问题,最好还是不要重写 CWnd::RepositionBars,我试了一下,在
void CDockPageBarContext::EndDrag()里面添加一些代码可以实现,操,评论系统真是差劲,一下还写不完,下面再贴代码
(发表于2006-9-26 15:01:00)

conry:void CDockPageBarContext::EndDrag()
{
。。。
UINT uID = _AfxGetDlgCtrlID(pDockBar->m_hWnd);
if (uID >= AFX_IDW_DOCKBAR_TOP &&
uID <= AFX_IDW_DOCKBAR_BOTTOM)
{
m_uMRUDockID = uID;
m_rectMRUDockPos = rect;
pDockBar->ScreenToClient(&m_rectMRUDockPos);

////////////////add begin////////////////////////////////////////
CWnd *pWnd = NULL;
CRect clientRect;
pFrameWnd->GetClientRect(&clientRect);
(发表于2006-9-26 15:07:00)

conry:switch(uID){
case AFX_IDW_DOCKBAR_TOP:
case AFX_IDW_DOCKBAR_BOTTOM:
pWnd= pFrameWnd->GetDlgItem(AFX_IDW_DOCKBAR_LEFT);
if(m_rectMRUDockPos.Width()>clientRect.Width())
::SetWindowPos(pWnd->m_hWnd,pDockBar->m_hWnd,m_rectMRUDockPos.left,m_rectMRUDockPos.top,m_rectMRUDockPos.Width(),m_rectMRUDockPos.Height(),SWP_SHOWWINDOW); else
::SetWindowPos(pDockBar->m_hWnd,pWnd->m_hWnd,m_rectMRUDockPos.left,m_rectMRUDockPos.top,m_rectMRUDockPos.Width(),m_rectMRUDockPos.Height(),SWP_SHOWWINDOW);
break;
case AFX_IDW_DOCKBAR_LEFT: case AFX_IDW_DOCKBAR_RIGHT:
pWnd= pFrameWnd->GetDlgItem(AFX_IDW_DOCKBAR_BOTTOM);
if(m_rectMRUDockPos.Height()>clientRect.Height())
::SetWindowPos(pWnd->m_hWnd,pDockBar->m_hWnd,m_rectMRUDockPos.left,m_rectMRUDockPos.top,m_rectMRUDockPos.Width(),m_rectMRUDockPos.Height(),SWP_SHOWWINDOW);
else
::SetWindowPos(pDockBar->m_hWnd,pWnd->m_hWnd,m_rectMRUDockPos.left,m_rectMRUDockPos.top,m_rectMRUDockPos.Width(),m_rectMRUDockPos.Height(),SWP_SHOWWINDOW);
break;
}
(发表于2006-9-26 15:18:00)

conry:前面我写的实现不太完整,没有考虑到所有可能情况,只是提供一个实现的方法
(发表于2006-9-26 15:59:00)

flyling:可以吗?我试了一下,怎么不行啊,大虾

(发表于2006-9-28 12:36:00)

changxinsong:cutejade:在vc.8中编译出现下面错误,不知道是什么问题?
可以将UINT 改为LRESULT即可
或者把有错误的代码屏蔽掉重新写过
(发表于2006-10-28 13:18:00)

redcloth:代码已更新,主要是在精确停泊方面的改进,现在水平和垂直方向都可以优先停泊。
下载更新:

(发表于2006-11-14 22:35:00)

wlggdm:把里面的UINT 改为LRESULT
还有变量i的前面加int就行了
(发表于2006-12-13 18:35:00)

wlggdm:pos前加POSITION
(发表于2006-12-13 18:45:00)

wlggdm:程序是有了,不知有没有相关设计文档
(发表于2006-12-13 18:45:00)

wlggdm:不知道这里有没有用过BCG的,感觉这个虽然实现了停泊功能,但还有一些不足,我觉得还是与使用MFC的原始类有关系,像BCG一样改写后,功能更好扩充一些
(发表于2006-12-13 18:49:00)

wlggdm:如果那位大虾把BCGControlBar中的停靠分离出来的话就太好了,不,是太强了

(发表于2006-12-13 19:06:00)

redcloth:Re: wlggdm
确实,停泊功能的不足,确实与使用MFC的原始类有关系,
不过这样做,是以最小的代价,实现VC2003界面。
最重要的是,它是基于MFC实现,是free的,可以灵活的用在任何MFC windows项目中,如果对MFC的原始类熟悉的话,可以很容易增加新功能。
(发表于2006-12-19 9:20:00)

sunlair:在类CSizingControlBar 有 GlobalSaveState可以用了保存ControlBar的状态,所以CDockPageBar最好也能重写这个方法以支持ControlBar状态的保存
(发表于2006-12-20 10:51:00)

wlggdm:我今天偶然见看debug和release的大小,发现release版本比debug版本大一倍左右,不知怎么回事?
(发表于2006-12-21 19:19:00)

zjroland:如何才能设置为一开始进入程序 Dock就是隐藏的呢?
花了一天都搞不定。
(发表于2006-12-27 9:16:00)

flyling:垂直方向都可以优先停泊是怎么实现的啊,能告诉一下吗? 谢谢
(发表于2007-1-17 12:13:00)

jackdo:如果能把AutoHideBar DockPageBar sizecbar这几个文件都注释了,,该多好,,看了半天还是糊糊涂涂的
(发表于2007-3-6 14:32:00)

flyling:写得确实不错,很好用,唯一美中不足的就是停泊在左边的时候,会顶到工具栏和菜单栏上面去(除非把工具栏设置成不可浮动的),不知道如何解决这个问题。
(发表于2007-7-17 17:33:00)

freelsen:对于水平优先充满的问题,这里是一个主要原因:
CWnd::RepositionBars(...)
{
...
for (HWND hWndChild = ::GetTopWindow(m_hWnd);hWndChild != NULL;hWndChild = ::GetNextWindow(hWndChild, GW_HWNDNEXT))
{
...
}
...
}
这个获取子窗口的顺序决定了CFrameWnd中隐藏的四个CDockBar停靠优先的顺序。
知道了这点,就可以在这里做些小改动,目前我已试验完毕,证实有效。
不过你可以看到在VC2005里拖动时会出现几个定位按钮,从而灵活实现更多停靠方式。如果要做到这些,必须要监视用户拖动的位置,因而需要更多改动,目前还没有仔细研究。不过一切都是有原因的。
(发表于2007-7-24 22:21:00)

..........................................................................
--------------------next---------------------

阅读(263) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~