CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

VC++用了快8年了,遇上一个小问题都解决不了。-〉如何创建一个带滚动条的静态文本控件

楼主yoci(阿呸)2006-05-09 16:34:05 在 VC/MFC / 界面 提问

我做了一个类,从CStatic继承下来,目的是实现CScrollView的功能  
   
  在CStatic画图没有什么问题,很正常。  
  但是在滚动条的处理上遇到了一些困难。  
  我使用了两种方法创建滚动条,都能够在CStatic上产生滚动条,但是滚动条无法控制,也不相应WM_VSCROLL、WM_HSCROLL、WM_MOUSEWHEEL消息,只能相应STN_CLICKED。  
  这样一来就郁闷了,不能控制滚动条也就无法实现视图的滚动。  
   
  我是这样创建滚动CStatic的:  
  ///////////////////////  
  //1     在Create时定义WS_HSCROLL  
  CStatic   static;     //.h文件中定义一个类成员  
   
  static.Create("mmm",    
        WS_CHILD|WS_VISIBLE|SS_NOTIFY|WS_HSCROLL|WS_VSCROLL,    
      CRect(10,10,300,300),   this,1234);  
   
   
   
  ///////////////////////  
  //2     手动创建滚动条  
   
  SCROLLINFO   info;  
  info.cbSize   =   sizeof(SCROLLINFO);  
  info.fMask   =   SIF_PAGE|SIF_RANGE;  
  info.nMin   =   0;  
  info.nPage   =   20;  
  info.nMax   =   100;  
  if   (!static.SetScrollInfo(SB_HORZ,   &info,   TRUE))  
          static.SetScrollRange(SB_HORZ,   0,   100,   TRUE);  
   
   
  ////////////////////////////  
  请大家帮忙看看  
  谢谢 问题点数:200、回复次数:26Top

1 楼cpio(备注)回复于 2006-05-09 16:36:08 得分 30

直接从CWnd继承就行  
   
  HSCROLL和VSCROLL消息肯定能收到Top

2 楼SoLike(思危)回复于 2006-05-09 16:45:12 得分 0

要处理滚动条消息吧Top

3 楼SoLike(思危)回复于 2006-05-09 16:51:20 得分 10

99年开始学VC的,不知不觉7年混过去了Top

4 楼yoci(阿呸)回复于 2006-05-09 16:53:20 得分 0

SoLike()   :    
      当然要处理滚动条消息了,可是问题就是收不到HSCROLL消息。  
   
  cpio:  
      你说的方法我也试过了,从CWnd继承之后,在控件Create的时候,Create函数第一个参数是Window的类型。  
   
        CWnd*   pWnd   =   new   CWnd;  
        pWnd->Create(_T("STATIC"),   "Hi",   WS_CHILD   |   WS_VISIBLE,  
                CRect(0,   0,   20,   20),   this,   1234);  
   
  _T("STATIC"),不用它用什么好呢?Top

5 楼sycnick(李小虾)回复于 2006-05-09 16:56:02 得分 30

哈哈,原来楼主也遇到这个问题了,看来很普遍啊。  
   
  看看这个:  
  As   I   have   said:   Static   control   is   a   dumb   control   for   displaying   text   or   image   that   once   assigned   does   not   change.   That   is   why   is   called   static.   It   is   not   as   functional   as   other   controls.  
  You   would   have   to   write   a   code   to   redesign   static   control   and   I   do   not   think   it   is   desirable   and   moreover   justifiable.  
   
  If   you   have   a   code   already   written   in   your   CStatic   derived   class   you   can   easily   port   it.  
   
  But   if   you   insist,   do   this:  
  Remove   WS_HSCROLL   and   WS_VSCROLL   and   let   static   control   create   own   scroll   bars.  
  In   PreSubclassWindow   override   in   derived   class   for   example:  
   
   
  Code:  
                    CStatic::PreSubclassWindow();  
   
  UINT   uiHHeight   =   GetSystemMetrics(SM_CYHSCROLL);  
  UINT   uiVWidth   =   GetSystemMetrics(SM_CXVSCROLL);  
  CRect   rectClient,   rectH,   rectV;  
  GetClientRect(rectClient);  
  rectH   =   rectClient;  
  rectH.top   =   rectH.bottom   -   uiHHeight;  
  rectH.right   -=   uiVWidth;  
   
  rectV   =   rectClient;  
  rectV.left   =   rectV.right   -   uiVWidth;  
  rectV.bottom   -=   uiHHeight;  
   
  m_HScroll.Create(SBS_HORZ   |   SBS_BOTTOMALIGN   |   WS_CHILD   |   WS_VISIBLE,   rectH,   this,   1100);  
  m_VScroll.Create(SBS_VERT   |   SBS_RIGHTALIGN   |   WS_CHILD   |   WS_VISIBLE,   rectV,   this,   1101);  
   
  SCROLLINFO   sci;  
  memset(&sci,   0,   sizeof(sci));  
   
  sci.cbSize   =   sizeof(SCROLLINFO);  
  sci.fMask   =   SIF_ALL;  
  sci.nMax   =   1000;  
  sci.nPage   =   200;  
   
  m_HScroll.SetScrollInfo(&sci,   TRUE);  
  m_VScroll.SetScrollInfo(&sci,   TRUE);  
  Top

