雅典奥运会现场直播:那东西叫做DialogBar,应该这样用。。。

来源:百度文库 编辑:九乡新闻网 时间:2024/04/27 23:49:02
下载频道介绍三:用户权限及积分规则详解          博客频道8月新增功能介绍           bShare分享,迅速提升10倍流量

那东西叫做DialogBar,应该这样用。。。

分类: 学海无涯 2007-04-02 17:48 637人阅读 评论(0) 收藏 举报

希望可以做出一个类似VC6.0左边包含有Files/Classes/Resources VIew这样的界面,可是,甚至连这样的界面叫什么名字都不知道。论坛上人说,那是DialogBar,里边的Views是Tab标签。

于是上网上搜源码,推荐的事CodeProject,还好是在实验室,可以上国际网,要是在宿舍的话就郁闷死了,找代理可不是一件轻松的事。在里边搜DailogBar和Tab,好些结果,不仅有说明,有源码,甚至还都含有工程,6.0写的,实验室的机器里面有2005也有6.0,不怕,都能打开,呵呵。

下载下来好多,都不简单,至少我这么认为的,于是改掉自己QQ签名档——阅读源码中。找到一个比较简单的,现学现用的尝试自己做。

做两个对话框,将边框设置为None,Style则设置为Child——一定要设置为Child,最开始的时候没有这样设置,采用了默认的Pop模式,浪费好多时间。

1. Create any kind of CWnd derived class . That will be your TOP level Window (could be a CDialog / CDialogBar / CButton anything...)

Lets say CDialogBarExt ....derived from CDialogBar.

2. Create a CWnd derived Class that will contain the actual sliding dialog.

Lets say CDlgContainer ....derived from CWnd

3. Create a member variable for CDialogBarExt of type CDlgContainer.

4. Create a CDialog derived class .

Lets say CInnerDlg (this is the actual sliding dialog !!!)====〉我并没有做的那么复杂,成为一个可以拖动的InnerDlg,而是最简单的一个对话框,希望可以相应其中我放置的一个Button的单击。

5. Create a member variable of type CInnerDlg for CDlgContainer....

总的来说他们三个的关系是:Ext为最外层,在Ext中Create一个Container,将InnerDlg放在这个Container的一定位置。也就是这样一个关系:DialogBarExt->DialogContainer->InnerDialog,从他们的包含关系中理顺了半天,终于知道最好是从后往前添加class

放上代码吧:

InnerDlg.h

#pragma once


// CInnerDlg dialog

class CInnerDlg : public CDialog
...{
    DECLARE_DYNAMIC(CInnerDlg)

public:
    CInnerDlg(CWnd* pParent = NULL);   // standard constructor
    virtual ~CInnerDlg();

// Dialog Data
    enum ...{ IDD = IDD_DIALOG1 };

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    virtual BOOL OnInitDialog();

    DECLARE_MESSAGE_MAP()
    int posY;
public:
    afx_msg void OnBnClickedButton1();
};.cpp// InnerDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Rebar.h"
#include "InnerDlg.h"
#include "RebarView.h"
#include "MainFrm.h"
#include "MyDlg.h"


// CInnerDlg dialog

IMPLEMENT_DYNAMIC(CInnerDlg, CDialog)

CInnerDlg::CInnerDlg(CWnd* pParent /**//*=NULL*/)
    : CDialog(CInnerDlg::IDD, pParent)
    , posY(0)
...{

}

CInnerDlg::~CInnerDlg()
...{
}

void CInnerDlg::DoDataExchange(CDataExchange* pDX)
...{
    CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CInnerDlg, CDialog)
    ON_BN_CLICKED(IDC_BUTTON1, &CInnerDlg::OnBnClickedButton1)
END_MESSAGE_MAP()


// CInnerDlg message handlers

BOOL CInnerDlg::OnInitDialog()
...{
    CDialog::OnInitDialog();

    // TODO:  Add extra initialization here
    posY = 1;
    CRect rcWnd;
    GetWindowRect(&rcWnd);

    SetWindowPos(NULL, 9, posY<<3, rcWnd.Width(), rcWnd.Height(),SWP_SHOWWINDOW|SWP_NOSIZE);

    return TRUE;  // return TRUE unless you set the focus to a control
    // EXCEPTION: OCX Property Pages should return FALSE
}

void CInnerDlg::OnBnClickedButton1()
...{
    // TODO: Add your control notification handler code here
    CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
    CRebarView* pView = (CRebarView*)(pFrame->GetActiveView());
    CDC* pDC = pView->GetDC();
    pDC->MoveTo(100,100);
    pDC->LineTo(200,300);
    ReleaseDC(pDC);
    CMyDlg dlg;
    dlg.DoModal();
    AfxMessageBox(_T("asdf"));
}DlgContainer.h#pragma once

#include "InnerDlg.h"
// CDlgContainer

class CDlgContainer : public CWnd
...{
    DECLARE_DYNAMIC(CDlgContainer)

public:
    CDlgContainer();
    virtual ~CDlgContainer();
public:
    CInnerDlg    m_Inner;
protected:
    DECLARE_MESSAGE_MAP()
public:
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
public:
    afx_msg void OnPaint();
};.cpp// DlgContainer.cpp : implementation file
//

#include "stdafx.h"
#include "Rebar.h"
#include "DlgContainer.h"


// CDlgContainer

IMPLEMENT_DYNAMIC(CDlgContainer, CWnd)

CDlgContainer::CDlgContainer()
...{

}

CDlgContainer::~CDlgContainer()
...{
}


BEGIN_MESSAGE_MAP(CDlgContainer, CWnd)
    ON_WM_CREATE()
    ON_WM_PAINT()
END_MESSAGE_MAP()



// CDlgContainer message handlers



int CDlgContainer::OnCreate(LPCREATESTRUCT lpCreateStruct)
...{
    if (CWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO:  Add your specialized creation code here
    m_Inner.Create(IDD_DIALOG2, this);
    m_Inner.ShowWindow(SW_NORMAL);

    return 0;
}

void CDlgContainer::OnPaint()
...{
    CPaintDC dc(this); // device context for painting
    // TODO: Add your message handler code here
    // Do not call CWnd::OnPaint() for painting messages
    CRect rect;
    CBrush brush;
    brush.CreateSolidBrush(RGB(0,0,255));

    GetClientRect(&rect);
    dc.FillRect(rect, &brush);
}DlgBarExt.h#pragma once

#include "DlgContainer.h"
// CDlgBarExt

class CDlgBarExt : public CDialogBar
...{
    DECLARE_DYNAMIC(CDlgBarExt)

public:
    CDlgBarExt();
    virtual ~CDlgBarExt();

protected:
    DECLARE_MESSAGE_MAP()
public:
    CDlgContainer m_Container;
public:
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
};.cpp// DlgBarExt.cpp : implementation file
//

#include "stdafx.h"
#include "Rebar.h"
#include "DlgBarExt.h"


// CDlgBarExt

IMPLEMENT_DYNAMIC(CDlgBarExt, CDialogBar)

CDlgBarExt::CDlgBarExt()
...{

}

CDlgBarExt::~CDlgBarExt()
...{
}


BEGIN_MESSAGE_MAP(CDlgBarExt, CDialogBar)
    ON_WM_CREATE()
END_MESSAGE_MAP()



// CDlgBarExt message handlers



int CDlgBarExt::OnCreate(LPCREATESTRUCT lpCreateStruct)
...{
    if (CDialogBar::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO:  Add your specialized creation code here
    m_Container.Create(NULL,_T(""),WS_CHILD|WS_VISIBLE|WS_BORDER,
        CRect (10,40,203,400),this,0,NULL);

    return 0;
}

这其中的CMyDlg是我之后为了测试Button的相应又添加的一个Dialog,对工程没有任何作用

在这三部完成之后,需要在MainFrame中创建DlgBarExt。

首先在MainFrm.h中加入一个成员:

#include "DlgBarExt.h"

CDlgBarExt m_SideBar;

之后在MainFrm.cpp中改写如下:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
...{
...
    m_SideBar.Create (this,IDD_DIALOG1,WS_CHILD|WS_VISIBLE|CBRS_LEFT|CBRS_GRIPPER,0);
    // TODO: Delete these three lines if you don't want the toolbar to be dockable
    m_SideBar.EnableDocking (CBRS_ALIGN_LEFT|CBRS_ALIGN_RIGHT);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_SideBar);
...
}

 

在做完如上工作之后,运行程序,可以发现在窗口的左侧出现了一个“大工具栏”,里面放置了需要的一个Dialog。最初的这个Dialog里面什么都没有。
做为实验,希望可以添加一个Button,然后点击这个Button,可以在视图区域画出一条线。
放置一个Button很顺利,之后需要添加一个响应。照例是用双机Button的方式,但是弹出的对话框显示的是需要事先对这个对话框添加一个类。照着Wizard走,添加一个类,然后双击Button可以添加响应了。完成之后没有反应。
后来知道其实不应该添加类,直接Add Event Handle即可。但是不知道应该添加到什么地方——准确的说不知道应该加在View类中还是InnerDialog中。但是不管加入到什么地方,都不起作用。步进也没有进去这个Button。
干脆再加入一个对话框,点击先前的Button时候可以弹出这个对话框(DoModal),这一次只有在将消息加入到InnerDialog中才会有作用。于是知道了这一步。之后不断试验,始终没能得到想要的效果。
得高人指点,如下写响应部分:
    CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();-------〉得到框架指针
    CRebarView* pView = (CRebarView*)(pFrame->GetActiveView());-〉得到框架中的视图的指针
    CDC* pDC = pView->GetDC();--------------------------------〉得到视图中的设备
    pDC->MoveTo(100,100);
    pDC->LineTo(200,300);
    ReleaseDC(pDC);--------------------------------------------〉释放设备
搞定!