XTP界面在Dialog里的实现

1,确定你已经装好了XTP。
2,修改目录:工具/选项/目录 
    include files  :  D:\Microsoft Visual Studio\Xtreme ToolkitPro v11.2.2\Source
    librarys files :  D:\Microsoft Visual Studio\Xtreme ToolkitPro v11.2.2\Lib\vc60
3,工程/设置/C++  在工程选项里面添加:/Zm200 注意大小写。
4,在stdAfx.h里面添加:#include <XTToolkitPro.h>
5, 在Dialog.h文件中,Dialog定义的地方改为:
#define CDialogSampleDlgBase CXTPDialogBase<CXTResizeDialog>
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("Office2007.cjstyles"));//这句是设置一种风格,Office2007.cjstyles是风格文件名,要拷贝过来。

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) || (rcClientStart.IsRectEmpty()))
  return;

m_bInRepositionControls = TRUE;

RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0, reposQuery, rcClientNow);

CRect rcBorders(rcClientNow.left - rcClientStart.left, rcClientNow.top - rcClientStart.top,  rcClientStart.right - rcClientNow.right,
  rcClientStart.bottom - rcClientNow.bottom);

if (rcBorders != m_rcBorders)
{
 
  CPoint ptOffset(rcBorders.left - m_rcBorders.left, rcBorders.top - m_rcBorders.top);
  CSize szOffset(rcBorders.left + rcBorders.right - m_rcBorders.left - m_rcBorders.right,
  rcBorders.top + rcBorders.bottom - m_rcBorders.top - m_rcBorders.bottom);
 
  CRect rcWindow;
  GetWindowRect(rcWindow);
  rcWindow.BottomRight() += 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_wndStatusBar.Create(this) ||
  !m_wndStatusBar.SetIndicators(indicators,
  sizeof(indicators)/sizeof(UINT)))
{
  TRACE0("Failed to create status bar\n");
  return -1;      // fail to create
}
m_wndStatusBar.SetPaneInfo(0, ID_SEPARATOR, SBPS_STRETCH, 100);
在合适的地方调用m_wndStatusBar.SetWindowText(lpsz);即可设置显示文本

/***下面这句有时间看看**/
LRESULT CDialogSampleDlg::OnKickIdle(WPARAM, LPARAM)
{
if (GetCommandBars()) GetCommandBars()->UpdateCommandBars();
if (m_wndStatusBar.GetSafeHwnd()) m_wndStatusBar.SendMessage(WM_IDLEUPDATECMDUI, TRUE);
return 0;
}

原文地址:https://www.cnblogs.com/aoyihuashao/p/1623692.html