6 楼yoci(阿呸)回复于 2006-05-09 17:02:45 得分 0

cpio:  
  我试了一下,CWnd是可以的,用NULL指定Window类型就行了Top

7 楼yoci(阿呸)回复于 2006-05-09 17:04:33 得分 0

SoLike:  
      岁月催人老哦~~~     ^_^Top

8 楼mynamelj(风之羽翼)回复于 2006-05-09 17:14:22 得分 10

虚度光阴...Top

9 楼AgedBOY(禁欲的情种)回复于 2006-05-09 17:20:40 得分 30

楼主还有SoLike,休怪小生得罪,7、8年了就这水平?咱还得再加油啊。  
   
  1,你去查一查MSDN,Win32的Class   Name,即CreateWindow的第一个参数是个什么含义?知道Win32是怎么管理窗口对象以后,自然就知道该怎么填这第一个参数了,也就知道为什么不能填“_T("STATIC")”了。  
   
  2,你要记住,"Static"窗口类就是"Static"窗口类,它是微软专门用来简单显示文本的内定类。它能响应的东西非常少,能响应STN_CLICKED已经不错了,更别指望scroll消息了。所以你想搞一个“带滚动条的静态文本控件”,根本思路就不能去想static控件及其衍生物。  
   
  3,cpio说的对,你可以从CWnd派生。但是这距离你要的结果还是有一段距离要走的。或者你派生一个edit控件,把它设定成为只读的(ES_READONLY)。  
   
  4,或者你可以考虑IE控件,这样还可以显示更丰富的内容。Top

10 楼yoci(阿呸)回复于 2006-05-09 17:33:03 得分 0

sycnick:  
        你说的方法原理上十分诱人,运行时出现非法   呵呵  
   
  AgedBOY:  
        谢谢你的指教,很中肯。但我觉得奇怪,CStatic本来就是从Cwnd继承的,为什么不能实现滚动呢Top

11 楼YufengShi(浪子)回复于 2006-05-09 17:38:17 得分 10

为什么不直接继承自CScrollView呢  
   
  Static控件是都不到诸如WM_LBUTTONDOWN之类的消息,  
  因为其WM_NCHITTEST处理函数默认返回HTTRANSPARENTTop

12 楼SoLike(思危)回复于 2006-05-09 18:21:48 得分 5

哎、几年不回帖了,今天有点闲,本来是看到200分的肥帖,想进来蹭一把的。  
  作了7、8年,再搞纯技术,没钱途啊,俺现在作公司,VC都是以前的老本了。  
   
  楼主在创建Static时指定了SS_NOTIFY风格,WM_NCHITTEST处理函数返回的是HTCLIENT。  
  本来想多快好省的创建一个带滚动条的Static控件,结果反而绕了路。Top

13 楼goodboyws(深夜不眠者(VCMVP))回复于 2006-05-09 18:28:00 得分 5

直接用Edit不就可以了么Top

14 楼yoci(阿呸)回复于 2006-05-09 18:55:01 得分 0

SoLike   :你看得真仔细,不指定SS_NOTIFY也是一样不行迪~Top

15 楼yoci(阿呸)回复于 2006-05-09 18:56:51 得分 0

YufengShi:   没法使用CScrollView,呵呵Top

16 楼whwjn(哈哈)回复于 2006-05-09 18:57:32 得分 5

我们单位用VC十几年的一大把,领导都是不会VC的,呵呵Top

17 楼Snow_Ice11111(雪上加冰)回复于 2006-05-09 22:07:07 得分 20

我试过这个问题了,结果证明让CStatic控件带上滚动条实现我们希望达到的目的只是我们一厢情愿的。我的解决方法是从CStatic派生一个类,在这个类中动态创建滚动条,然后在类中处理创建的滚动条的消息WM_HSROLL和WM_VSROLL。另外,我用VC也有4年多了,虽然也曾年少轻狂过,不过现在越用越觉得自己是个菜鸟,大多数时候都在怀疑自己的能力。Top

