CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

如何重载CSplitterWnd类,实现分割栏上有铵钮的功能?

楼主xjl1980_81(什么都不会)2006-04-29 10:17:23 在 VC/MFC / 界面 提问

RT。  
  最好能提供实现的源码。  
  我找了,可是在网上没有找到。 问题点数:100、回复次数:52Top

1 楼laiyiling(陌生人[MVP])回复于 2006-04-29 10:55:35 得分 0

参考  
  http://dev.csdn.net/develop/article/28/28424.shtm  
  改变大小后就可以随便创建控件了,指定parent   windowTop

2 楼lixiaosan(小三)回复于 2006-04-29 11:02:18 得分 0

从CSplitterWnd派生一个类来处理Top

3 楼sycnick(李小虾)回复于 2006-04-29 11:03:19 得分 0

派生,恩Top

4 楼lixiaosan(小三)回复于 2006-04-29 11:06:55 得分 0

http://www.codeproject.com/splitter/toolbar_splitter.aspTop

5 楼lixiaosan(小三)回复于 2006-04-29 11:09:34 得分 0

http://www.codeguru.com/Cpp/W-D/splitter/  
   
  Top

6 楼xjl1980_81(什么都不会)回复于 2006-04-29 11:50:06 得分 0

好像没有类似的具体实例?  
  上面的几个地址没有实现我的意思?  
   
  我想要类似于Foxmail那样的效果。Top

7 楼chib(天宇)回复于 2006-04-29 15:26:12 得分 0

同意小三  
  Top

8 楼xjl1980_81(什么都不会)回复于 2006-04-29 15:44:28 得分 0

小三  
  所说的  
  http://www.codeproject.com/splitter/toolbar_splitter.asp  
   
  没有DEMO的。  
  Top

9 楼lypdl()回复于 2006-04-29 15:52:04 得分 0

谁能详细的讲解一下么!!!!!!Top

10 楼lypdl()回复于 2006-04-29 15:59:38 得分 0

我想这里没有能解决的高手拉!!!!!Top

11 楼lypdl()回复于 2006-04-29 16:01:12 得分 0

中国vc++的高手太少拉,悲哀呀,Top

12 楼coolzdp(unreal张师傅)回复于 2006-04-29 23:06:22 得分 0

同样关注此问题  
  谁回答了可以顺便到这领分  
  http://community.csdn.net/Expert/topic/4713/4713460.xml?temp=.175213  
   
  我知道是派生CSplitterWnd画分隔条。  
  可是具体怎么搞?  
   
  另外不但是有把手。而且要鼠标经过把手时还是鼠标箭头。  
  在分隔条其他地方才是==Top

13 楼goodboyws(深夜不眠者(VCMVP))回复于 2006-04-29 23:09:03 得分 0

这种东西没必要用CSplitterWnd,直接处理鼠标消息就可以了Top

14 楼coolzdp(unreal张师傅)回复于 2006-04-29 23:17:03 得分 0

总的在分隔条中间有个按钮提示吧!  
   
  为什么大家都是侃侃而谈却没一个人给个具体的思路?Top

15 楼goodboyws(深夜不眠者(VCMVP))回复于 2006-04-29 23:21:41 得分 0

