CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

关于使用标签视后菜单消息命令的奇怪问题(高分重谢)

楼主zickphy(幸福是可望不可及)2004-02-02 18:23:51 在 VC/MFC / 界面 提问

MFC的SDI程序,重载CMainFrame类的OnCreateClient函数,使用一个标签视:  
  BOOL   CMainFrame::OnCreateClient(LPCREATESTRUCT   lpcs,   CCreateContext*   pContext)  
  {  
  if(!m_wndTab.Create(WS_BORDER   |   WS_CHILD   |   WS_VISIBLE   |   TCS_TABS   |   TCS_HOTTRACK,  
  CRect(0,   0,   0,   0),   this,   AFX_IDW_PANE_FIRST))  
  {  
  TRACE0("Failed   to   create   TabContainer!\n");  
  return   FALSE;  
  }  
  //m_wndTab.ModifyStyleEx(0,   WS_EX_CLIENTEDGE);  
   
  m_wndTab.AddView(_T("标签页1"),   pContext->m_pNewViewClass,   pContext,   -1);  
   
  return   TRUE;  
  }  
  m_wndTab为一CTabCtrl派生类的实例:  
  .h文件内容为:  
  class   CTabViewContainer   :   public   CTabCtrl  
  {  
  DECLARE_DYNCREATE(CTabViewContainer)  
   
  public:  
  CTabViewContainer();  
  virtual   ~CTabViewContainer();  
   
  BOOL   AddView(LPCTSTR   pszText,   CRuntimeClass   *pRT,   CCreateContext   *pContext   =   NULL,   int   nImage   =   -1);  
  void   ChangeView(int   nIndex);  
  CWnd   *   GetSelView(void);  
   
  protected:  
  DECLARE_MESSAGE_MAP()  
   
  public:  
  afx_msg   void   OnSize(UINT   nType,   int   cx,   int   cy);  
  afx_msg   void   OnTcnSelchange(NMHDR   *pNMHDR,   LRESULT   *pResult);  
  afx_msg   void   OnTcnSelchanging(NMHDR   *pNMHDR,   LRESULT   *pResult);  
  };  
  .c文件内容为:  
  IMPLEMENT_DYNCREATE(CTabViewContainer,   CTabCtrl)  
  CTabViewContainer::CTabViewContainer()  
  {  
  }  
   
  CTabViewContainer::~CTabViewContainer()  
  {  
  }  
   
   
  BEGIN_MESSAGE_MAP(CTabViewContainer,   CTabCtrl)  
  ON_WM_SIZE()  
  ON_NOTIFY_REFLECT(TCN_SELCHANGE,   OnTcnSelchange)  
  ON_NOTIFY_REFLECT(TCN_SELCHANGING,   OnTcnSelchanging)  
  ON_WM_ERASEBKGND()  
  END_MESSAGE_MAP()  
   
   
   
  //   CTabViewContainer   消息处理程序  
   
  //   添加一个视图页  
  BOOL   CTabViewContainer::AddView(LPCTSTR   pszText,   CRuntimeClass   *pRT,   CCreateContext   *pContext,   int   nImage)  
  {  
  int   nIndex   =   this->GetItemCount();  
  CSize   sz(40,   20);  
  this->SetItemSize(sz);  
   
  TCITEM   tci;  
  tci.mask   =   TCIF_TEXT   |   TCIF_PARAM;  
  if   (nImage   !=   -1)  
  tci.mask   |=   TCIF_IMAGE;  
   
  CWnd   *pView   =   (CWnd   *)pRT->CreateObject();  
  pView->CreateEx(WS_EX_CLIENTEDGE,   NULL,   NULL,   WS_CHILD   |   WS_VISIBLE,  
  CRect(0,   0,   0,   0),   this,   nIndex,   pContext);  
   
  tci.pszText   =   (char   *)pszText;  
  tci.lParam   =   (LPARAM)pView;  
  tci.iImage   =   nImage;  
   
  this->InsertItem(nIndex,   &tci);  
  return   TRUE;  
  }  
   
  //   切换视图  
  void   CTabViewContainer::ChangeView(int   nIndex)  
  {  
  ASSERT(nIndex>=0);  
  int   nCount=GetItemCount();  
  ASSERT(nIndex<nCount);  
   
  int   nSel=GetCurSel();  
  TCITEM   tci;  
  CRect   rc;  
  tci.mask   =   TCIF_PARAM;  
  if(nSel!=nIndex)  
  {  
  this->GetItem(nSel,   &tci);  
  CWnd   *pView   =   (CWnd   *)tci.lParam;  
  pView->SetWindowPos(NULL,   0,   0,   10,   10,   SWP_HIDEWINDOW   |   SWP_NOMOVE   |   SWP_NOSIZE   |   SWP_NOREDRAW   |   SWP_NOACTIVATE);  
  }  
  this->GetItem(nIndex,   &tci);  
  CWnd   *pView   =   (CWnd   *)tci.lParam;  
  this->GetClientRect(&rc);  
  rc.top   =   24;  
  pView->SetWindowPos(&CWnd::wndTop,   0,   24,   rc.right,   rc.bottom   -   24,   SWP_SHOWWINDOW);  
  SetCurSel(nIndex);  
  }  
   
  //   得到当前选中的视图索引  
  CWnd   *   CTabViewContainer::GetSelView(void)  
  {  
  int   nSel   =   GetCurSel();  
  TCITEM   tci;  
  CRect   rc;  
  tci.mask   =   TCIF_PARAM;  
  GetItem(nSel,   &tci);  
  return   ((CWnd   *)tci.lParam);  
  }  
   
  //   改变尺寸时,需要挪动子窗口  
  void   CTabViewContainer::OnSize(UINT   nType,   int   cx,   int   cy)  
  {  
  CTabCtrl::OnSize(nType,   cx,   cy);  
  CRect   rc(0,   24,   cx,   cy);  
  int   nSel   =   this->GetCurSel();  
  if   (nSel   >=   0)  
  {  
  TCITEM   tci;  
  tci.mask   =   TCIF_PARAM;  
  this->GetItem(nSel,   &tci);  
  CWnd   *pView   =   (CWnd   *)tci.lParam;  
  pView->MoveWindow(&rc);  
  }  
  }  
   
  void   CTabViewContainer::OnTcnSelchange(NMHDR   *pNMHDR,   LRESULT   *pResult)  
  {  
  int   nSel   =   this->GetCurSel();  
  ChangeView(nSel);  
  *pResult   =   0;  
  }  
   
  void   CTabViewContainer::OnTcnSelchanging(NMHDR   *pNMHDR,   LRESULT   *pResult)  
  {  
  int   nSel   =   this->GetCurSel();  
  TCITEM   tci;  
  tci.mask   =   TCIF_PARAM;  
  this->GetItem(nSel,   &tci);  
  CWnd   *pView   =   (CWnd   *)tci.lParam;  
  pView->SetWindowPos(NULL,   0,   0,   0,   0,   SWP_HIDEWINDOW   |   SWP_NOSIZE   |   SWP_NOMOVE   |   SWP_NOREDRAW   |   SWP_NOACTIVATE);  
  *pResult   =   0;  
  }  
   
  问题在于使用标签视后,在Doc和View类中新添加的菜单消息处理命令是灰色的,只能在MainFrame类中添加有效。更奇怪的是在View中只要鼠标左单击一下,Doc和View类中新添加的菜单消息处理命令就有效了。  
  请各位高手帮忙解决这个问题,高分重谢!!解决后开贴另加分。  
  编译环境是windows2000,vc++.net2002 问题点数:0、回复次数:4Top

