Nebula2探秘14-nGuiServer的创建与使用
happykevins文
关于nGui:
nGui是Nebula2本身集成的GUI系统。虽然Radon在mangalore中已经集成了对CEGUI的支持,但是nGui相比之下更加简单易用,而且紧密地与Nebula2结合,不存在CEGUI诸多的兼容性问题。另外其天生支持中文,所以在制作简单的游戏UI时可以考虑使用nGui系统。CEGUI是一个非常流行的开源的GUI系统,目前版本是0.5,虽然Bug很多而且不支持中文(网上已有很多的解决方案),但是其功能强大,并且CEGUI社区正在积极制作其相关工具,想要制作精美且复杂的UI系统的话可以考虑使用。在之后的教程中我会介绍在Nebula2中集成CEGUI的方法。
nGui的维护:
像一般的NebulaServers一样,nGui的创建过程大概分为3步:1.向Kernel添加ngui包;2.在kernel中创建nguiserver;3.调用nguiserver的初始化方法(Open)。另外在游戏循环中每帧都需要调用Trigger的方法以保证ngui正确处理用户输入,这需要有ninputserver的支持。最后在程序结束前要调用Close()方法以确保ngui正确释放资源。
nGui的初始化:
nGui的过程分为3步:1.设置nGui的skin。2.定制画刷列表。3.添加用户控件。其中前两个步骤Nebula2在startup.tcl中已经提供了默认的实现,用户也可以自由替换这些信息以实现自己期待的效果。添加用户控件可以通过两个途径来实现:1.通过kernelserver的new来创建。2.通过guiserver的newwindow来创建。其实他们本质上没有什么区别,guiserver也是通过kernelserver来创建的,只不过帮你维护了当前rootwindow的noh路径而已,nGui的所有控件都存放在noh的"/res/gui"下。
nGui的事件注册:
nGui的事件可以通过每个控件的SetXXCammond(cmd_name)来注册(XX为事件类型),传入参数cmd_name为脚本中对应的事件处理函数名,使用起来非常方便。
程序代码如下:
/* Nebula2 - Tutorial 14 */
/* Using nGui Server */
/* author: happykevins */
/****************************************************************************/
///----------------------------------------------------------------------------
/// +必要头文件
// nebula2 includes
#include "kernel/nkernelserver.h"
#include "kernel/nfileserver2.h"
#include "script/ntclserver.h"
#include "gfx2/nd3d9server.h"
#include "gfx2/ncamera2.h"
#include "gui/nguiserver.h"
#include "tools/nmayacamcontrol.h"
#include "scene/nsceneserver.h"
#include "gui/nguiwindow.h"
#include "gui/nguilabel.h"
#include "gui/nguitextlabel.h"
#include "gui/nguitextbutton.h"
#include "../NebulaUtils/nutildefs.h"
#include "../NebulaUtils/nkernelinfo.h"
/// -必要头文件
///----------------------------------------------------------------------------
///----------------------------------------------------------------------------
/// +链接库
#pragma comment(lib, "wsock32.lib")
#pragma comment(lib, "d_microtcl.lib")
#pragma comment(lib, "d_nkernel.lib")
#pragma comment(lib, "d_nnebula.lib")
#pragma comment(lib, "d_ntoollib.lib")
#pragma comment(lib, "d_ngui.lib")
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "dxerr9.lib")
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9d.lib")
#pragma comment(lib, "dinput8.lib")
#pragma comment(lib, "d_ndinput8.lib")
#pragma comment(lib, "d_ndirect3d9.lib")
/// -链接库
///----------------------------------------------------------------------------
///----------------------------------------------------------------------------
/// +声明使用的Nebula2 Package&Module
nNebulaUseModule(ntclserver);
nNebulaUseModule(nresource);
nNebulaUseModule(nresourceserver);
nNebulaUseModule(ninputserver);
nNebulaUseModule(nfont2);
nNebulaUseModule(nmesh2);
nNebulaUseModule(nmesharray);
nNebulaUseModule(nshader2);
nNebulaUseModule(ntexture2);
nNebulaUseModule(ngfxserver2);
nNebulaUseModule(nsceneserver);
nNebulaUseModule(nshadowserver2);
nNebulaUseModule(nscenenode);
nNebulaUseModule(ntransformnode);
nNebulaUseModule(nabstractcameranode);
nNebulaUseModule(nclippingcameranode);
nNebulaUseModule(nreflectioncameranode);
nNebulaUseModule(nvariableserver);
nNebulaUseModule(nconserver);
nNebulaUsePackage(ngui);
nNebulaUsePackage(ndirect3d9);
nNebulaUsePackage(ndinput8);
/// -声明使用的Nebula2 Package&Module
///----------------------------------------------------------------------------
nCamera2 cam;
nMayaCamControl ccam;
nKernelInfoHelper ks_info(NULL);
nTclServer* tcl = NULL;
nKernelServer* ks = NULL;
nD3D9Server* gfx2 = NULL;
nInputServer* input = NULL;
nSceneServer* scene = NULL;
nGuiServer* gui = NULL;
///----------------------------------------------------------------------------
/// +添加GUI控件
///
void SetupGUI()
{
const float borderSize = 0.02f;
// create a dummy root window
//gui->SetRootWindowPointer(0);
nGuiWindow* userRootWindow = gui->NewWindow("nguiwindow", true);
n_assert(userRootWindow);
rectangle nullRect(vector2(0.0f, 0.0f), vector2(1.0f, 1.0f));
userRootWindow->SetRect(nullRect);
//nGuiWindow* userRootWindow = gui->GetRootWindowPointer();
ks->PushCwd(userRootWindow);
// create logo label
nGuiLabel* rightLabel = (nGuiLabel*) ks->New("nguilabel", "RightLogo");
n_assert(rightLabel);
vector2 rightLabelSize = gui->ComputeScreenSpaceBrushSize("n2logo");
rectangle rightRect;
rightRect.v0.set(1.0f - rightLabelSize.x - borderSize, 1.0f - rightLabelSize.y - borderSize);
rightRect.v1.set(1.0f - borderSize, 1.0f - borderSize);
rightLabel->SetRect(rightRect);
rightLabel->SetDefaultBrush("n2logo");
rightLabel->SetPressedBrush("n2logo");
rightLabel->SetHighlightBrush("n2logo");
rightLabel->OnShow();
// create a help text label
nGuiTextLabel* textLabel = (nGuiTextLabel*) ks->New("nguitextlabel", "HelpLabel");
n_assert(textLabel);
textLabel->SetText("Esc: 系统菜单请不要点击"Har/Scn/Dis/Cha" 由于没有连接以上服务,会导致程序崩溃!");
textLabel->SetFont("GuiSmall");
textLabel->SetAlignment(nGuiTextLabel::Left);
textLabel->SetColor(vector4(1.0f, 1.0f, 1.0f, 1.0f));
textLabel->SetClipping(false);
vector2 textExtent = textLabel->GetTextExtent();
rectangle textRect(vector2(0.0f, 0.0f), textExtent);
textLabel->SetRect(textRect);
textLabel->OnShow();
// create a custom button
nGuiTextButton* toggleBtn = (nGuiTextButton*) ks->New("nguitextbutton", "ToggleBtn");
n_assert(toggleBtn);
toggleBtn->SetText("系统菜单");
toggleBtn->SetCommand("UIEvent_ToggleBtn"); // 脚本中的函数名
toggleBtn->SetFont("GuiSmall");
toggleBtn->SetAlignment(nGuiTextButton::Center);
toggleBtn->SetRect(rectangle(vector2(0.0f + borderSize, 1 - 0.1f + borderSize), vector2(0.15f - borderSize, 1.0f - borderSize)));
toggleBtn->SetDefaultBrush("button_n");
toggleBtn->SetPressedBrush("button_p");
toggleBtn->SetHighlightBrush("button_h");
toggleBtn->OnShow();
ks->PopCwd();
// set the new user root window
gui->SetRootWindowPointer(userRootWindow);
}
///
/// +添加GUI控件
///----------------------------------------------------------------------------
///----------------------------------------------------------------------------
/// +初始化环境,创建需要的Server
///
bool InitApp()
{
/// 创建KernelServer
ks = n_new(nKernelServer);
///----------------------------------------------------------------------------
/// +向KernelServer中添加Package&Module
nNebulaAddModule(ntclserver);
nNebulaAddModule(nresource);
nNebulaAddModule(nresourceserver);
nNebulaAddModule(ninputserver);
nNebulaAddModule(nfont2);
nNebulaAddModule(nmesh2);
nNebulaAddModule(nmesharray);
nNebulaAddModule(nshader2);
nNebulaAddModule(ntexture2);
nNebulaAddModule(ngfxserver2);
nNebulaAddModule(nsceneserver);
nNebulaAddModule(nshadowserver2);
nNebulaAddModule(nscenenode);
nNebulaAddModule(ntransformnode);
nNebulaAddModule(nabstractcameranode);
nNebulaAddModule(nclippingcameranode);
nNebulaAddModule(nreflectioncameranode);
nNebulaAddModule(nvariableserver);
nNebulaAddModule(nconserver);
ks->AddPackage(ndinput8);
ks->AddPackage(ngui);
ks->AddPackage(ndirect3d9);
/// +向KernelServer中添加Package&Module
///----------------------------------------------------------------------------
/// 获得FileServer设置shaders的路径
nFileServer2* file = (nFileServer2*)ks->Lookup("sys/servers/file2");
/// 设置系统路径
file->SetAssign("home", "bin:../../");
file->SetAssign("renderpath", "home:datafiles/shaders");
file->SetAssign("shaders", "renderpath:fixed");
file->SetAssign("scripts", "home:datafiles/scripts");
/// 创建tclserver
tcl = (nTclServer*)ks->New("ntclserver", "/sys/servers/script");
/// 创建ResourceServer
ks->New("nresourceserver", "/sys/servers/resource");
/// 创建variableserver
ks->New("nvariableserver", "/sys/servers/variable");
/// 创建guiserver(RenderPath依赖)
gui = (nGuiServer*)ks->New("nguiserver", "/sys/servers/gui");
/// 创建ConsoleServer(RenderPath依赖)
ks->New("nconserver", "/sys/servers/console");
/// 创建InputServer(GuiServer依赖)
input = (nInputServer*)ks->New("ndi8server", "/sys/servers/input");
/// 创建D3D9Server
gfx2 = (nD3D9Server*)ks->New("nd3d9server", "/sys/servers/gfx");
/// 创建sceneserver
scene = (nSceneServer*)ks->New("nsceneserver", "/sys/servers/scene");
/// 创建shadowserver
ks->New("nshadowserver2", "/sys/servers/shadow");
/// 初始化显示模式
nDisplayMode2 mode;
mode.SetXPos(150);
mode.SetYPos(100);
mode.SetWidth(640);
mode.SetHeight(480);
/// 将显示模式应用到d3d9server
gfx2->SetDisplayMode(mode);
gfx2->SetCamera(cam);
/// 启动sceneserver(启动d3d9server)
scene->SetRenderPathFilename("renderpath:dx7_renderpath.xml");
if ( !scene->Open() )
{
return false;
}
/// 启动GUIServer
nString ret;
tcl->RunScript("scripts:T14_GuiServer.tcl", ret);
gui->Open();
/// 启动InputServer
input->Open();
ret.Clear();
tcl->RunFunction("OnT14MapInput", ret);
/// 设置GUI环境
SetupGUI();
return true;
}
///
/// +初始化环境,创建需要的Server
///----------------------------------------------------------------------------
///----------------------------------------------------------------------------
/// +初始化环境,创建需要的Server
///
bool CloseApp()
{
/// 关闭GUIServer
gui->Close();
/// 关闭sceneserver(关闭d3d9server)
scene->Close();
/// 销毁KernelServer
n_delete(ks);
return true;
}
///
/// +初始化环境,创建需要的Server
///----------------------------------------------------------------------------
///----------------------------------------------------------------------------
/// +Application
int main(int argc, const char** argv)
{
/// 初始化Application
if ( !InitApp() )
{
n_error("程序初始化失败! ");
return 0;
}
ks_info.SetKernelServer(ks);
ks_info.LogNOH("/");
/// 这里相当于游戏循环,gfx2->Trigger()将触发win32的消息泵
while ( gfx2->Trigger() && tcl->Trigger() )
{
/// Trigger TimeServer
nTimeServer::Instance()->Trigger();
double time = nTimeServer::Instance()->GetTime();
/// Trigger InputServer
input->Trigger(time);
/// 处理GUI事件,需要inputserver的支持
gui->Trigger();
/// Begin Scene (Begin Frame)
if ( scene->BeginScene(ccam.GetViewMatrix()) )
{
// Render Scene
scene->RenderScene();
// End Scene
scene->EndScene();
// Present Scene (End Frame)
scene->PresentScene();
}
/// Flush Events
input->FlushEvents();
n_sleep(0.00f);
}
/// 释放资源
if ( !CloseApp() )
{
n_error("释放资源失败! ");
return 0;
}
return 0;
}
/// -Application
///----------------------------------------------------------------------------
脚本代码如下:
# T14_GuiServer.tcl
#
# This is extract from the the central Nebula runtime startup script
# which is used for Nebula2 Tutorial GuiServer
#
# The script mainly sets up the nGui Variables and Map Inputs
#
# (C) 2003 RadonLabs GmbH
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
# OnGuiServerOpen
#
# This function is called when the Nebula2 GUI server is opened.
#-------------------------------------------------------------------------------
proc OnGuiServerOpen {} {
set cwd [psel]
# 工具提示
# initialize the default tooltip
set guiRoot [/sys/servers/gui.getrootpath]
sel $guiRoot
new nguitooltip Tooltip
sel Tooltip
.setdefaultbrush "tooltip"
.setfont "GuiSmall"
.setcolor 0 0 0 1
.setalignment "left"
.setborder 0.005 0.005
sel ..
# 设置Gui外观相关信息
# define the system skin
set skin [/sys/servers/gui.newskin system]
sel $skin
# set texture path pre- and postfix (NOTE: don't change path to textures:system!!!)
.settextureprefix "home:datafiles/textures/system/"
.settexturepostfix ".dds"
# active and inactive window modulation color
.setactivewindowcolor 1.0 1.0 1.0 1.0
.setinactivewindowcolor 0.6 0.6 0.6 0.6
.setbuttontextcolor 0.0 0.0 0.0 1.0
.settitletextcolor 0.0 0.0 0.0 1.0
.setlabeltextcolor 0.0 0.0 0.0 1.0
.setentrytextcolor 0.0 0.0 0.0 1.0
.settextcolor 0.0 0.0 0.0 1.0
.setmenutextcolor 0.0 0.0 0.0 1.0
#####################################################################
# +添加画刷
#
# define brushes
.beginbrushes
# window title bar, window background, tooltip background
.addbrush titlebar skin 66 152 10 20 1.0 1.0 1.0 1.0
.addbrush window skin 8 154 4 4 1.0 1.0 1.0 1.0
.addbrush tooltip skin 8 154 4 4 1.0 1.0 0.878 0.8
.addbrush pink skin 8 154 4 4 1.0 0.0 1.0 1.0
.addbrush dragbox skin 8 154 4 4 1.0 0.8 0.8 0.5
# text entry field
.addbrush textentry_n skin 446 124 8 8 0.7 0.7 0.7 1.0
.addbrush textentry_p skin 446 124 8 8 0.8 0.8 0.8 1.0
.addbrush textentry_h skin 446 124 8 8 0.9 0.9 0.9 1.0
.addbrush textcursor skin 446 124 8 8 0.4 0.4 0.4 1.0
# the window close button
.addbrush close_n skin 388 40 16 16 1.0 1.0 1.0 1.0
.addbrush close_h skin 404 40 16 16 1.0 1.0 1.0 1.0
.addbrush close_p skin 420 40 16 16 1.0 1.0 1.0 1.0
# the window size button
.addbrush size_n skin 372 40 16 16 1.0 1.0 1.0 1.0
.addbrush size_h skin 372 40 16 16 1.0 1.0 1.0 1.0
.addbrush size_p skin 372 40 16 16 1.0 1.0 1.0 1.0
# arrows
.addbrush arrowleft_n skin 68 40 16 16 1.0 1.0 1.0 1.0
.addbrush arrowleft_h skin 84 40 16 16 1.0 1.0 1.0 1.0
.addbrush arrowleft_p skin 100 40 16 16 1.0 1.0 1.0 1.0
.addbrush arrowright_n skin 116 40 16 16 1.0 1.0 1.0 1.0
.addbrush arrowright_h skin 132 40 16 16 1.0 1.0 1.0 1.0
.addbrush arrowright_p skin 148 40 16 16 1.0 1.0 1.0 1.0
.addbrush arrowup_n skin 164 40 16 16 1.0 1.0 1.0 1.0
.addbrush arrowup_h skin 180 40 16 16 1.0 1.0 1.0 1.0
.addbrush arrowup_p skin 196 40 16 16 1.0 1.0 1.0 1.0
.addbrush arrowdown_n skin 20 40 16 16 1.0 1.0 1.0 1.0
.addbrush arrowdown_h skin 36 40 16 16 1.0 1.0 1.0 1.0
.addbrush arrowdown_p skin 52 40 16 16 1.0 1.0 1.0 1.0
# sliders
.addbrush sliderhori_bg skin 228 40 16 16 0.5 0.5 0.5 1.0
.addbrush slidervert_bg skin 228 40 16 16 0.5 0.5 0.5 1.0
.addbrush sliderknobhori_n skin 276 40 16 16 1.0 1.0 1.0 1.0
.addbrush sliderknobhori_h skin 292 40 16 16 1.0 1.0 1.0 1.0
.addbrush sliderknobhori_p skin 308 40 16 16 1.0 1.0 1.0 1.0
.addbrush sliderknobvert_n skin 324 40 16 16 1.0 1.0 1.0 1.0
.addbrush sliderknobvert_h skin 340 40 16 16 1.0 1.0 1.0 1.0
.addbrush sliderknobvert_p skin 356 40 16 16 1.0 1.0 1.0 1.0
# standard buttons
.addbrush button_n skin 192 152 96 20 1.0 1.0 1.0 1.0
.addbrush button_h skin 288 152 96 20 1.0 1.0 1.0 1.0
.addbrush button_p skin 384 152 96 20 1.0 1.0 1.0 1.0
.addbrush menu_n skin 192 172 96 16 1.0 1.0 1.0 1.0
.addbrush menu_h skin 288 172 96 16 1.0 1.0 1.0 1.0
.addbrush menu_p skin 384 172 96 16 1.0 1.0 1.0 1.0
.addbrush button_64x16_n skin 0 0 64 16 1.0 1.0 1.0 1.0
.addbrush button_64x16_h skin 64 0 64 16 1.0 1.0 1.0 1.0
.addbrush button_64x16_p skin 128 0 64 16 1.0 1.0 1.0 1.0
.addbrush button_96x16_n skin 192 0 96 16 1.0 1.0 1.0 1.0
.addbrush button_96x16_h skin 288 0 96 16 1.0 1.0 1.0 1.0
.addbrush button_96x16_p skin 384 0 96 16 1.0 1.0 1.0 1.0
.addbrush button_64x24_n skin 0 16 64 24 1.0 1.0 1.0 1.0
.addbrush button_64x24_h skin 64 16 64 24 1.0 1.0 1.0 1.0
.addbrush button_64x24_p skin 128 16 64 24 1.0 1.0 1.0 1.0
.addbrush button_96x24_n skin 192 16 96 24 1.0 1.0 1.0 1.0
.addbrush button_96x24_h skin 288 16 96 24 1.0 1.0 1.0 1.0
.addbrush button_96x24_p skin 384 16 96 24 1.0 1.0 1.0 1.0
.addbrush button_64x20_n skin 192 152 96 20 1.0 1.0 1.0 1.0
.addbrush button_64x20_h skin 288 152 96 20 1.0 1.0 1.0 1.0
.addbrush button_64x20_p skin 384 152 96 20 1.0 1.0 1.0 1.0
.addbrush menu_64x16_n skin 0 172 64 16 1.0 1.0 1.0 1.0
.addbrush menu_64x16_h skin 64 172 64 16 1.0 1.0 1.0 1.0
.addbrush menu_64x16_p skin 128 172 64 16 1.0 1.0 1.0 1.0
.addbrush menu_128x16_n skin 192 172 96 16 1.0 1.0 1.0 1.0
.addbrush menu_128x16_h skin 288 172 96 16 1.0 1.0 1.0 1.0
.addbrush menu_128x16_p skin 384 172 96 16 1.0 1.0 1.0 1.0
# list views
.addbrush list_background skin 446 72 8 8 1.0 1.0 1.0 1.0
.addbrush list_selection skin 64 172 64 16 1.0 1.0 1.0 1.0
# icons
.addbrush console_n skin 0 56 48 48 1.0 1.0 1.0 1.0
.addbrush console_p skin 0 56 48 48 0.5 0.5 0.5 1.0
.addbrush console_h skin 0 104 48 48 1.0 1.0 1.0 1.0
.addbrush texbrowser_n skin 48 56 48 48 1.0 1.0 1.0 1.0
.addbrush texbrowser_p skin 48 56 48 48 0.5 0.5 0.5 1.0
.addbrush texbrowser_h skin 48 104 48 48 1.0 1.0 1.0 1.0
.addbrush gfxbrowser_n skin 96 56 48 48 1.0 1.0 1.0 1.0
.addbrush gfxbrowser_p skin 96 56 48 48 0.5 0.5 0.5 1.0
.addbrush gfxbrowser_h skin 96 104 48 48 1.0 1.0 1.0 1.0
.addbrush dbgwindow_n skin 144 56 48 48 1.0 1.0 1.0 1.0
.addbrush dbgwindow_p skin 144 56 48 48 0.5 0.5 0.5 1.0
.addbrush dbgwindow_h skin 144 104 48 48 1.0 1.0 1.0 1.0
.addbrush syswindow_n skin 192 56 48 48 1.0 1.0 1.0 1.0
.addbrush syswindow_p skin 192 56 48 48 0.5 0.5 0.5 1.0
.addbrush syswindow_h skin 192 104 48 48 1.0 1.0 1.0 1.0
.addbrush contrwindow_n skin 336 56 48 48 1.0 1.0 1.0 1.0
.addbrush contrwindow_p skin 336 56 48 48 0.5 0.5 0.5 1.0
.addbrush contrwindow_h skin 336 104 48 48 1.0 1.0 1.0 1.0
.addbrush hidegui_n skin 240 56 48 48 1.0 1.0 1.0 1.0
.addbrush hidegui_p skin 240 56 48 48 0.5 0.5 0.5 1.0
.addbrush hidegui_h skin 240 104 48 48 1.0 1.0 1.0 1.0
.addbrush quit_n skin 288 56 48 48 1.0 1.0 1.0 1.0
.addbrush quit_p skin 288 56 48 48 0.5 0.5 0.5 1.0
.addbrush quit_h skin 288 104 48 48 1.0 1.0 1.0 1.0
.addbrush hardpoint_n skin 0 188 48 48 1.0 1.0 1.0 1.0
.addbrush hardpoint_p skin 0 188 48 48 0.5 0.5 0.5 1.0
.addbrush hardpoint_h skin 48 188 48 48 1.0 1.0 1.0 1.0
.addbrush savewindow_n skin 96 188 48 48 1.0 1.0 1.0 1.0
.addbrush savewindow_p skin 96 188 48 48 0.5 0.5 0.5 1.0
.addbrush savewindow_h skin 144 188 48 48 1.0 1.0 1.0 1.0
.addbrush charwindow_n skin 192 188 48 48 1.0 1.0 1.0 1.0
.addbrush charwindow_p skin 192 188 48 48 0.5 0.5 0.5 1.0
.addbrush charwindow_h skin 240 188 48 48 1.0 1.0 1.0 1.0
.addbrush disp_n skin 384 56 48 48 1.0 1.0 1.0 1.0
.addbrush disp_p skin 384 56 48 48 0.5 0.5 0.5 1.0
.addbrush disp_h skin 384 104 48 48 1.0 1.0 1.0 1.0
# the left and right logos
.addbrush n2logo n2logo 0 0 64 64 1.0 1.0 1.0 0.5
.addbrush leftlogo radonlabs 0 0 128 64 1.0 1.0 1.0 1.0
.addbrush rightlogo n2toolkit 0 0 64 64 1.0 1.0 1.0 1.0
# the color hexagon for the colorpicker
.addbrush colorhex colorhexagon 0 0 170 141 1.0 1.0 1.0 1.0
.endbrushes
#
# -添加画刷
#####################################################################
/sys/servers/gui.setsystemskin $skin
/sys/servers/gui.setskin $skin
# create the Nebula dock window
# 这个是Nebula2的系统工具栏
/sys/servers/gui.newwindow nguidockwindow true
sel $cwd
}
#-------------------------------------------------------------------------------
# OnGuiServerClose
#
# This procedure is called when the gui server is closed.
#-------------------------------------------------------------------------------
proc OnGuiServerClose {} {
#在这里添加关闭GuiServer,释放资源的代码
}
#-------------------------------------------------------------------------------
# OnT14MapInput
#
# This procedure is called by nviewer when input should be mapped.
#-------------------------------------------------------------------------------
proc OnT14MapInput {} {
set cwd [psel]
sel /sys/servers/input
.beginmap
.map "keyb0:esc.down" "script:/sys/servers/gui.togglesystemgui"
.endmap
sel $cwd
}
#-------------------------------------------------------------------------------
# UIEvent_ToggleBtn
#
# 在程序中向ToggleBtn控件注册的事件处理函数
#-------------------------------------------------------------------------------
proc UIEvent_ToggleBtn {} {
set cwd [psel]
sel /sys/servers/gui
.togglesystemgui
sel $cwd
}