BEGIN_MESSAGE_MAP(CChatroomDlg,   CDialog)  
  //{{AFX_MSG_MAP(CChatroomDlg)  
  ON_WM_MOUSEMOVE()  
  //}}AFX_MSG_MAP  
  ON_MESSAGE(WM_MOUSELEAVE,   OnMouseLeave)  
  END_MESSAGE_MAP()  
  void   CChatroomDlg::OnMouseMove(UINT   nFlags,   CPoint   point)    
  {  
  //   TODO:   Add   your   message   handler   code   here   and/or   call   default  
  if   (!m_bInWindow)  
  {  
  //鼠标指针从窗口外进入窗口的时候,设定一个离开监控,并且将窗口类的鼠标指针设为空  
  TRACKMOUSEEVENT   TrackEvent;  
  ZeroMemory(&TrackEvent,   sizeof(TRACKMOUSEEVENT));  
  TrackEvent.cbSize   =   sizeof   (TRACKMOUSEEVENT);  
  TrackEvent.dwFlags   =   TME_LEAVE;  
  TrackEvent.hwndTrack   =   m_hWnd;  
  _TrackMouseEvent(&TrackEvent);  
  m_bInWindow   =   TRUE;  
  if   (GetClassLong(m_hWnd,   GCL_HCURSOR))  
  SetClassLong(m_hWnd,   GCL_HCURSOR,   NULL);  
  }  
                    CDialog::OnMouseMove(nFlags,   point);  
  if   (nFlags   &   MK_LBUTTON)  
  {  
  HandleSize(point);  
  }  
  else  
  {  
  HandleCursor(point);  
  }  
   
  }  
  void   CChatroomDlg::HandleCursor(CPoint   point)  
  {  
                      //中间的工具条  
                    if   (PtInRect(&m_BackInfo.rcMid,   point))  
  {  
  m_eSizeMode   =   SizeMid;  
  SetCursor(LoadCursor(NULL,     MAKEINTRESOURCE(IDC_SIZENS)));  
  }  
  else  
  {  
  m_eSizeMode   =   SizeNULL;  
  SetCursor(LoadCursor(NULL,     MAKEINTRESOURCE(IDC_ARROW)));  
  }  
  }  
  int   CChatroomDlg::HandleSize(CPoint   point)  
  {  
  CPoint   ptScreen   =   point;  
  ClientToScreen(&ptScreen);  
  CRect   rc,   rcWindow;  
  //根据上一点坐标确定偏移的SIZE  
  CSize   size   =   ptScreen   -   m_ptLast;  
  if   (size.cx   ==0   &&   size.cy==   0)  
  return   0;  
  rc   =   m_BackInfo.rc;  
  int   up   =   m_BackInfo.iUP;  
  GetWindowRect(rcWindow);  
     
                    if   (m_eSizeMode   =   SizeMid)  
        m_BackInfo.iUP   +=   size.cy;  
  //边界检查  
  if   (rc.Width()   <   300   ||   rc.Height()   <   300   ||   rc.bottom   -   m_BackInfo.sizeTopLeft.cy   -   m_BackInfo.iUP   -   m_BackInfo.sizeMidLeft.cy   -   m_BackInfo.sizeBottomLeft.cy   <   28)  
  {  
  m_BackInfo.iUP   =   up;  
  return   -1;  
  }  
  m_ptLast   =   ptScreen;  
  ResetCtrlPos();  
   
  Invalidate(FALSE);  
  UpdateWindow();  
  return   0;  
  }  
  LRESULT   CChatroomDlg::OnMouseLeave(WPARAM   wparam,   LPARAM   lparam)  
  {  
  //将窗口类指针设为原来的  
  SetClassLong(m_hWnd,   GCL_HCURSOR,   (long)LoadCursor(NULL,     MAKEINTRESOURCE(IDC_ARROW)));  
  m_bInWindow   =   FALSE;  
  return   0;  
  }Top

16 楼coolzdp(unreal张师傅)回复于 2006-04-29 23:28:21 得分 0

没发现创建分割条按钮:<Top

17 楼goodboyws(深夜不眠者(VCMVP))回复于 2006-04-29 23:33:16 得分 0

晕,对话框资源就可以搞定啊Top

18 楼goodboyws(深夜不眠者(VCMVP))回复于 2006-04-29 23:36:00 得分 0

同样的事情可以有不同的做法,所谓CSplitterWnd实际上就是一种模式,当你自己要定制的东西越来越多,这种模式就会越来越不适合你,或许放弃它是一种更好的选择Top

19 楼coolzdp(unreal张师傅)回复于 2006-04-29 23:45:00 得分 0

高手看问题的思路就是不一样啊。  
  但是定制自己的东西是建立在有一定基础上的阿。  
   
  对话框程序可以直接加按钮。  
  单文档呢,怎么在分割条中间做个按钮阿:<Top

20 楼tomtom123(abc)回复于 2006-04-30 00:36:16 得分 0

MARKTop

21 楼lypdl()回复于 2006-04-30 08:02:19 得分 0

我就想在csplitter上作怎么办,???有高手会么???Top

22 楼lypdl()回复于 2006-04-30 13:09:51 得分 0

怎么样没人会拉!!!!  
   
   
  Top

23 楼lypdl()回复于 2006-04-30 14:26:18 得分 0

我就想在csplitter上作怎么办,???有高手会么???Top

24 楼cut9(切瓜玩)回复于 2006-05-07 13:32:58 得分 0

markTop

25 楼coolzdp(unreal张师傅)回复于 2006-05-07 22:29:03 得分 0

upTop

26 楼coolzdp(unreal张师傅)回复于 2006-05-07 22:29:18 得分 0

楼主找到了别忘了ps我一个3qTop

27 楼shmily1280(锄禾)回复于 2006-05-08 08:38:22 得分 0

学习之  
  人肉UPTop

28 楼xjl1980_81(什么都不会)回复于 2006-05-08 09:10:37 得分 0

我也没有找到。  
  有人找到了吗?  
   
  从SplitterWnd派生出的。Top

29 楼lypdl()回复于 2006-05-08 10:58:58 得分 0

我也没有找到。  
  有人找到了吗?  
   
  从SplitterWnd派生出的。Top

30 楼email_jhb()回复于 2006-05-08 11:52:39 得分 0

我也想知道怎么做。不过上面的高手们讲的话太哲学、太抽象了。我都听不太懂。有没有实践过的?Top

