admin管理员组

文章数量:1534391

2023年12月18日发(作者:)

XTToolkitPro使用初探

一. 创建MFC的SDI或MDI应用程序

在stdafx.h添加 #include // Xtreme Toolkit Pro component library修改的CMainFrame基类,对应为CXTPMDIFrameWnd

class CMainFrame : public CXTPFrameWnd

修改CMainFrame::OnCreate函数 注释掉原有的,添加下列代码

if (!InitCommandBars())

return -1;

CXTPCommandBars* pCommandBars = GetCommandBars();

if(pCommandBars == NULL)

{

TRACE0("Failed to create command bars object.n");

return -1; // fail to create

}

CXTPCommandBar* pMenuBar = pCommandBars->SetMenu( _T("Menu Bar"), IDR_MAINFRAME);

if(pMenuBar == NULL)

{

TRACE0("Failed to create menu bar.n");

return -1; // fail to create

} CXTPToolBar* pToolBar = (CXTPToolBar*)pCommandBars->Add(_T("Standard"), xtpBarTop);

if (!pToolBar || !pToolBar->LoadToolBar(IDR_MAINFRAME))

{

TRACE0("Failed to create toolbarn");

return -1;

}

CXTPPaintManager::SetTheme(xtpThemeOffice2003);编译运行,出现Offiice 2003主题风格的应用程序 资源包含,查看rc2资源文件代码,添加,在资源附加目录中添加所在目录使用的时候,只需要在StdAfx.h中加入下面的语句即可

#include

如果你选择static link,那么可以使用宏把不需要的部分排除掉,这样能减少最终生成的EXE的大小

//#define _XTP_EXCLUDE_COMMON

#define _XTP_EXCLUDE_TABMANAGER

#define _XTP_EXCLUDE_GRAPHICLIBRARY

//#define _XTP_EXCLUDE_CONTROLS

//#define _XTP_EXCLUDE_COMMANDBARS

//#define _XTP_EXCLUDE_DOCKINGPANE

//#define _XTP_EXCLUDE_PROPERTYGRID

#define _XTP_EXCLUDE_REPORTCONTROL

#define _XTP_EXCLUDE_CALENDAR

#define _XTP_EXCLUDE_TASKPANEL

#define _XTP_EXCLUDE_SHORTCUTBAR

#define _XTP_EXCLUDE_SKINFRAMEWORK

#define _XTP_EXCLUDE_RIBBON

#define _XTP_EXCLUDE_SYNTAXEDIT

另外值得注意的一点是,如果你选择static link,那么需要将XTP的资源导入你的工程之中。比如要使用中文资源,那么把下面的代码加入工程的rc2文件的最后

#define _XTP_RESOURCE_LANGUAGE zh_CN

#include <>

同时,你还需要修改一下XTP附带的中的内容

将最后的LANGUAGE_DEFAULT(TaskPanel)改成LANGUAGE_LOCALIZED(TaskPanel)

然后在TaskPanelres目录下将复制成Resource_zh_,并将其中的编码改成中文

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)

#ifdef _WIN32

LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

#pragma code_page(936)

#endif //_WIN32

#endif

否则你之后include的资源会变成默认的英文

二.认识XtremeToolkitPro的文件夹结构及文件用途

XtremeToolkitPro安装后,其文件夹结构如下图所示:

前面的几个文件夹就不用我说了,重点说说Utils里面的文件夹。

AppWizard:很显然是XtremeToolkitPro应用程序工程生成向导的文件夹,这一点后面再作详解。

Package:此文件夹里有一个动态库文件和一个1033的文件夹,文件夹1033及其下的应该是与UI有关的E文资源包。而DLL文件是被注册在注册表中VisualStudio8.0Packages项下的,应该是用作本地化的,具体用途是为Visual Studio提供本地化资源,还是作别的什么用途就不是很清楚了,因为笔者对本地化不是很了解,望有这方面经验的达人指点指点,呵呵。

Translations:文件夹是为ToolkitPro提供的多语言资源库。方便大家开发多语言版本的软件项目。

另外Utils文件夹下还有两个.exe文件,和,前者就不用我说了,是开发界面风格的工具,help中有它的使用说明手册。后者呢,是开发多语言版的资源编辑工具,不但可以用来编辑修改Translations文件夹下的资源动态库文件(.DLL),生成新的

语种资源动态库,还可以提取.exe中的资源(String Table、Menu和Dialogs中的字符串)生成.xml文件,然后Export to DLL,生成新的资源动态库。

