我需要将两个对话框停放在一个单文档窗口上(一左一右,形与VC6.0界面),但界面放大后就会出现一个空白区(图右部)。
我停靠部分的代码是: /////////////创建控制条///////////////
if (!m_wndMyBar1.Create(_T("我的控制条"), this, CSize(200,260),TRUE,123))
{
TRACE0("Failed to create mybar\n");
return -1;
}
if (!m_wndMyBar2.Create(_T("我的控制条2"), this,CSize(399,100),TRUE,123))
{
TRACE0("Failed to create mybar\n");
return -1;
}
///////////////停靠控制///////////////////
m_wndMyBar1.SetBarStyle(m_wndMyBar1.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC );
m_wndMyBar2.SetBarStyle(m_wndMyBar2.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndMyBar1.EnableDocking(CBRS_ALIGN_ANY);
m_wndMyBar2.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
DockControlBar(&m_wndMyBar1,  AFX_IDW_DOCKBAR_LEFT);
DockControlBar(&m_wndMyBar2, AFX_IDW_DOCKBAR_LEFT);我曾先后将红色代码修改为AFX_IDW_DOCKBAR_RIGHT、AFX_IDW_DOCKBAR_LEFT || AFX_IDW_DOCKBAR_RIGHT等都不能改变现状,顶多也只能把空白区移到中间去。希望哪位高手能指点一二,殷切期待。

解决方案 »

  1.   

    用MoveWindow()即可实现你所需要的。Windows的docking功能的实质就是用MoveWindow()和SetWindowPos()完成。
      

  2.   

    我的代码是实际工程中成功的,供参考//Tool 1
    if (!m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT | TBSTYLE_LIST, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_wndToolBar1.LoadToolBar(IDR_TOOLBAR1))
    {
    TRACE0("Failed to create toolbar\n");
    return -1;      // fail to create
    }
    m_wndToolBar1.SetWindowText("Main tool") ;//略其他创建过程         CRect  rc ;
    //main toolbar
    m_wndToolBar1.EnableDocking(CBRS_ALIGN_ANY); 
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar1 ,AFX_IDW_DOCKBAR_TOP); m_wndToolBar1.GetWindowRect( & rc ) ;
    rc.OffsetRect( rc.Width()-2 , 0  ) ; //select object toolbar
    m_wndToolBar3.EnableDocking(CBRS_ALIGN_ANY); // CBRS_ALIGN_TOP
    DockControlBarLeftOf(&m_wndToolBar3,&m_wndToolBar1);
    //move window toolbar
    m_wndToolBar6.EnableDocking(CBRS_ALIGN_ANY); 
    DockControlBarLeftOf(&m_wndToolBar6,&m_wndToolBar3);
             ShowControlBar(&m_wndToolBar6,TRUE , FALSE ) ;

    m_wndToolBarFont.EnableDocking(CBRS_ALIGN_ANY);
    DockControlBarLeftOf(&m_wndToolBarFont,&m_wndToolBar6);
    ShowControlBar(&m_wndToolBarFont,TRUE,FALSE);
    m_wndToolBar4.EnableDocking(CBRS_ALIGN_RIGHT);
    DockControlBar(&m_wndToolBar4 ,AFX_IDW_DOCKBAR_RIGHT);
    m_wndToolBar7.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_BOTTOM);
    DockControlBar(&m_wndToolBar7 ,AFX_IDW_DOCKBAR_BOTTOM);E , FALSE ) ; m_wndToolBar2.EnableDocking(CBRS_ALIGN_ANY); 
    EnableDocking(CBRS_ALIGN_LEFT);
    DockControlBar(&m_wndToolBar2 ,AFX_IDW_DOCKBAR_LEFT);
      

  3.   

    DockControlBar(&m_wndToolBar7 ,AFX_IDW_DOCKBAR_BOTTOM);E , FALSE ) ;有错改为DockControlBar(&m_wndToolBar7 ,AFX_IDW_DOCKBAR_BOTTOM);
      

  4.   

    请问 mousefj :
    DockControlBarLeftOf(&m_wndToolBar3,&m_wndToolBar1);
    是自定义的吧?
    能不能提供改函数代码?
      

  5.   

    我这是CJ60Lib里的CCJFrameWnd里的函数
    void CCJFrameWnd::DockControlBarLeftOf(CControlBar* Bar, CControlBar* LeftOf)
    {
    CRect rect;
    DWORD dw;
    UINT n;

    // get MFC to adjust the dimensions of all docked ToolBars
    // so that GetWindowRect will be accurate
    RecalcLayout(TRUE);

    LeftOf->GetWindowRect(&rect);
    rect.OffsetRect(1,0);
    dw=LeftOf->GetBarStyle();
    n = 0;
    n = (dw&CBRS_ALIGN_TOP)  ? AFX_IDW_DOCKBAR_TOP : n;
    n = (dw&CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM : n;
    n = (dw&CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT : n;
    n = (dw&CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT : n;

    // When we take the default parameters on rect, DockControlBar will dock
    // each Toolbar on a seperate line. By calculating a rectangle, we in effect
    // are simulating a Toolbar being dragged to that location and docked.
    DockControlBar(Bar,n,&rect);
    }
      

  6.   

    DockControlBarLeftOf是将一个ToolBar放在另一个ToolBar的左边
      

  7.   

    非常感激你能及时回复
    我也安装了这个库(CJ60Lib.lib),但是编译时说"conn't open the 'CJ60Lib.lib'"
    使用此库时是否还需要做其它工作
    请指教
      

  8.   

    将CJ60Lib.lib加到你的工程里。
    先将头文件加到工程
    #include "..\CJ60 Extension Library\include\CJLib.h"
    然后引入Lib文件
    提供两种方式:
    1  临时调试可用VC的菜单加入。
    Project->Add to Project->Files,选择CJ60Lib.lib文件
    2  在一CPP文件中如Import.cpp中加入
    #pragma comment(lib,"\\CJ60 Extension Library\\lib\\CJ60Libd.lib")
      

  9.   

    为何编译通过而在执行时出现“无法找到动态链接库CJ60Libd.dll于制定的路径”错误。
    我的操作步骤是:
    1 安装库CJ60Lib.lib
    2 将Include Lib 拷贝到工程目录下。
    3 在 中添加#include "CJ60Lib.h" 
    4 在在一CPP文件中添加#pragma comment(lib,"CJ60Libd.lib")我也采用你提供的方法(#pragma comment(lib,"\\CJ60 Extension Library\\lib\\CJ60Libd.lib"))
    但是编译时说:connot open file "\\CJ60 Extension Library\\lib\\CJ60Libd.lib"我也试过以下三种方式,但还是行不通
    一、
    在工程设置中( project settings),选择 General 标签页.选"Use MFC in a shared DLL". 
    在工程设置中( project settings),选择 Link 标签页.将条目选为 Input,加入 ../Lib 到额外的库目录中. 再将条目选为 General, 在输出(Output Name)的所有配置,编译到 ../Lib 路径,这将使可执行文件和动态链接库在同一目录下 
    选择 c/c++ 标签页. 选择条目Preprocessor,加入 ../Include 到额外的头文件目录中. 
    在你的StdAfx.h 头文件中,加入: 
    #include <CJ60Lib.h>
    二、
    在菜单中选tools-->options,在弹出的对话框中选择directioies标签,将解压缩得到的"lib","include" 的路径分别添加到"library files"和"include files",(以确保工程编译时能找到中的"include "中的头文件和"lib"中的静态链接库。)三、
    1.下载扩展库,并编译得到"cj60lib.lib","cj60lib.dll" 
    2.启动vc6,建立一个新的工程项目, 在菜单栏中选择project-settings   
    3.在弹出的对话框中选择"general"标签,在"microsoft foundation class"下拉框选择"use mfc in a shared dll"。   
    4.在弹出的对话框中选择"link"标签,在category下拉框选择"input",在"additional library path"一栏中填入"扩展界面库"(*.lib,*.dll)所在的路径。  
    在category下拉框选择"output",使你要输出的*.exe和动态链接库(第一步中得到)在同一目录下(该可执行文件执行时需要*.dll).  
    5.在弹出的对话框中选择"c/c++"标签,在category下拉框选择"preprocessor在"additional include directories"一栏中填入扩展界面库"的头文件(*.h)所在的路径.   
    6.在新项目的"stdafx.h"文件的近尾部中加入以下两行
    #define mfcx_proj
    #include"cj60lib.h"   说明:1、第一种方法通敌三种方法一样
           2、是不是问题出在这儿:在category下拉框选择"output",使你要输出的*.exe和动态库 (第一 步中得到)在同一目录下(该可执行文件执行时需要*.dll). 请各位帮我看看,再指导指导!
      

  10.   

    问题已经解决
    需要先编译一下即将.dll 拷到system32下
    谢谢各位参与