我做了一个类,从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);
////////////////////////////
请大家帮忙看看
谢谢

解决方案 »

  1.   

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

  2.   

    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"),不用它用什么好呢?
      

  3.   

    哈哈,原来楼主也遇到这个问题了,看来很普遍啊。看看这个:
    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);
      

  4.   

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

  5.   

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

  6.   

    楼主还有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控件,这样还可以显示更丰富的内容。
      

  7.   

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

  8.   

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

  9.   

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

  10.   

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

  11.   

    YufengShi: 没法使用CScrollView,呵呵
      

  12.   

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

  13.   

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

  14.   

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

  15.   

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

  16.   

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

  17.   

    .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;
    }
      

  18.   

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

  19.   

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