Chinaunix首页 | 论坛 | 博客
  • 博客访问: 267977
  • 博文数量: 45
  • 博客积分: 1618
  • 博客等级: 上尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-11 10:13
文章分类

全部博文(45)

文章存档

2012年(1)

2011年(25)

2010年(19)

我的朋友

分类: C/C++

2011-02-23 10:19:37

在默认情况下SDI的风格是传统界面的,如果要修改为Office2007风格,就需要用到到几个Ex的对象了,比如CFrameWndEx、CWinAppEx这两个类,修改很简单,只需要将CFrameWnd和CWinApp直接修改为CFrameWndEx、CWinAppEx即可,注意的是在类的实现里面一定要修改IMPLEMENT_DYNCREATE(CBridgeWindow, CFrameWndEx)这一句,否则MFC是不能够自己检测到CBridgeWindow类继承自CFrameWndEx,而是还认为继承自CFrameWnd。微软的官方文档为
主要为两个地方修改代码

BOOL CBridgeApp::InitInstance()
{
/*    CRuntimeClass* pRuntimeClass = RUNTIME_CLASS(CBridgeWindow);
    //CBridgeWindow必须有一个缺省构造函数
    CObject* pObject = pRuntimeClass->CreateObject();
    //用IsKindOf检测是否是CBridgeWindow类的实例
    ASSERT(pObject->IsKindOf(RUNTIME_CLASS(CBridgeWindow)));
    m_pMainWnd =(CWnd *) pObject;*/

    // 如果一个运行在 Windows XP 上的应用程序清单指定要
    // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
    //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
    INITCOMMONCONTROLSEX InitCtrls;
    InitCtrls.dwSize = sizeof(InitCtrls);
    // 将它设置为包括所有要在应用程序中使用的
    // 公共控件类。此函数是为使用控件所必需的,但是暂时我们用不到,屏蔽掉
    InitCtrls.dwICC = ICC_WIN95_CLASSES;
//    InitCommonControlsEx(&InitCtrls);
//    CWinAppEx::InitInstance();
    // 初始化 OLE 库,必须添加Ole支持
    if (!AfxOleInit())
    {
        AfxMessageBox("OLE init Error");
        return FALSE;
    }
    CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,
    RUNTIME_CLASS(CBridgeDoc),
    RUNTIME_CLASS(CBridgeWindow), // main SDI frame window
    RUNTIME_CLASS(CBridgeView));
    if (!pDocTemplate)
    return FALSE;
    AddDocTemplate(pDocTemplate);
    // 分析标准 shell 命令、DDE、打开文件操作的命令行
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);
    SetRegistryKey(_T("最简SDI模拟"));
    //LoadStdProfileSettings(0); // 加载标准 INI 文件选项(包括 MRU)
    // 调度在命令行中指定的命令。如果
    // 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。
    if (!ProcessShellCommand(cmdInfo))
        return FALSE;
    m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
    m_pMainWnd->UpdateWindow();
    return TRUE;
}

下面就是框架类了,所有的风格控制均在框架类里面实现,处理Create消息,添加OnCreate函数

int CBridgeWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
        return -1;
    // 基于持久值设置视觉管理器和样式
    //下面几行代码是设置程序风格的,SetStyle里面我是保留了一种风格
    CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);
    CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));
    CDockingManager::SetDockingMode(DT_SMART);
    m_wndRibbonBar.SetWindows7Look(false);
    RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);
   
// 创建窗口
    m_wndRibbonBar.Create(this);

    // 载入ribbon资源,在这里我们需要提前创建这样一个资源
    m_wndRibbonBar.LoadFromResource(IDR_RIBBON);
    // 启用 Visual Studio 2005 样式停靠窗口行为
//    CDockingManager::SetDockingMode(DT_SMART);
    // 启用 Visual Studio 2005 样式停靠窗口自动隐藏行为
//    EnableAutoHidePanes(CBRS_ALIGN_ANY);
    // 导航窗格将创建在左侧,因此将暂时禁用左侧的停靠:
//    EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM | CBRS_ALIGN_RIGHT);
    return 0;
}

需要注意的就是我们要创建一个ribbon的资源这样既可生成一个office2007风格的程序空框架,下面就在添加又有的功能
阅读(3064) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~