31 楼xjl1980_81(什么都不会)回复于 2006-05-08 13:37:58 得分 0

是呀。最好能有个从SplitterWnd派生的Sample。  
  等待中Top

32 楼SoLike(思危)回复于 2006-05-09 17:16:11 得分 0

哈哈,现在人真是幸福,有问题可以上CSDN发帖子。  
  俺学VC的时候,除了看MSDN,什么都得自己动手做。Top

33 楼SoLike(思危)回复于 2006-05-09 17:33:22 得分 0

刚才动了下手,2分钟搞定,给邮箱或QQ、MSN什么的,传你,俺明天要去北京出差了,上网不便啊Top

34 楼email_jhb()回复于 2006-05-10 06:59:21 得分 0

email_jhb@yahoo.com.cn  
  Top

35 楼xjl1980_81(什么都不会)回复于 2006-05-10 08:50:17 得分 0

xujianlong1980@163.comTop

36 楼ribut9225(幽灵庄主)回复于 2006-05-10 09:14:11 得分 0

ribut9225@163.com  
  谢谢  
  同享啊Top

37 楼SoLike(思危)回复于 2006-05-10 17:14:14 得分 0

发了Top

38 楼email_jhb()回复于 2006-05-10 19:03:19 得分 0

可以,不过没看到分割条上有按钮,另外拖动分割条后,视图上会产生一些脏块,是什么原因?Top

39 楼SoLike(思危)回复于 2006-05-10 19:47:34 得分 0

拖动就出现了,重绘有问题,俺坐车去了,回来再说吧Top

40 楼lypdl()回复于 2006-05-11 10:08:28 得分 0

lypdl@163.com  
   
  给我一份好么???Top

41 楼lypdl()回复于 2006-05-11 16:34:35 得分 0

怎么没回音拉?????  
  谁传给我一个好么???  
   
  lypdl@163.com  
  Top

42 楼coolzdp(unreal张师傅)回复于 2006-05-11 16:39:12 得分 0

zdp-110@163.com  
  谢谢大哥别忘了阿Top

43 楼lypdl()回复于 2006-05-12 08:08:09 得分 0

怎么没回音拉?????  
  谁传给我一个好么???  
   
  lypdl@163.com  
  Top

44 楼coolzdp(unreal张师傅)回复于 2006-05-15 10:58:31 得分 0

upTop

45 楼lypdl()回复于 2006-05-15 15:34:40 得分 0

怎么没回音拉?????  
  谁传给我一个好么???  
   
  lypdl@163.comTop

46 楼coolzdp(unreal张师傅)回复于 2006-05-15 18:01:50 得分 0

我找到例子了.很不错  
  谁要在此留言开贴给我分我给他Top

47 楼njg_jh(糨糊)回复于 2006-05-15 18:08:03 得分 0

//   MySplitterWnd.cpp   :   implementation   file  
  //  
   
  #include   "stdafx.h"  
  #include   "SplitterWnd.h"  
  #include   "MySplitterWnd.h"  
   
  #ifdef   _DEBUG  
  #define   new   DEBUG_NEW  
  #undef   THIS_FILE  
  static   char   THIS_FILE[]   =   __FILE__;  
  #endif  
   
  /////////////////////////////////////////////////////////////////////////////  
  //   CMySplitterWnd  
   
  IMPLEMENT_DYNCREATE(CMySplitterWnd,   CSplitterWnd)//CMDIChildWnd)  
   
  CMySplitterWnd::CMySplitterWnd()  
  {  
  //{{设置Splitter的宽度  
  m_cxSplitter   =   m_cySplitter   =   50;  
  m_cxSplitterGap   =   m_cySplitterGap   =   50;  
  //}}  
  }  
   
  CMySplitterWnd::~CMySplitterWnd()  
  {  
  }  
   
   
  BEGIN_MESSAGE_MAP(CMySplitterWnd,   CSplitterWnd)//CMDIChildWnd)  
  //{{AFX_MSG_MAP(CMySplitterWnd)  
  ON_WM_CREATE()  
  //}}AFX_MSG_MAP  
  END_MESSAGE_MAP()  
   
  void   CMySplitterWnd::StopTracking(BOOL   bAccept)  
  {  
  BOOL   bTracking   =   m_bTracking;  
  CSplitterWnd::StopTracking(bAccept);  
  if(bTracking)  
  {  
  AdjustButton();  
  }  
  }  
   
  void   CMySplitterWnd::RecalcLayout()  
  {  
  CSplitterWnd::RecalcLayout();  
  AdjustButton();  
  }  
  /////////////////////////////////////////////////////////////////////////////  
  //   CMySplitterWnd   message   handlers  
   
  int   CMySplitterWnd::OnCreate(LPCREATESTRUCT   lpCreateStruct)    
  {  
  if   (CSplitterWnd::OnCreate(lpCreateStruct)   ==   -1)  
  return   -1;  
   
  //   TODO:   Add   your   specialized   creation   code   here  
  m_bt.Create("BT",   WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,   CRect(0,0,0,0),   this,   1);  
  return   0;  
  }  
   
  void   CMySplitterWnd::AdjustButton()  
  {  
  if(m_bt.GetSafeHwnd())  
  {  
  CRect   rect;  
  GetClientRect(rect);  
  rect.left   +=   m_cxBorder;  
   
  //column   split   bars  
  for   (int   col   =   0;   col   <   m_nCols   -   1;   col++)  
  {  
  rect.left   +=   m_pColInfo[col].nCurSize   +   m_cxBorderShare;  
  rect.right   =   rect.left   +   m_cxSplitter;  
  // rect.left   =   rect.right   +   m_cxBorderShare;//如果有多个Splitter的话,在这句之前移动Button  
  }  
   
  //此例子只演示了column   split   bars  
  //   row   split   bars  
  /* GetClientRect(rect);  
  rect.top   +=   m_cyBorder;  
  for   (int   row   =   0;   row   <   m_nRows   -   1;   row++)  
  {  
  rect.top   +=   m_pRowInfo[row].nCurSize   +   m_cyBorderShare;  
  rect.bottom   =   rect.top   +   m_cySplitter;  
  rect.top   =   rect.bottom   +   m_cyBorderShare;  
  }  
  */  
  CRect   rcBt;  
  rcBt.top   =   rect.Height()   /   2   -   100   +   rect.top;  
  rcBt.bottom   =   rcBt.top   +   200;  
  rcBt.left   =   rect.left   +   10;  
  rcBt.right   =   rect.right   -   10;  
  m_bt.MoveWindow(&rcBt);  
  }  
  }Top