然后是Workspace文件夹,在此之下的Resource文件夹是XtremeToolkitPro 支持的各国语言资源文件夹,其下又包括多个以ResourceXXX命名的文件夹,且每个文件夹下均包括、ResourceXXX_和ResourceXXX_三个文件(XXX代表语言名称)。打开.sln文件,整个解决方案里就只包括,由此可看出该工程仅仅是用来编译资源文件的。

而Resource文件夹下有.mak文件()、项目文件(Resource_)、资源包的定义文件ResourcePackage.h、。由此可看出是为批量编译资源文件用的。

Samples文件夹下全是 各个Sample的.sln文件。

ToolkitPro文件夹下面是编译XtremeToolkitPro各种版本动态库用的项目文件。如果你修改了ToolkitPro的原文件(如果你是这种牛人:->),你可以打开ToolkitPro_再次编译ToolkitPro界面库便可生成Unicode版本的动态库,或非Unicode动态库。

总结,由上述可以看到,XtremeToolkitPro不但为开发者提供了漂亮的界面库,而且为开发者开发多国语言的程序提供现成的界面相关语言资源库。顺便告诉大家,ToolkitPro还提供了类CXTPResourceManager,处理资源问题应该很方便哦,呵呵。使用方法在help里能找到。

笔者之前通过ToolkitPro向导生成项目,结果界面部分却总是E文的,所以总感觉很不爽。至此,想要ToolkitPro显示中文,不再是难事了。哈哈!!

三. 让你的应用程序界面--ToolkitPro显示中文

打开ToolkitPro_项目,然后查看源代码,拉到文件最后,会发现如下的定义:

1#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)

3#ifdef _WIN32

5LANGUAGE 9, 1

6

7#pragma code_page(1252)

9#endif //_WIN32

10

11#include "" // non-Microsoft Visual C++ edited resources

12

13#include "" // Standard components

14

15#endif

16

代码中定义包含的文件"" 是在ToolkitPro的Source文件夹下的,""

文件集中定义的是界面库中各种控件的资源文件,咱们再打开""文件,我们发现文件开头几行定义说明了一切问题。

1

2#define LANGUAGE_DEFAULT(ProdName) <##ProdName##>

3

4#ifdef _XTP_RESOURCE_LANGUAGE

5

6 #define LANGUAGE_LOCALIZED__(ProdName, LangName) <##ProdName##resResource_##LangName##.rc>

8 #define LANGUAGE_LOCALIZED_(ProdName, LangName) LANGUAGE_LOCALIZED__(ProdName, LangName)

10 #define LANGUAGE_LOCALIZED(ProdName) LANGUAGE_LOCALIZED_(ProdName, _XTP_RESOURCE_LANGUAGE)

12#else

14 #define LANGUAGE_LOCALIZED(ProdName) LANGUAGE_DEFAULT(ProdName)

16#endif

19#if !defined(_XTP_EXCLUDE_CALENDAR)

21#include LANGUAGE_LOCALIZED(Calendar) // _XTP_INCLUDE_CALENDAR

23#endif

24

26#if !defined(_XTP_EXCLUDE_COMMANDBARS)

28#include LANGUAGE_LOCALIZED(CommandBars) // _XTP_INCLUDE_COMMANDBARS

30#endif

第一行定义了缺省的语言,第二行的标识_XTP_RESOURCE_LANGUAGE可以看出该标识是为使用不同的语言资料文件而定义标识的。那么只要在程序库中定义了该标识就可以让ToolkitPro使用相应的语言资源库了。HoHo! 打开Source文件夹,在每一个控件包含的文件夹下都可以看到许多后缀为.rc的资源文件,由资源文件的名称,再由定义语句:

#define LANGUAGE_LOCALIZED__(ProdName, LangName) <##ProdName##resResource_##LangName##.rc>

可以很容易猜得到中文的定义为zh_CN,自然可以猜到定义中文资源的语句即为:

#define _XTP_RESOURCE_LANGUAGE zh_CN

那么应该定义在哪。我的做法是定义在文件的头几行,因为该文件是编译界面库的项目文件中的文件,与ToolkitPro的源代码没有关系,因此尽可能不影响源代码为佳。

接下来再找到下面一行:

LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

改为-->

LANGUAGE

LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

再次重新生成一下各种版本的动态库(编译你需要的版本就够了,全编译很费时的!:D),然后再运行你的应用程序,Bingo!界面元素的窗口、工具条等等,比如工具条自定义窗口都变成中文了。

Ps: 我想说说文件中的

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)

………

#endif

