Chinaunix首页 | 论坛 | 博客
  • 博客访问: 111443
  • 博文数量: 23
  • 博客积分: 1464
  • 博客等级: 上尉
  • 技术积分: 231
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-06 16:44
文章分类

全部博文(23)

文章存档

2014年(4)

2011年(3)

2009年(2)

2008年(14)

我的朋友

分类:

2008-06-17 18:12:58

Selecting   the   "Horizontal   Scroll"   and   "Verticla   Scroll"   styles   among   the  properties   of   your   dialog   box   in   the   resource   editor, you   can   add     scroll    bars     to   the   dialog   box.   Remember   also   to   select   the   'resizing'   border   style.    
   
However   for   adding   functionality   to   the   scroll   bars,   you   need   to   override    the    WM_VSCROLL   and   WM_HSCROLL   message   handlers.   Also,override   the   WM_SIZE    handler    to   set   the   scroll   bar   range   if   the   size   is   reduced   than   the   original.   So   you    get   the   original   size   of   the   dialog   in   your   OninitDialog().   The   code   would   look   something   like   this.   Modify   to   your   needs.    
   
   
1.   To   OnInitDialog(),   add   the   following   line.    
   
   
                      GetWindowRect(m_rect);    
                      m_nScrollPos   =   0;    
   
   
to   get   the   original   window   size.   Make   m_rect   a   member   variable of   your     dialog.   Add   another   variable   m_nScrollPos   and   initialize its   value   to   zero.     It  stores   the   current   vertical   scroll   position.    
   
   
2.   Here   is   the   WM_SIZE   handler   for   setting   the   scroll   bar   range.   Set   range   0    if     size   is   increased   more   than   original.    
   
   
  void   CCharlesDlg::OnSize(UINT   nType,   int   cx,   int   cy)    
  {    
    CDialog::OnSize(nType,   cx,   cy);    
   
    //   TODO:   Add   your   message   handler   code   here      
   
    m_nCurHeight   =   cy;    
    int   nScrollMax;    
    if   (cy   <   m_rect.Height())    
    {    
      nScrollMax   =   m_rect.Height()   -   cy;    
    }    
    else    
      nScrollMax   =   0;    
   
    SCROLLINFO   si;    
   
    si.cbSize   =   sizeof(SCROLLINFO);    
    si.fMask   =   SIF_ALL;   //   SIF_ALL   =   SIF_PAGE   |   SIF_RANGE   | SIF_POS;    
    si.nMin   =   0;    
    si.nMax   =   nScrollMax;    
    si.nPage   =   si.nMax/10;    
    si.nPos   =   0;    
    SetScrollInfo(SB_VERT,   &si,   TRUE);    
   
  }    
   
   
  You   need   m_nCurHeight   to   store   the   current   height   of   the   dialog   and   use   it     to     handle   the   scrolling   in   OnVScroll.   m_ncurHeight   is   also   a   member   variable   of     the   dialog.    
   
3.   Here   is   the   handler   for   WM_VSCROLL.    
   
   
  void   CCharlesDlg::OnVScroll(UINT   nSBCode,   UINT   nPos,   CScrollBar*   pScrollBar)    
  {    
    //   TODO:   Add   your   message   handler   code   here   and/or   call   default      
   
    int   nDelta;    
    int   nMaxPos   =   m_rect.Height()   -   m_nCurHeight;    
   
    switch   (nSBCode)    
    {    
    case   SB_LINEDOWN:    
   
      if   (m_nScrollPos   >=   nMaxPos)    
        return;    
   
      nDelta   =   min(nMaxPos/100,nMaxPos-m_nScrollPos);    
   
      break;    
   
    case   SB_LINEUP:    
      if   (m_nScrollPos   <=   0)    
        return;    
   
      nDelta   =   -min(nMaxPos/100,m_nScrollPos);    
      break;    
   
    case   SB_PAGEDOWN:    
      if   (m_nScrollPos   >=   nMaxPos)    
        return;    
   
      nDelta   =   min(nMaxPos/10,nMaxPos-m_nScrollPos);    
      break;    
   
    case   SB_THUMBPOSITION:    
      nDelta   =   (int)nPos   -   m_nScrollPos;    
      break;    
   
    case   SB_PAGEUP:    
      if   (m_nScrollPos   <=   0)    
        return;    
   
      nDelta   =   -min(nMaxPos/10,m_nScrollPos);    
      break;    
   
    default:    
   
      return;    
    }    
   
    m_nScrollPos   +=   nDelta;    
    SetScrollPos(SB_VERT,m_nScrollPos,TRUE);    
   
    ScrollWindow(0,-nDelta);    
   
    CDialog::OnVScroll(nSBCode,   nPos,   pScrollBar);    
   
  }
   
   
The   above   code   handles   the   vertical   scrolling.   For   horizontal   scrolling   add     the     WM_HSCROLL   similarly   and   add   the   necessary   code   to   OnSize   and   OnInitDialog.    

Information   provided   in   this   document   and   any   software   that   may   accompany   this   document   is   provided   "as   is"   without   warranty   of   any     kind,   either   expressed   or   implied,   including   but   not   limited   to   the    implied   warranties   of   merchantability   and/or   fitness   for   a   particular     purpose.   The   user   assumes   the   entire   risk   as   to   the   accuracy   and   the    use   of   this   information.    
阅读(1769) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~