雅典奥运会现场直播:那东西叫做DialogBar,应该这样用。。。
来源:百度文库 编辑:九乡新闻网 时间:2024/04/27 23:49:02
那东西叫做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);--------------------------------------------〉释放设备
搞定!