48 楼njg_jh(糨糊)回复于 2006-05-15 18:08:26 得分 0

#if   !defined(AFX_MYSPLITTERWND_H__32435610_FF35_4766_89B5_78078C8047E5__INCLUDED_)  
  #define   AFX_MYSPLITTERWND_H__32435610_FF35_4766_89B5_78078C8047E5__INCLUDED_  
   
  #if   _MSC_VER   >   1000  
  #pragma   once  
  #endif   //   _MSC_VER   >   1000  
  //   MySplitterWnd.h   :   header   file  
  //  
   
  /////////////////////////////////////////////////////////////////////////////  
  //   CMySplitterWnd   frame   with   splitter  
   
  #ifndef   __AFXEXT_H__  
  #include   <afxext.h>  
  #endif  
   
  class   CMySplitterWnd   :   public   CSplitterWnd//CMDIChildWnd  
  {  
  DECLARE_DYNCREATE(CMySplitterWnd)  
  public:  
  CMySplitterWnd();                       //   protected   constructor   used   by   dynamic   creation  
   
  //   Attributes  
  public:  
   
  //   Operations  
  public:  
   
  //   Overrides  
  //   ClassWizard   generated   virtual   function   overrides  
  //{{AFX_VIRTUAL(CMySplitterWnd)  
  protected:  
  //}}AFX_VIRTUAL  
   
  //   Implementation  
  public:  
  virtual   ~CMySplitterWnd();  
   
  //   Generated   message   map   functions  
  //{{AFX_MSG(CMySplitterWnd)  
  afx_msg   int   OnCreate(LPCREATESTRUCT   lpCreateStruct);  
  //}}AFX_MSG  
  DECLARE_MESSAGE_MAP()  
  protected:  
  void   AdjustButton();  
  CButton   m_bt;  
  virtual   void   StopTracking(BOOL   bAccept);  
  public:  
  virtual   void   RecalcLayout();  
  };  
   
  /////////////////////////////////////////////////////////////////////////////  
   
  //{{AFX_INSERT_LOCATION}}  
  //   Microsoft   Visual   C++   will   insert   additional   declarations   immediately   before   the   previous   line.  
   
  #endif   //   !defined(AFX_MYSPLITTERWND_H__32435610_FF35_4766_89B5_78078C8047E5__INCLUDED_)Top

49 楼lemonxinmei330()回复于 2006-05-16 11:17:47 得分 0

justin@probenetwork.comTop

50 楼T97102003(池塘里的水手)回复于 2006-05-16 11:42:33 得分 0

t97102003@163.com  
  thankTop

51 楼lypdl()回复于 2006-05-16 12:01:12 得分 0

lypdl@163.comTop

52 楼livjian(想翅膀的猪)回复于 2006-05-16 12:31:39 得分 0

livjian@163.com  
  THANKSTop

相关问题

关键词

得分解答快速导航

  • 帖主:xjl1980_81

相关链接

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

广告也精彩

反馈

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