我最近遇到一个 比较难缠的问题?就是我自定义了一个 类 ,继承于 CDialogBar, 但是在创建的时候 指定为 底部停靠,if(!m_SentDlg.Create(this,IDD_SEND,CBRS_BOTTOM|CBRS_TOOLTIPS|CBRS_FLYBY,IDD_SEND))
{
CString str;
str="DialogBar Create failed!";
MessageBox(str);
return FALSE;
}
//m_wndStatusBar.ShowWindow(SW_HIDE);
ShowControlBar(&m_SentDlg,TRUE,FALSE);
m_SentDlg.EnableDocking(CBRS_ALIGN_BOTTOM);我重载了 CalcDynamicLayout(int nLength,DWORD dwMode ) 函数
问题是只能调整对话条的大小,但是无法调整停靠位置?
怎么运行后 对话条停靠在了 状态栏的底部?
为仕么不再状态栏的上面?
我在网上找了很多资料,还是没找到理想的答案?
望高手解答?
{
CString str;
str="DialogBar Create failed!";
MessageBox(str);
return FALSE;
}
//m_wndStatusBar.ShowWindow(SW_HIDE);
ShowControlBar(&m_SentDlg,TRUE,FALSE);
m_SentDlg.EnableDocking(CBRS_ALIGN_BOTTOM);我重载了 CalcDynamicLayout(int nLength,DWORD dwMode ) 函数
问题是只能调整对话条的大小,但是无法调整停靠位置?
怎么运行后 对话条停靠在了 状态栏的底部?
为仕么不再状态栏的上面?
我在网上找了很多资料,还是没找到理想的答案?
望高手解答?
// TODO: Add a menu item that will toggle the visibility of the
// dialog bar named "My Dialog Bar":
// 1. In ResourceView, open the menu resource that is used by
// the CMainFrame class
// 2. Select the View submenu
// 3. Double-click on the blank item at the bottom of the submenu
// 4. Assign the new item an ID: CG_ID_VIEW_MYDIALOGBAR
// 5. Assign the item a Caption: My Dialog Bar // TODO: Change the value of CG_ID_VIEW_MYDIALOGBAR to an appropriate value:
// 1. Open the file resource.h
// CG: The following block was inserted by the 'Dialog Bar' component
{
// Initialize dialog bar m_wndMyDialogBar
if (!m_wndMyDialogBar.Create(this, CG_IDD_MYDIALOGBAR,
CBRS_BOTTOM | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE,
CG_ID_VIEW_MYDIALOGBAR))
{
TRACE0("Failed to create dialog bar m_wndMyDialogBar\n");
return -1; // fail to create
} m_wndMyDialogBar.EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndMyDialogBar); }
调用CMainFramed 的 EnableDocking(CBRS_ANY); 就不报错了!问题是,我现在停靠在底部! CDialogBar 还是停靠在 状态栏的 底部! 百思不得其解啊!!!!!我的代码!BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
if(NULL==m_SentDlg.m_hWnd)
{
if(!m_SentDlg.Create (this,IDD_SEND,CBRS_BOTTOM|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC,IDD_SEND))
{
CString str;
str="DialogBar Create failed!";
MessageBox(str);
return FALSE;
}
//m_wndStatusBar.ShowWindow(SW_HIDE);
ShowControlBar(&m_SentDlg,TRUE,FALSE); m_SentDlg.EnableDocking(CBRS_ALIGN_BOTTOM|CBRS_ALIGN_TOP)
CRect m_Rc2;
m_SentDlg.GetClientRect(&m_Rc2);
m_SentDlg.ClientToScreen(&m_Rc2);
m_Rc2.bottom=m_Rc2.bottom-20; // 为的是把状态栏的高度减掉!
if(m_SentDlg.m_hWnd!=NULL)
{
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_SentDlg,AFX_IDW_DOCKBAR_BOTTOM,&m_Rc2);
RecalcLayout();
}
return CFrameWnd::OnCreateClient(lpcs, pContext);
}在自定义CDialogBar 类中 用 Resize () 函数修改 自身的大小和位置!CRect CSentDlg::Resize(CPoint CurPot)
{
CRect WndRc;
if(m_bResize || m_bAlready)
{
CPoint t_CurPnt;
::GetCursorPos(&t_CurPnt);
ScreenToClient(&t_CurPnt);
if(m_bWndInit)
{
m_cySentDlg=240;
}
else
{
if(t_CurPnt.y>0)
m_cySentDlg=m_cySentDlg-t_CurPnt.y;
else
m_cySentDlg=m_cySentDlg-t_CurPnt.y;
}
CRect t_ClientRc;
GetClientRect(&t_ClientRc);
ClientToScreen(&t_ClientRc);
t_ClientRc.top=t_ClientRc.bottom-m_cySentDlg;
CRect t_FrmRc; GetDockingFrame()->GetClientRect(&t_FrmRc);
if(t_ClientRc.Height()<120)
{
t_ClientRc.top=t_ClientRc.bottom-120;
m_cySentDlg=t_ClientRc.Height();
}
if(t_ClientRc.Height()>300)
{
t_ClientRc.top=t_ClientRc.bottom-300;
m_cySentDlg=t_ClientRc.Height();
}
int bot=t_ClientRc.bottom;
t_ClientRc.top-=17;
t_ClientRc.bottom=bot-17;
GetDockingFrame()->ShowControlBar(this,FALSE,FALSE);
m_cySentDlg=t_ClientRc.Height();
//MoveWindow(&t_ClientRc);
GetDockingFrame()->DockControlBar(this,AFX_IDW_DOCKBAR_BOTTOM,t_ClientRc);
GetDockingFrame()->RecalcLayout();
//SetWindowPos(GetDockingFrame(),t_ClientRc.left,t_ClientRc.top-17,
//t_ClientRc.Width(),t_ClientRc.Height(),SWP_SHOWWINDOW);
GetDockingFrame()->ShowControlBar(this,TRUE,FALSE);
m_bWndInit=FALSE;
m_bResize=FALSE;
}
return WndRc;
}重载了 CalcDynamicLayout()CSize CSentDlg::CalcDynamicLayout(int nLength,DWORD dwMode)
{
CRect t_FrmRc;
CSize p_Client;
GetDockingFrame()->GetClientRect(&t_FrmRc);
if(m_bAlready)
{ if(m_bWndInit)
{
GetClientRect(&m_VirClientRc);
//SetBarStyle(CBRS_ALIGN_BOTTOM);
Resize(m_CurPoint);
}
(),t_FrmRc.right,t_FrmRc.bottom);
}
p_Client.cx=t_FrmRc.Width();
p_Client.cy=m_cySentDlg;
return p_Client;
}
其中参数dwDockStye能决定如何停靠.
CBRS_BOTTOM | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE,
CG_ID_VIEW_MYDIALOGBAR))
{
TRACE0("Failed to create dialog bar m_wndMyDialogBar\n");
return -1; // fail to create
} m_wndMyDialogBar.EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndMyDialogBar);
Quote]啊 ,不是吧,我的怎么不行啊!就是初始化的时候,程序刚启动 , 对话条 就跑到状态栏的底下了!就是程序运行后,我能手动 把状态栏拖到最底下 ,现实就正常了 ,关键是初始化的时候 不行啊?
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("未能创建状态栏\n");
return -1; // 未能创建
}
这个函数下面加了3行代码 如下:m_wndStatusBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndStatusBar,AFX_IDW_DOCKBAR_BOTTOM); // 注意是这句最关键,/// 这个参数 AFX_IDW_DOCKBAR_BOTTOM 停靠在框架的底部!而不是CBRS_ALIGN_BOTTOM
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("未能创建状态栏\n");
return -1; // 未能创建
}
这个函数下面加了3行代码 如下:m_wndStatusBar.EnableDocking(CBRS_ALIGN_ANY); //DEBUG 模式下 程序运行到这一句报错?
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndStatusBar,AFX_IDW_DOCKBAR_BOTTOM);
// 程序运行到这一句报错?