游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2147|回复: 0

GuiToolkits1.15安装和Devstudio简单分析WXH ZT

[复制链接]

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2005-1-24 23:50:00 | 显示全部楼层 |阅读模式

主要内容在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;

}

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-19 13:51

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表