|
主要内容在1.1.1中调试,在1.1.5上回归过。
1. GuiToolKits使用... 2
1.1. 准备.... 2
1.2. 使用.... 2
1.2.1. CGuiControlBar 2
1.2.1.1. CGuiTabWnd & CGuiWorkTab使用... 3
1.2.1.2. CGUIControlBar中的CGuiTabWnd使用... 4
1.2.1.3. CGuiContainer和CGuiMiniTool以及Tree的使用... 6
1.2.1.4. CCUIControlBar中的CGuiTabWnd和container一起使用... 6
1.2.2. CGuiMDIFrame. 7
1.2.2.1. CGuiMDIFrame的动态菜单... 7
1.2.2.2. CGuiMDIFrame的和ToolBar, statusbar使用... 7
1.2.2.3. 其它... 9
1.2.2.4. 例程... 9
2. 联系作者... 11
1. GuiToolKits使用
ControlBar就是一个dockable的窗口。
For more information on CControlBar, see the article “Control Bar Topics” in Visual C++ Programmer's Guide and Technical Note 31, Control Bars.
CStatusBar, CToolBar, CDialogBar, CReBar, and COleResizeBar.
1.1. 准备
从网上下载GuiToolKits包源码。然后编译。总是会有些问题,其中最恶心的有两点:
1, 头文件包含的时候,有时候在Cpp目录下,有时候有在header目录下。这需要摆平;
2, 在project->setting中,输出dll的目录需要重新设置,还有lib的目录设置也在setting中重新设定,寻找位置的时候要仔细,在setting的project option中
3, 在Guilib1.5中,注意,不要用Unicode的configure。否则,会有很多编译错误,都是类型转换的错误。
4, 使用Guilib1.5的时候,要把guilib.h文件包含进去。
5, 要能够成功使用guilib1.5,还有一个重要参数:就是界面的类型。我通过修改GUISTYLE_XP的值为08002,发现效果很好。就是1和5不好。这个值可以放在stdafx.h中定义。
#define GUISTYLE_XP 0x08002
#define GUISTYLE_2003 0x08001
#define GUISTYLE_2003MENUBTN 0x08021
#define WIN_NT 0x08003
#define WIN_2000 0x08004
#define WIN_XP 0x08005
#define WIN_95 0x08006
#define WIN_98 0x08007
#define WIN_32 0x08008
#define WIN_ME 0x08009
#define WIN_95OSR2 0x0800A
#define WIN_98_SE 0x0800B
编译成功后,获得guilib.dll和guilib.lib两个文件。其中.lib是编译的时候用,而.dll是真正执行的时候用。还有一堆的.h文件,在使用guitoolkits的时候,需要包含进去。
1.2. 使用
u 把header目录下的.h文件都拷贝到工程目录下。
u 把guilib.lib和guilib.dll拷贝到工程目录下。
u Project->Setting->Link目录下添加上guilib.lib
u 把多文档视的主框架修改为:
#include "GuiMDIFrame.h"
class CMainFrame : public CGuiMDIFrame
u 想使用GUI库中的什么东西,就把相应的头文件包含进去。
1.2.1. CGuiControlBar
参考:例程Gui_DevStudio。
总体发现:CGuiControlBar中可以放下一个CGuiTabWnd。每个Tab又可以是放一个CGuiContainer。然后,CGuiContainer可以再包含一个菜单(CGuiMiniTool)和一个树/list视类
另外一种组合是:CGuiControlBar中可以直接放CGuiContainer。然后CGuiContainer中又可以再放一个工具条和其它视类。
还有一种组合是:CGuiControlBar中可以放CGuiTabWnd。然后CGuiTabWnd中可以直接放其他视类,如CEdit等。
1.2.1.1. CGuiTabWnd & CGuiWorkTab使用
表面上看,两者间区别就是CGuiWorkTab多了一个滚动条。
我这里只会和CGUIControlBar结合使用。
1.2.1.2. CGUIControlBar中的CGuiTabWnd使用
派生一个类,包含想要的
class CGuiOutPut : public CGuiControlBar
{
friend class CMainFrame;
protected:
CGuiTabWnd m_TabSolExplorer;
CListCtrl m_ListTask;
CEdit m_EditOutput;
CEdit m_EditFind;
CListCtrl m_Search;
public:
CGuiOutPut(void);
virtual ~CGuiOutPut(void);
DECLARE_MESSAGE_MAP()
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
};
在OnCreate函数中,创建这个controlbar的内容:
int CGuiOutPut::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CGuiControlBar::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_TabSolExplorer.Create(WS_VISIBLE|WS_CHILD,CRect(0,0,0,0),this,0x9999))
return -1;
// 最后一个数字:0x9999只是一个ID,没有特殊含义。
const DWORD dwStyle =LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;
if (!m_ListTask.Create(dwStyle,CRect(0,0,0,0), &m_TabSolExplorer, 1))
return -1;
if (!m_Search.Create(dwStyle,CRect(0,0,0,0), &m_TabSolExplorer, 2))
return -1;
if (!m_EditOutput.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0), &m_TabSolExplorer, 2))
return -1;
if (!m_EditFind.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0), &m_TabSolExplorer, 2))
return -1;
m_TabSolExplorer.SetImageList(IDB_DBPROJECTS, 16,8, RGB (255, 0, 0));
m_TabSolExplorer.Addtab(&m_ListTask,"Task List",6);
m_TabSolExplorer.Addtab(&m_EditOutput,"Output",7);
m_TabSolExplorer.Addtab(&m_EditFind,"Find Results 1",8);
m_TabSolExplorer.Addtab(&m_Search,"Search Results",5);
return 0;
}
CCuiControlBar在主框架中的显示和隐藏可以通过CGuiMDIFrame的ShowHideBar。
1.2.1.3. CGuiContainer和CGuiMiniTool以及Tree的使用
CGuiContainer的定义是:class GUILIBDLLEXPORT CGuiContainer : public CWnd
CGuiMiniTool又涉及到了CGuiToolButton。
首先,CGuiControlBar在OnCreate函数中创建好CGuiTabWnd。然后调用CreatContExplorer()来创建一个CGuiContainer。
一个CGuiContainer可以有如下要素,创建的是CGuiMiniTool:
m_ctSolution.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),&m_TabSolExplorer,124))
m_ctSolution.AddComponen(&m_miSolution);
m_miSolution.AlingButtons(CGuiMiniTool::ALIGN_LEFT);
m_miSolution.SetImageList(IDB_DBPROJECTS, 16,22, RGB (255, 0, 0));
m_miSolution.AddButton(21,ID_PROPERTIES,NULL,_T(""),"properties");
m_miSolution.AutoSize(FALSE);
m_miSolution.SetColor(GuiDrawLayer::GetRGBColorXP());
有如下步骤:CGuiContainer首先AddComponen,然后的活就交给container中的东西CGuiMiniTool* m_miniTool,去AlingButtons、SetImageList、AddButton(可以添加多个)、AutoSize、SetColor。现在有些理解CGuiMiniTool了,其实就是相当于一个小工具条。所以从CStatic派生,却又具有很多功能(参考其头文件)
到这里,发现CGuiContainer其实就是个空架子。Gui_DevStudio例程中还添加了一个树对象,是用如下方法添加到CGuiContainer中的:
m_TreeSolExplorer=(CTreeCtrl* )m_ctSolution.AddComponen(RUNTIME_CLASS(CTreeCtrl),3, TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS );
用AddComponent函数可以添加CGuiContainer中支持的几种类型,可以通过查看代码来发现。当然,tree和list是支持的。
1.2.1.4. CCUIControlBar中的CGuiTabWnd和container一起使用
CGuiControlBar中可以放下一个CGuiTabWnd。每个Tab又可以是放一个CGuiContainer。然后,CGuiContainer可以再包含一个菜单(CGuiMiniTool)和一个树/list视类
1.2.2. CGuiMDIFrame
1.2.2.1. CGuiMDIFrame的动态菜单
CMenuBar,CNewMenu,CCoolManager等几个GuiTool的内部类。但是使用的时候我们不用直接操作它们。为了实现如下图的菜单和工具条,我们只需要如下行事:
u 取代默认的菜单条
用下面的语句替换默认文档视结构中的菜单语句。当然,放置dock相关的语句要和ToolBar,ControlBar一起考虑,不冲突就可以。具体方法参考例程Gui_devstudio。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
InitMenu(IDR_MAINFRAME);
......
EnableDocking(CBRS_ALIGN_ANY);
m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndMenuBar);
}
u 每个文档模板不同的菜单?
不用在特别进行什么处理。在App的init中为每个文档模板指定所用的菜单条就可以。框架会自动加载合适的菜单条。
u 定制菜单项目的图标
原理很简单:把菜单ID设置为和ToolBar中图标的ID一样就可以了。
1.2.2.2. CGuiMDIFrame的和ToolBar, statusbar使用
u 取代默认的toolbar
连变量都不用添加。在CGuiMDIFrame中已经有了CGuiToolBarWnd m_wndToolBar
只要:
InitToolBar(IDR_MAINFRAME);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
u 增加新的toolbar
稍微有一点点麻烦。查找CGuiMDIFrame的源码,不然发现,InitToolBar其实只是执行了:
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,CRect(0,0,0,0),uIDMenu) || !m_wndToolBar.LoadToolBar(uIDMenu))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
return 0;
所有,只有再添加一个变量: CGuiToolBarWnd m_GYZToolBar; 然后依照上面过程在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中添加进去就可以。当然其余步骤要参照上面添加默认工具条就可以了。
u ToolBar上再添下拉菜单
首先创建一个需要的菜单条;
然后在CMainFrame::OnCreate中用如下语句添加一个下拉菜单:
m_wndToolBar.SetButtonDropDown(ID_FILE_NEW,0,IDR_MENUNEWFILE);
其中第二个参数含义是:ID_FILE_NEW在主toolbar上所处的位置,从0开始。
然后把下拉菜单前面添加图标:
原理很简单,把菜单的ID设置成和TooLBar中的图标的ID一样就可以。但是这里要主要,由于我们的TOOLBar是新的,不是ID_MAINFRAME,要让这个图标系统能够加载进去,并和这个下拉菜单联系起来,需要做两件事情:
1,在MainFrame.cpp中,定义状态条的下面定义全局变量Toolbars:
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_EDIT_INDICATOR_POSITION,
ID_EDIT_INDICATOR_COL,
ID_EDIT_INDICATOR_CRLF,
ID_INDICATOR_OVR,
ID_EDIT_INDICATOR_READ,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
static UINT Toolbars[] = {
IDR_MAINFRAME,
IDR_GYZTYPE,
};
注意这个全局变量ToolBars的含义:其实它和ToolBar没有任何含义,只是用于下面把这些Toolbar的图标给加载进去:
2,在CMainFrame::Oncreate的最后,添加如下代码:
#define _countof(array) (sizeof(array)/sizeof(array[0]))
m_wndCool.LoadToolbars(Toolbars, _countof(Toolbars));
这两行的代码用途就是把ToolBar的图标加载进去,和程序工具条中的下拉菜单的ID对上的话,就在前面添加相应的图标。
u StatusBar能够跟踪当前的视类
没有什么特殊地方。依照传统状态条,在视类中处理。不过,crystaleditview中已经处理过了。
1.2.2.3. 其它
在CMainFrame中,最后还有两条命令:
u sProfile = _T("DevStudio");
u LoadBars();
根据源代码,我认为是在toolbar, statusbar,还有其它GUIControl都产生完成后,程序根据配置文件sProfile,最后调整一下界面显示,以确定显示什么,不显示什么,并调整相应窗口。
u InitMDITabbed();
还没有看明白干嘛用的。
1.2.2.4. 例程
static UINT Toolbars[] = {
IDR_MAINFRAME,
IDR_TOOLBARS,
IDR_NEWITEM
};
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CGuiMDIFrame::OnCreate(lpCreateStruct) == -1)
return -1;
InitMenu(IDR_MAINFRAME);
InitToolBar(IDR_MAINFRAME);
InitStatusBar(indicators,sizeof(indicators)/sizeof(UINT));
if (!m_GuiSolEx.Create(_T("Workspace"),WS_CHILD | WS_VISIBLE, this, 0x999))
{
TRACE0("Failed to create m_GuiSolEx\n");
return -1;
}
if (!m_GuiHelp.Create(_T("Help"),WS_CHILD | WS_VISIBLE, this, 0x998))
{
TRACE0("Failed to create m_GuiSolEx\n");
return -1;
}
if (!m_OutPut.Create(_T("OutPut"),WS_CHILD | WS_VISIBLE, this, 0x997))
{
TRACE0("Failed to create m_GuiSolEx\n");
return -1;
}
if (!m_Server.Create(_T("Server Explorer"),WS_CHILD | WS_VISIBLE, this, 0x996))
{
TRACE0("Failed to create m_GuiSolEx\n");
return -1;
}
if (!m_OutNormal.Create(_T("Output Normal"),WS_CHILD | WS_VISIBLE, this, 0x995))
{
TRACE0("Failed to create m_GuiSolEx\n");
return -1;
}
m_GuiSolEx.SetBarStyle(m_GuiSolEx.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_GuiHelp.SetBarStyle(m_GuiHelp.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_OutPut.SetBarStyle(m_OutPut.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_Server.SetBarStyle(m_Server.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_OutNormal.SetBarStyle(m_OutNormal.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_wndToolBar.SetButtonDropDown(ID_FILE_NEW,0,IDR_MENUNEW);
m_wndToolBar.SetButtonDropDown(ID_NEW_ITEM,1,IDR_MENUNEWITEM);
m_wndToolBar.SetButtonDropDown(ID_UNDO,8,IDR_MENUNEW);
m_wndToolBar.SetButtonDropDown(ID_REDO,9,IDR_MENUNEW);
m_wndToolBar.SetButtonDropDown(ID_CLASSVIEW,16,IDR_MENUTOOLBARS);
CreateCombos();
EnableDocking(CBRS_ALIGN_ANY);
m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
m_GuiSolEx.EnableDocking(CBRS_ALIGN_ANY);
m_GuiHelp.EnableDocking(CBRS_ALIGN_ANY);
m_OutPut.EnableDocking(CBRS_ALIGN_ANY);
m_Server.EnableDocking(CBRS_ALIGN_ANY);
m_OutNormal.EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndMenuBar);
DockControlBar(&m_wndToolBar);
DockControlBar(&m_GuiSolEx, AFX_IDW_DOCKBAR_RIGHT);
DockControlBar(&m_GuiHelp, AFX_IDW_DOCKBAR_RIGHT);
DockControlBar(&m_OutPut, AFX_IDW_DOCKBAR_BOTTOM);
DockControlBar(&m_Server, AFX_IDW_DOCKBAR_LEFT);
DockControlBar(&m_OutNormal, AFX_IDW_DOCKBAR_BOTTOM);
sProfile = _T("DevStudio");
LoadBars();
InitMDITabbed();
#define _countof(array) (sizeof(array)/sizeof(array[0]))
m_wndCool.LoadToolbars(Toolbars, _countof(Toolbars));
return 0;
}
|
|