捣腾了两天,终于把visual studio 2010里的多编程搞出点头绪了。

一上来难住我的就是从来没有用过的ribbon。这个东西就相当于是一个容器,可以通过写代码的方式添加控件、进行属性的设置,也可以利用资源编辑器进行编辑,编辑完之后会有一个xml文件,记录着ribbon的布局和属性。

一开始是认为ribbon上的控件必须要对应着MainFrame或者CXXXXView或者CXXXXDoc类才能使用,后来发现不是这样的,ribbon其实也是个资源,在哪里都能用,只不过是方便跟不方便的区别而已。我看了一些例子,都是在CXXXXDoc里进行控件的设置与get()set()方法的编写,后来自己尝试着把代码全部移动到CXXXXView里,功能还是一样可以实现的。

在ribbon里,每一个控件都有两个Message(其实除了基于DLG的,基于SDI和MDI的MFC程序都会有两个Message),并且要通过这种方式来添加。

基于多文档窗口编程的小心得_第1张图片

添加时可以看到有两种方式:COMMAND和UPDATE_COMMAND_UI

基于多文档窗口编程的小心得_第2张图片

COMMAND与UPDATE_COMMAND_UI都是什么东西呢?

其实顾名思义,COMMAND主要用来处理该控件的逻辑事件,就是按下按钮(或者选中复选框)时要做什么。UPDATE_COMMAND_UI就主要用来处理该控件的样子,即按下按钮(或者先中复选框)时这个控件是什么样子的,按钮是可用的还是不可用的,复选框中选中的还是未选中的。这些都可以通过传入的CCmdUI *pCmdUI来进行设置。比如:

   
   
   
   
  1. void CMyRibbonTestView::OnUpdateCheckRectangle(CCmdUI *pCmdUI) 
  2.     // TODO: Add your command update UI handler code here 
  3.     pCmdUI->SetCheck(TRUE); 

因为有了ribbon这个东西,假如你跟我一样用的是xml的方式编辑ribbon的话,获取控件的指针就变得稍微有点麻烦了。可能会需要使用这种方式:

假如我要获取一个ComboBox的当前选择项:

   
   
   
   
  1. CMFCRibbonBar* pRibbon = ((CMDIFrameWndEx*) AfxGetMainWnd())->GetRibbonBar(); 
  2. ASSERT_VALID(pRibbon); 
  3.  
  4. CMFCRibbonComboBox* pComboBox DYNAMIC_DOWNCAST(CMFCRibbonComboBox,  pRibbon->FindByID(ID_COMBO_LINEWEIGHT)); 
  5.  
  6. int sel = pComboBox->GetCurSel() + 1;