XTToolkitPro使用... 1
开发环境... 2
添加SDI程序的CommandBar和MenuBar支持... 2
定制toolbars和menus的支持... 3
添加自定义的主题支持... 5
添加Docking Panes支持... 6
发现定义在XTPDeprecated.h中的符号,为废弃符号,修改为新符号即可... 9
添加智能菜单支持... 9
添加自定义特性的派生控件... 9
Visual Studio 2008 + XTToolkitPro v11.2
1、 创建MFC的SDI应用程序
2、 在stdafx.h添加
#include <XTToolkitPro.h> // Xtreme Toolkit Pro component library
3、 修改mainfrm.h的CMainFrame基类,MDI对应为
CXTPMDIFrameWnd
class CMainFrame : public CXTPFrameWnd
4、 修改CMainFrame::OnCreate函数
// Initialize the command bars
if (!InitCommandBars())
return -1;
// Get a pointer to the command bars object.
CXTPCommandBars* pCommandBars = GetCommandBars();
if(pCommandBars == NULL)
{
TRACE0("Failed to create command bars object./n");
return -1; // fail to create
}
// Add the menu bar
CXTPCommandBar* pMenuBar = pCommandBars->SetMenu(
_T("Menu Bar"), IDR_MAINFRAME);
if(pMenuBar == NULL)
{
TRACE0("Failed to create menu bar./n");
return -1; // fail to create
}
// Create ToolBar
CXTPToolBar* pToolBar = (CXTPToolBar*)
pCommandBars->Add(_T("Standard"), xtpBarTop);
if (!pToolBar || !pToolBar->LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar/n");
return -1;
}
// Set Office 2003 Theme
CXTPPaintManager::SetTheme(xtpThemeOffice2003);
注释掉以下几行
//if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
// | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
// !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
//{
// TRACE0("未能创建工具栏/n");
// return -1; // 未能创建
//}
/*m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);*/
5、 如果需要重载CMainFrame::PreTranslateMessage和CMainFrame::OnCmdMsg,修改如下
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
return CXTPMDIFrameWnd::PreTranslateMessage(pMsg);
}
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode,
void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
// TODO: Add your specialized code here and/or call the base class
return CXTPMDIFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
6、 编译运行,出现Offiice 2003主题风格的应用程序
1、
在CMainFrm类增加响应ON_COMMAND的消息
XTP_ID_CUSTOMIZE
支持
在mainfrm.cpp中修改
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_COMMAND(XTP_ID_CUSTOMIZE, OnCustomize)
END_MESSAGE_MAP()
在mainfrm.h中修改
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//}}AFX_MSG
afx_msg void OnCustomize();
DECLARE_MESSAGE_MAP()
2、 在mainfrm.cpp中增加
void CMainFrame::OnCustomize()
{
// Get a pointer to the command bars object.
CXTPCommandBars* pCommandBars = GetCommandBars();
if(pCommandBars != NULL)
{
// Instanciate the customize dialog object.
CXTPCustomizeSheet dlg(pCommandBars);
// Add the options page to the customize dialog.
CXTPCustomizeOptionsPage pageOptions(&dlg);
dlg.AddPage(&pageOptions);
// Add the commands page to the customize dialog.
CXTPCustomizeCommandsPage* pCommands = dlg.GetCommandsPage();
pCommands->AddCategories(IDR_MDISAMTYPE);
// Use the command bar manager to initialize the
// customize dialog.
pCommands->InsertAllCommandsCategory();
pCommands->InsertBuiltInMenus(IDR_MDISAMTYPE);
pCommands->InsertNewMenuCategory();
// Dispaly the dialog.
dlg.DoModal();
}
}
3、 添加CMainFrm类的对commandbar和menubar的定制配置序列化支持
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
...
// Load the previous state for toolbars and menus.
LoadCommandBars(_T("CommandBars"));
return 0;
}
void CMainFrame::OnClose()
{
// Save the current state for toolbars and menus.
SaveCommandBars(_T("CommandBars"));
CMDIFrameWnd::OnClose();
}
4、 资源包含,查看rc2资源文件代码,添加xttoolkitpro.rc,在资源附加目录中添加xttoolkitpro.rc所在目录
5、 编译运行,发现定制化工具栏和菜单的资源没有加载进来,如图标、字符串等,解决方法是修改字符资源语言为英文(这里编译的是英文资源的lib库,根据自己需要也可以编译中文资源的lib库)
1、 选择父主题类,如
CXTPDefaultTheme to inherit Office 2000 theme
CXTPOfficeTheme to inherit Office XP theme
CXTPOffice2003Theme to inherit Office 2003 theme
CXTPNativeXPTheme to inherit Native XP theme
2、 实现自定义主题类的接口,接口函数为DrawCommandBarGripper
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::DrawCommandBarGripper(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, rc.right - 3, 6),
COLOR_BTNHILIGHT, COLOR_3DSHADOW);
Draw3dRect(pDC, CRect(3, 7, rc.right - 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, rc.bottom - 3),
COLOR_BTNHILIGHT, COLOR_3DSHADOW);
Draw3dRect(pDC, CRect(7, 3, 10, rc.bottom - 3),
COLOR_BTNHILIGHT, COLOR_3DSHADOW);
}
return CSize(10, 0);
}
else return CXTPDefaultTheme::DrawCommandBarGripper(pDC, pBar, bDraw);
}
3、 运行查看效果
支持
1、 在CMainFrame类中添加CXTPDockingPaneManager成员
// Attributes
public:
CXTPDockingPaneManager m_paneManager;
2、 添加字符串资源
IDR_PANE_OPTIONS 61446 Options
IDR_PANE_PROPERTIES 61447 Properties
3、 在CMainFrame::OnCreate中添加
// Initialize the docking pane manager and set the
// initial them for the docking panes. Do this only after all
// control bars objects have been created and docked.
m_paneManager.InstallDockingPanes(this);
m_paneManager.SetTheme(xtpPaneThemeOffice);
// Create docking panes.
CXTPDockingPane* pwndPane1 = m_paneManager.CreatePane(
IDR_PANE_OPTIONS, CRect(0, 0,200, 120), dockLeftOf);
CXTPDockingPane* pwndPane2 = m_paneManager.CreatePane(
IDR_PANE_PROPERTIES, CRect(0, 0,200, 120), dockBottomOf, pwndPane1)
4、 运行查看Docking Panes效果
5、 绑定窗口控件类到Docking Panes中
6、 添加CMainFrame的窗口控件成员
// Attributes
public:
CStatic m_wndOptions;
CEdit m_wndProperties;
7、 添加OnDockingPaneNotify函数处理,绑定窗口控件成员到Docking Panes上
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_MESSAGE(XTPWM_DOCKINGPANE_NOTIFY, OnDockingPaneNotify)
END_MESSAGE_MAP()
LRESULT CMainFrame::OnDockingPaneNotify(WPARAM wParam, LPARAM lParam)
{
if (wParam == XTP_DPN_SHOWWINDOW)
{
CXTPDockingPane* pPane = (CXTPDockingPane*)lParam;
if (!pPane->IsValid())
{
switch (pPane->GetID())
{
case IDR_PANE_PROPERTIES:
{
if (m_wndProperties.GetSafeHwnd() == 0)
{
m_wndProperties.Create(WS_CHILD|
ES_AUTOVSCROLL|ES_MULTILINE,
CRect(0, 0, 0, 0), this, 0);
}
pPane->Attach(&m_wndProperties);
break;
}
case IDR_PANE_OPTIONS:
{
if (m_wndOptions.GetSafeHwnd() == 0)
{
m_wndOptions.Create(_T("/n/nOptions"),
WS_CHILD|WS_CLIPCHILDREN|
WS_CLIPSIBLINGS|SS_CENTER,
CRect(0, 0, 0, 0), this, 0);
}
pPane->Attach(&m_wndOptions);
break;
}
}
}
return TRUE;
}
return FALSE;
}
8、 添加Bitmap图片资源,2个图标大小33x15
9、 添加CMainFrame::OnCreate中
int nIDIcons[] = {IDR_PANE_OPTIONS, IDR_PANE_PROPERTIES};
m_paneManager.SetIcons(IDB_BITMAP_ICONS, nIDIcons,
_countof(nIDIcons), RGB(0, 255, 0));
10、 添加Docking Panes的序列化支持
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
...
// Load the previous state for docking panes.
CXTPDockingPaneLayout layoutNormal(&m_paneManager);
if (layoutNormal.Load(_T("NormalLayout")))
{
m_paneManager.SetLayout(&layoutNormal);
}
return 0;
}
void CMainFrame::OnClose()
{
// Save the current state for docking panes.
CXTPDockingPaneLayout layoutNormal(&m_paneManager);
m_paneManager.GetLayout(&layoutNormal);
layoutNormal.Save(_T("NormalLayout"));
CMDIFrameWnd::OnClose();
}
11、 运行查看带图标的Docking Panes效果
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、 运行查看结果
1、 派生控件继承自CXTPControlButton, CXTPControlPopup, CXTPControlComboBox, CXTPControlEdit,例如派生ComboBox实现输入字符自动更新为大写,ComboBox内嵌了ComboBoxEditCtrl,重载OnChar实现自动更新
2、 重载实现CXTPControlComboBoxEditCtrl的OnChar成员
class CControlComboBoxEditEx : public CXTPControlComboBoxEditCtrl
{
public:
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CControlComboBoxEditEx, CXTPControlComboBoxEditCtrl)
ON_WM_CHAR()
END_MESSAGE_MAP()
void CControlComboBoxEditEx::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CString strChar((TCHAR)nChar), strUpper((TCHAR)nChar);
strUpper.MakeUpper();
if (strChar != strUpper) ReplaceSel(strUpper, TRUE);
else CXTPControlComboBoxEditCtrl::OnChar(nChar, nRepCnt, nFlags);
}
3、 重载实现CControlComboBoxEx的CreateEditControl成员
class CControlComboBoxEx: public CXTPControlComboBox
{
DECLARE_XTP_CONTROL(CControlComboBoxEx)
public:
CXTPControlComboBoxEditCtrl* CreateEditControl()
{
return new CControlComboBoxEditEx();
}
};
IMPLEMENT_XTP_CONTROL(CControlComboBoxEx, CXTPControlComboBox)
4、 增加CControlComboBoxEx新成员对内嵌CXTPControlComboBoxEditCtrl进行数据交换操作
class CControlComboBoxEx: public CXTPControlComboBox
{
...
protected:
void Copy(CXTPControl* pControl, BOOL bRecursive = FALSE);
virtual void DoPropExchange(CXTPPropExchange* pPX);
protected:
CString m_strMask;
};
void CControlComboBoxEx::Copy(CXTPControl* pControl, BOOL bRecursive)
{
ASSERT_KINDOF(CControlComboBoxEx, pControl);
m_strMask = ((CControlComboBoxEx*)pControl)->m_strMask;
CXTPControlComboBox::Copy(pControl, bRecursive);
}
void CControlComboBoxEx::DoPropExchange(CXTPPropExchange* pPX)
{
CXTPControlComboBox::DoPropExchangepPX);
PX_String(pPX, _T("Mask"), m_strMask);
}
5、 在CMainFrame类的OnCreateControl成员里面添加CControlComboBoxEx控件,资源ID为ID_POPUP_COMBO
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
ON_XTP_CREATECONTROL()
END_MESSAGE_MAP()
int CMainFrame::OnCreateControl(LPCREATECONTROLSTRUCT lpCreateControl)
{
if (lpCreateControl->nID == ID_POPUP_COMBO)
{
CXTPControlComboBox* pComboFind = (CXTPControlComboBox*)CControlComboBoxEx::CreateObject();
pComboFind->SetDropDownListStyle();
pComboFind->SetFlags(xtpFlagManualUpdate);
lpCreateControl->pControl = pComboFind;
return TRUE;
}
return FALSE;
}