zoukankan      html  css  js  c++  java
  • 【2016.3.30项目技术记录】]VS2010自动生成MFC单文档框架程序的修改:去除属性框,在CViewTree类中添加鼠标单击响应

    转自http://blog.csdn.net/yanfeiouc2009/archive/2010/06/07/5653360.aspx

    手头上有个东西要用到单文档,由于想省事,直接用VS2010做了。刚生成的代码直接编译后会有Output、Property、Workspace和我们主程序的CxxView窗口。并且在WorkSpace窗口中添加了了树控件,在Workspace窗口中预添加了两个属性页(类视图和文件视图)。感觉ms做的比较周到,但我不需要这么多窗口,只好把某些窗口注释掉。

    1、去掉窗口(使用)。在“MainFrm.h”中找到相应窗口对象的定义,将他们注释掉,注释后的Output 和 Property 窗口的定义如下:

    ..........

    // COutputWnd        m_wndOutput; //去掉输出窗口, 2010.06.07
    // CPropertiesWnd    m_wndProperties;//去掉属性窗口, 2010.06.07

    ..........

    然后再通过搜索,将所有含有 m_wndOutput 和 m_wndProperties  的代码段注释掉:

    “MainFrm.cpp”中

    ..........

    //去掉输出窗口, 2010.06.07
     
     //去掉属性窗口, 2010.06.07

    ..............

    //去掉输出窗口, 2010.06.07

     
     //去掉属性窗口, 2010.06.07

    ..........

    //去掉输出窗口, 2010.06.07

     //去掉属性窗口, 2010.06.07

    ...............

    // m_wndOutput.UpdateFonts();//去掉输出窗口, 2010.06.07

    ...............

    将上述代码注释掉后再运行,就会发现单文档中没有了输出窗口和属性窗口。

    2、修改Workspace窗口。

    1)修改属性页名字。由于预生成的两个属性页的名字是以字符串资源形式存在工程中的,因此只需将相应资源改为我们想用的名字即可。

    在资源窗口中,打开String table 选项,将相应的“类视图”和“文件视图”对应的字符串资源修改为我们想要的字符串即可。

    2)修改树控件。vs2010为我们预添加了许多“树项”,我们需要将其注释掉或修改为自己的项名。

    要注释掉的代码在ClassView.cpp中:

    void CClassView::FillClassView()
    {
     HTREEITEM hRoot = m_wndClassView.InsertItem(_T("控制器"), 0, 0);//要保留的我定义的一个树项
     m_wndClassView.SetItemState(hRoot, TVIS_BOLD, TVIS_BOLD);

     
    }

    3)使树项响应鼠标单击事件。直接生成的树控件中仅能实现鼠标单击选中、打开、折叠树项的功能,而不受我们的控制,我尝试在CTreeView中添加WM_LBUTTONDOWN消息,发现只能响应树中空白处的单击,而一旦单击了某项就没有反应。因此我在NM_CLICK消息中添加了如下代码,终于实现了控制树控件中鼠标单击事件响应的目的。以下是单击后改变项的名称的例子:

    void CViewTree::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
    {
     // TODO: Add your control notification handler code here
     //测试
     //AfxMessageBox(_T("CViewTree::OnLButtonUp"));

    // 获取当前选择的项
     CTreeCtrl* pTreeCtrl = this;
     CPoint ptCurSel(0,0);
     TVHITTESTINFO HitTestInfo;
     // 通过鼠标在客户区中的位置
     GetCursorPos(&ptCurSel);
     pTreeCtrl->ScreenToClient(&ptCurSel);  
     // 获取当前选择的是哪一项
     HitTestInfo.pt = ptCurSel;  
     HTREEITEM hSelect = pTreeCtrl->HitTest(&HitTestInfo);
     
     if(hSelect != NULL)
     {
      CString strItem = pTreeCtrl->GetItemText(hSelect);
      ::AfxMessageBox( strItem);
     }
     // 设置该项为选中状态
     pTreeCtrl->SelectItem(hSelect);
      
     //以下方法获取的是上一次处于选中状态的项首先将点击的对象选中
     CTreeCtrl* pTreeCtrl = this;
     HTREEITEM hSelect = pTreeCtrl->GetSelectedItem();
     HTREEITEM hLight = pTreeCtrl->GetDropHilightItem();
     if((hLight != NULL) && (hSelect != hLight))
      hSelect = hLight;
     if(hSelect   ==   NULL)
      return;
     pTreeCtrl->SelectItem(hSelect);

     //编辑当前选中对象名称
     pTreeCtrl->EditLabel(hSelect);
     if( NULL != hSelect )
     {
      CString strItem = pTreeCtrl->GetItemText(hSelect);
      if(strItem == _T("控制器"));
      {
       pTreeCtrl->SetItemText(hSelect, _T("改变后的控制器"));
      }
      ::AfxMessageBox( strItem); 
     }
     

     *pResult = 0;
    }

  • 相关阅读:
    Codeforces 672D
    Codeforces 672C
    Codeforces 673D
    Codeforces 1181D
    Codeforces 1181C
    Codeforces 1011F
    Codeforces 1011E
    2020.1.3计导全面复习
    csp模拟题-201903
    CCF模拟题-201909
  • 原文地址:https://www.cnblogs.com/freesblog/p/5337911.html
Copyright © 2011-2022 走看看