ReBar
I want to add a rebar to the main window of a program based on dialog,I tried ,but failed!
Please write the detail code step by step(in which member function),I think it won't too be long.
50 for the first gentleman who give me the answer,30 for the next ,and
20 for the third.Of course if there is only one who solve it,100 to him.
No scores for upman.
Can you do it?
问题点数:100、回复次数:5Top
1 楼highersong(对月长啸)回复于 2003-08-02 18:47:34 得分 50
首先在你的Dialog类中定义如下成员:
CToolBar m_wndToolBar;
CReBar m_wndReBar;
CComboBoxEx m_wndAddress;
CAnimateCtrl m_wndAnimate;
在OnInitDialog中创建工具条,整个函数被改写为:
BOOL CRebarDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CImageList img;
CString str;
if (!m_wndReBar.Create(this))
{
TRACE0("Failed to create rebar\n");
return -1; // fail to create
}
if (!m_wndToolBar.CreateEx(this))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
// set up toolbar properties
m_wndToolBar.GetToolBarCtrl().SetButtonWidth(50, 150);
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
img.Create(IDB_HOTTOOLBAR, 22, 0, RGB(255, 0, 255));
m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);
img.Detach();
img.Create(IDB_COLDTOOLBAR, 22, 0, RGB(255, 0, 255));
m_wndToolBar.GetToolBarCtrl().SetImageList(&img);
img.Detach();
m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT);
m_wndToolBar.SetButtons(NULL, 9);//为toolbar分配9个item的空间
// set up each toolbar button
m_wndToolBar.SetButtonInfo(0, ID_GO_BACK, TBSTYLE_BUTTON, 0);
str="Back";
m_wndToolBar.SetButtonText(0, str);
m_wndToolBar.SetButtonInfo(1, ID_GO_FORWARD, TBSTYLE_BUTTON, 1);
str="Forward";
m_wndToolBar.SetButtonText(1, str);
m_wndToolBar.SetButtonInfo(2, ID_VIEW_STOP, TBSTYLE_BUTTON, 2);
str="Stop";
m_wndToolBar.SetButtonText(2, str);
m_wndToolBar.SetButtonInfo(3, ID_VIEW_REFRESH, TBSTYLE_BUTTON, 3);
str="Refresh";
m_wndToolBar.SetButtonText(3, str);
m_wndToolBar.SetButtonInfo(4, ID_GO_START_PAGE, TBSTYLE_BUTTON, 4);
str="Home";
m_wndToolBar.SetButtonText(4, str);
m_wndToolBar.SetButtonInfo(5, ID_GO_SEARCH_THE_WEB, TBSTYLE_BUTTON, 5);
str="Search";
m_wndToolBar.SetButtonText(5, str);
m_wndToolBar.SetButtonInfo(6, ID_FAVORITES_DROPDOWN, TBSTYLE_BUTTON | TBSTYLE_DROPDOWN, 6);
str="Favorite";
m_wndToolBar.SetButtonText(6, str);
m_wndToolBar.SetButtonInfo(7, ID_FILE_PRINT, TBSTYLE_BUTTON, 7);
str="Print";
m_wndToolBar.SetButtonText(7, str);
m_wndToolBar.SetButtonInfo(8, ID_FONT_DROPDOWN, TBSTYLE_BUTTON | TBSTYLE_DROPDOWN, 8);
str="Font";
m_wndToolBar.SetButtonText(8, str);
CRect rectToolBar;
// set up toolbar button sizes
m_wndToolBar.GetItemRect(0, &rectToolBar);
m_wndToolBar.SetSizes(rectToolBar.Size(), CSize(30,20));
// create a combo box for the address bar
if (!m_wndAddress.Create(CBS_DROPDOWN | WS_CHILD, CRect(0, 0, 200, 120), this, AFX_IDW_TOOLBAR + 1))
{
TRACE0("Failed to create combobox\n");
return -1; // fail to create
}
// create the animation control
m_wndAnimate.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 10, 10), this, AFX_IDW_TOOLBAR + 2);
m_wndAnimate.Open(IDR_MFCAVI);
m_wndAnimate.Play(0,-1,-1);
// add the toolbar, animation, and address bar to the rebar
m_wndReBar.AddBar(&m_wndToolBar);
m_wndReBar.AddBar(&m_wndAnimate, NULL, NULL, RBBS_FIXEDSIZE | RBBS_FIXEDBMP);
str.LoadString(IDS_ADDRESS);
m_wndReBar.AddBar(&m_wndAddress, str, NULL, RBBS_FIXEDBMP | RBBS_BREAK);
// set up min/max sizes and ideal sizes for pieces of the rebar
REBARBANDINFO rbbi;
rbbi.cbSize = sizeof(rbbi);
rbbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE | RBBIM_SIZE;
rbbi.cxMinChild = rectToolBar.Width();
rbbi.cyMinChild = rectToolBar.Height();
rbbi.cx = rbbi.cxIdeal = rectToolBar.Width() * 9;
m_wndReBar.GetReBarCtrl().SetBandInfo(0, &rbbi);
rbbi.cxMinChild = 0;
CRect rectAddress;
rbbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE;
m_wndAddress.GetEditCtrl()->GetWindowRect(&rectAddress);
rbbi.cyMinChild = rectAddress.Height() + 10;
rbbi.cxIdeal = 200;
m_wndReBar.GetReBarCtrl().SetBandInfo(2, &rbbi);
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
以上代码是我根据MSDN的一个例子(MFCIE: Demonstrates the MFC CHtmlView and
CReBar Classes,你可能看过这个例子)改写的,你可以打开这个例子把里面的资源
copy到自己的工程中去。如果想要整个源代码,给出信箱我给你发过去。
的程序衷曲
Top
2 楼tryber(Go with the CWnd)回复于 2003-08-02 19:21:59 得分 0
I think it is impossible! Rebar never married Dialog Window, She love FrameWnd so much.Top
3 楼highersong(对月长啸)回复于 2003-08-04 01:12:44 得分 0
to tryber(cyber):你没法实现并不等于不能实现!!!Top
4 楼bager(柏哥)回复于 2003-08-04 09:27:18 得分 50
示例程序在对话框中加入Rebar,Rebar内部添加两个Dialogbar。
1、声明如下,其中CMyDialogBar为继承自CDialog类的Dialogbar,资源ID为IDD_DIALOGBAR,声明时,不要忘记#include "MyDialogBar.h"。
CReBar m_wndReBar;
CMyDialogBar m_wndDialogBar1;
CMyDialogBar m_wndDialogBar2;
2、修改CDlgWithRebarDlg::OnInitDialog(),添加部分如下所示:
BOOL CDlgWithRebarDlg::OnInitDialog()
{
//...
if (!m_wndReBar.Create(this))
{
TRACE0("Failed to create rebar\n");
}
if (!m_wndDialogBar1.Create(IDD_DIALOGBAR,this))
{
TRACE0("Failed to create dialogbar\n");
}
if (!m_wndDialogBar2.Create(IDD_DIALOGBAR,this))
{
TRACE0("Failed to create dialogbar\n");
}
m_wndReBar.AddBar(&m_wndDialogBar1);
m_wndReBar.AddBar(&m_wndDialogBar2);
//这句很重要
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
//...
return TRUE;
}Top
5 楼newvagabond(流浪者)回复于 2003-08-04 10:22:19 得分 0
Thanks ,gentlemen!Top