1 楼lovenoend(有容乃大)回复于 2004-02-02 18:45:07 得分 0

太长了,要看完,眼睛会多了好多星星  
  帮你顶!Top

2 楼qfly()回复于 2004-02-02 18:55:00 得分 0

因为你的VIEW没有获得焦点。  
   
  在适当的地方(比如AddView()及CTabViewContainer获得焦点时)使用pView->SetFocus();Top

3 楼zickphy(幸福是可望不可及)回复于 2004-02-02 20:49:42 得分 0

试了,没有用,在Addview中使用了那句,没有效果,奇怪之极。  
  程序启动后工具条上存储按钮也是灰色的,也是要点击一下鼠标才变成有效啊!  
  还有什么办法没有??我实在是很晕啊Top

4 楼zickphy(幸福是可望不可及)回复于 2004-02-03 10:38:17 得分 0

upTop

相关问题

  • 请问如何在资源管理器的右键菜单中添加我自己的菜单,以及如何写我的菜单响应命令,谢谢
  • 如何在TD标签中捕获鼠标右键并弹出一个菜单让用户来选择,大家请帮忙了,谢谢!
  • 请问能否动态扩展菜单并相应菜单命令
  • 能否在程序里调用IE菜单命令?(内空)
  • help!!! 粘贴菜单命令变灰不可用
  • help!!! 粘贴菜单命令变灰不可用
  • 如何发送模拟菜单命令消息?
  • vc2005中的"类向导"菜单命令在哪?
  • PFC中标签控件和标签页怎么用,那个insert菜单怎么老是不能用(下拉菜单)?
  • 请问:pb中file下拉菜单中run/preview命令和debug下拉菜单下的run命令有什么区别吗?

关键词

  • ws
  • tci
  • ctabviewcontainer
  • nsel
  • cwnd
  • pview
  • wndtab
  • swp
  • 标签
  • addview

得分解答快速导航

  • 帖主:zickphy

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo