admin管理员组文章数量:1534391
2023年12月18日发(作者:)
XTToolkitPro使用初探
一. 创建MFC的SDI或MDI应用程序
在stdafx.h添加 #include
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;
}
版权声明:本文标题:XTToolkitPro使用初探 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1702908916a29847.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论