标识AFX_RESOURCE_DLL我猜想应该是为制作多国语言资源所用。因为定义了它,其后的资源文件就不会被定义了。也就是不会把资源编译进ToolkitPro的DLL中。若哪位达人做过多语言版本方面的软件研究,还望不吝赐教。

四 .XTP界面在Dialog里的实现

1,确定你已经装好了XTP。

2,修改目录:工具/选项/目录

include files : D:Microsoft Visual StudioXtreme ToolkitPro v11.2.2Source

librarys files : D:Microsoft Visual StudioXtreme ToolkitPro v11.2.2Libvc60

3,工程/设置/C++ 在工程选项里面添加:/Zm200 注意大小写。

4,在stdAfx.h里面添加:#include

5, 在Dialog.h文件中,Dialog定义的地方改为:

#define CDialogSampleDlgBase CXTPDialogBase

class CCardManageDlg : public CDialogSampleDlgBase{

public:

}

6,在Dialog构造函数实现的地方改为:

CCardManageDlg::CCardManageDlg(CWnd* pParent /*=NULL*/)

: CDialogSampleDlgBase(CCardManageDlg::IDD, pParent)

{

}

7,dialog构造函数实现内,预先配置:

XTPSkinManager()->SetApplyOptions(XTPSkinManager()->GetApplyOptions()

xtpSkinApplyMetrics);//这句必须有,

XTPSkinManager()->LoadSkin(_T("es"));//这句是设置一种风格,es是风格文件名,要拷贝过来。

|

8,增加变量:

BOOL m_bInRepositionControls, m_bInitDone;

CRect m_rcBorders;

用于第9,10步中,重新设置组件位置和大小。

9,在initdialog里面添加:

VERIFY(InitCommandBars());//XTP带,预处理,不可少。

CXTPCommandBars* pCommandBars = GetCommandBars();//CXTPCommandBars管理TOOLBAR,Menu和status.

/***开始添加菜单***/

pCommandBars->SetMenu(_T("Menu Bar"), IDR_MENU1);

CXTPToolBar* pToolBar = pCommandBars->Add(_T("Standard"), xtpBarTop);

pToolBar->LoadToolBar(IDR_MAINFRAME);

XTPImageManager()->SetIcons(IDR_MAINFRAME);//图标

pCommandBars->GetCommandBarsOptions()->ShowKeyboardCues(xtpKeyboardCuesShowWindowsDefault);//额外的。

pCommandBars->GetToolTipContext()->SetStyle(xtpToolTipOffice);//额外的。

// pCommandBars->GetShortcutManager()->SetAccelerators(IDR_ACCELERATOR);//快捷键

LoadCommandBars(_T("CommandBars"));//XTP必须

/****下面是为解决MENU和TOOLBAR引起的错位,通过迭代对所有子组件重拍******/

CWnd* pwndChild = GetWindow(GW_CHILD);

while (pwndChild)

{

SetResize(pwndChild->GetDlgCtrlID(), SZ_TOP_LEFT, CXTResizePoint( 0, 0) );

//0,0表示水平和竖直方向都不缩放。

pwndChild = pwndChild->GetNextWindow();

}

m_bInitDone = TRUE;

RepositionControls();//重设组件位置和大小,实现见10.

m_szMin = m_szWindow;

AutoLoadPlacement(_T("Placement"));

10,实现RepositionControls();//重设组件位置和大小,无需看,直接复制。

void CCardManageDlg::RepositionControls()

{

if (m_bInRepositionControls || !m_bInitDone)

return;

CRect rcClientStart;

CRect rcClientNow;

GetClientRect(rcClientStart);

if ((GetStyle() & WS_MINIMIZE) || (Empty()))

return;

m_bInRepositionControls = TRUE;

RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0, reposQuery,

rcClientNow);

CRectrcBorders(,-

, - , - );

if (rcBorders != m_rcBorders)

{

CPoint ptOffset( - m_, - m_);

CSize szOffset( + - m_ - m_,

+ - m_ - m_);

CRect rcWindow;

GetWindowRect(rcWindow);

Right() += szOffset;

Offset(ptOffset);

m_szWindow += szOffset;

m_szMin += szOffset;

MoveWindow(rcWindow, TRUE);

}

m_rcBorders = rcBorders;

RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

m_bInRepositionControls = FALSE;

}

11,添加状态栏的方法:

状态栏变量:CXTPStatusBar m_wndStatusBar;

在ONinitdialog里面加:

if (!m_(this) ||

!m_icators(indicators,

sizeof(indicators)/sizeof(UINT)))