18 楼Snow_Ice11111(雪上加冰)回复于 2006-05-09 22:17:24 得分 10

SoLike()朋友的看法是对的,只不过这个滚动条不是我们用WS_HSCROLL|WS_VSCROLL参数自带的,而是动态创建的。期待楼下朋友能贴上自带滚动条的处理方法。最后,向各位前辈们致敬!Top

19 楼xing_xing_xing(哈哈)回复于 2006-05-09 22:27:55 得分 5

动态创建滚动条,没什么问题啊  
  如果是Create生成的需要在Create函数里面生成滚动条Top

20 楼slimfeng(风)回复于 2006-05-10 08:26:05 得分 5

我得努力!Top

21 楼su5369(胖大海)回复于 2006-05-10 08:59:32 得分 5

路过帮顶Top

22 楼ablewindy(我是【风子】我怕谁)回复于 2006-05-10 09:10:30 得分 5

干脆要画就画到底罗!  
  滚动条也自己画,拖动也自己响应!Top

23 楼tong20037(小菜)回复于 2006-05-10 09:13:28 得分 5

whwjn(菜鸟学飞)   (   )   信誉:86     2006-05-09   18:57:00     得分:   0      
    我们单位用VC十几年的一大把,领导都是不会VC的,呵呵  
  --------------------------------------------------------------  
   
    看来需要转行了,用VC怎么也不可能到"领导"位子了  
       
     
  Top

24 楼ovenpeng()回复于 2006-05-10 09:48:36 得分 5

.h文件  
  class   COutPutEdit   :   public   CEdit  
  {  
  //   Construction  
  public:  
  COutPutEdit();  
   
  //   Attributes  
  public:  
   
  //   Operations  
  public:  
   
  //   Overrides  
  //   ClassWizard   generated   virtual   function   overrides  
  //{{AFX_VIRTUAL(COutPutEdit)  
  //}}AFX_VIRTUAL  
   
  //   Implementation  
  public:  
  void   AddString(const   char   *   str);  
  virtual   ~COutPutEdit();  
   
  //   Generated   message   map   functions  
  protected:  
  //{{AFX_MSG(COutPutEdit)  
  afx_msg   void   OnContextMenu(CWnd*   pWnd,   CPoint   point);  
  afx_msg   void   OnChar(UINT   nChar,   UINT   nRepCnt,   UINT   nFlags);  
  afx_msg   void   OnOutputClear();  
  afx_msg   int   OnCreate(LPCREATESTRUCT   lpCreateStruct);  
  //}}AFX_MSG  
   
  DECLARE_MESSAGE_MAP()  
  };  
   
  .cpp文件,在OnCreate函数中加上this->ShowScrollBar(SB_BOTH,TRUE);就行了  
  int   COutPutEdit::OnCreate(LPCREATESTRUCT   lpCreateStruct)    
  {  
  if   (CEdit::OnCreate(lpCreateStruct)   ==   -1)  
  return   -1;  
   
  //   TODO:   Add   your   specialized   creation   code   here  
  this->ShowScrollBar(SB_BOTH,TRUE);  
  return   0;  
  }Top

25 楼Atomictry(天影)回复于 2006-05-10 09:52:12 得分 5

在继承类中创建滚动条是可行的。  
  自带滚动条的处理方法我觉得不可行,即使指定了SS_NOTIFY也没用,SS_NOTIFY只能向父窗口发送鼠标消息而已。Top

26 楼yoci(阿呸)回复于 2006-05-10 10:21:27 得分 0

已经放弃从CStatic继承了  
  直接从CWnd继承,省得烦啦  
   
  这几年代码写的很少,以前写程序一直用Visual   Assis   X,结果现在想用什么函数连个名字都记不起来。孔子说,日知其所无,月无忘其所能。统统没能做到哦。  
  懒得写了。准备上网搜搜,看看有没有现成的代码  
   
  如果谁知道有现成的代码可以用的,麻烦到  
  http://community.csdn.net/Expert/topic/4740/4740663.xml?temp=.5188562  
  告诉我一声  
   
  这个帖子只有200分,分数太少了怕对不起大家,所以准备结帖,另开一个200的帖子。这里就不要留言了。  
   
  谢谢大家  
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:yoci
  • cpio
  • SoLike
  • sycnick
  • mynamelj
  • AgedBOY
  • YufengShi
  • SoLike
  • goodboyws
  • whwjn
  • Snow_Ice11111
  • Snow_Ice11111
  • xing_xing_xing
  • slimfeng
  • su5369
  • ablewindy
  • tong20037
  • ovenpeng
  • Atomictry

相关链接

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

广告也精彩

反馈

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