{

TRACE0("Failed to create status barn");

return -1; // fail to create

}

m_eInfo(0, ID_SEPARATOR, SBPS_STRETCH, 100);

在合适的地方调用m_dowText(lpsz);即可设置显示文本

/***下面这句有时间看看**/

LRESULT CDialogSampleDlg::OnKickIdle(WPARAM, LPARAM)

{

if (GetCommandBars()) GetCommandBars()->UpdateCommandBars();

if (m_eHwnd()) m_ssage(WM_IDLEUPDATECMDUI,

TRUE);

return 0;

}

五 .添加智能菜单

1.添加Id数组,看起来这一步对用户不太重要。

static UINT uHideCmds[] =

{

ID_FILE_PRINT, ID_FILE_PRINT_PREVIEW, ID_WINDOW_CASCADE

};

2.在CMainFrame::OnCreate中添加智能菜单的初始化。

// Hide array of commands

pCommandBars->HideCommands(uHideCmds, _countof(uHideCmds));

// Set "Always Show Full Menus" option to the FALSE

XTP_COMMANDBARS_OPTIONS* pOptions = pCommandBars->GetCommandBarsOptions();

pOptions->bAlwaysShowFullMenus = FALSE;

3.为CMainFrame的OnCreate函数添加LoadCommandBars(_T(“CommandBars”)),这将

恢复先前工具栏和菜单及一些所作的定制。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

// Load the previous state for toolbars and menus.

LoadCommandBars(_T("CommandBars"));

return 0;

}

4.为CMainFrame添加OnClose消息的处理,添加SaveCommandBars(_T(“CommandBars”));在调用基类之前,这将存储先前用户使用过的命令。

void CMainFrame::OnClose()

{

// Save the current state for toolbars and menus.

SaveCommandBars(_T("CommandBars"));

CMDIFrameWnd::OnClose();

}

六. 自定义主题

为应用程序添加一个定制的theme

1.创建一个从toolkit中预定义的theme中派生的新类。我们使用CXTPDefaultTheme,

你可以使用以下任何一个theme类:

- CXTPDefaultTheme 得到 Office 2000 theme

- CXTPOfficeTheme得到Office XP theme

- CXTPOffice2003Theme得到Office 2003 theme

- CXTPNativeXPTheme得到Native XP theme

class CDoubleGripperTheme : public CXTPDefaultTheme

{

};

2.重载CXTPDefaultTheme基类的DrawCommandBarGripper。这将允许添加我们自己

定制的外观,画命令栏的把手(gripper)。

class CDoubleGripperTheme : public CXTPDefaultTheme

{

virtual CSize DrawCommandBarGripper(

CDC* pDC, CXTPCommandBar* pBar, BOOL bDraw);

};

// DrawCommandBarGripper function.

// if bDraw if FALSE must return gripper size.

// if bDraw is TRUE must draw gripper.

CSize CDoubleGripperTheme:rawCommandBarGripper(CDC* pDC,

CXTPCommandBar* pBar, BOOL bDraw)

{

// If Toolbar is vertical docked

if (pBar->GetPosition() == xtpBarRight ||

pBar->GetPosition() == xtpBarLeft)

{

if (bDraw)

{

CXTPClientRect rc(pBar);

Draw3dRect(pDC, CRect(3, 3, - 3, 6),

COLOR_BTNHILIGHT, COLOR_3DSHADOW);

Draw3dRect(pDC, CRect(3, 7, - 3, 10),

COLOR_BTNHILIGHT, COLOR_3DSHADOW);

}

return CSize(0, 10);

}

// if Toolbar is horizontal docked

else

if (pBar->GetPosition() == xtpBarTop ||

pBar->GetPosition() == xtpBarBottom)

{

CXTPClientRect rc(pBar);

if (bDraw)

{

Draw3dRect(pDC, CRect(3, 3, 6, - 3),

COLOR_BTNHILIGHT, COLOR_3DSHADOW);

Draw3dRect(pDC, CRect(7, 3, 10, - 3),

COLOR_BTNHILIGHT, COLOR_3DSHADOW);

}

return CSize(10, 0);

}

else return CXTPDefaultTheme:rawCommandBarGripper(pDC, pBar, bDraw);

}

3.在CMainFrame的OnCreate函数中调用CXTPPaintManager::SetCustomTheme,应用刚才

创建的theme。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

...

// Use our own theme for drawing command bar grippers.

CXTPPaintManager::SetCustomTheme(new CDoubleGripperTheme());

return 0;

}

本文标签: 文件资源添加文件夹语言