一秋草木

Nothing Is Impossiable!
posts - 11, comments - 10, trackbacks - 0, articles - 2
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

MFC中滚动条的实现

Posted on 2006-04-26 09:48 一秋草木 阅读(19035) 评论(2)  编辑 收藏 引用

1、     建立工程时,将 View 类继承自 CScrollView

2、     OnInitialUpdate 中添加初始化时 Scroll 的相关属性值

CSize sizeTotal(0,0);

SetScrollSizes(MM_TEXT,sizeTotal);

3、     打开文件 ( 图像后 ) 根据图像的大小,设置滚动属性值

ChangeScrollRange();   // 自定义函数

4、     View 类中添加成员变量。

作用是存储图像显示位置与原点的 offset

         int               m_ImgVScrollPos ;                                    //       VScroll distance

int               m_ImgHScrollPos ;                                   //       HScroll distance

5、     滚动处理

添加自定义响应 WM_VSCROLL WM_HSCROLL 消息的事件函数: OnVScroll OnHScroll

void CSockIIView :: OnVScroll ( UINT nSBCode , UINT nPos , CScrollBar * pScrollBar )

{

    // TODO: Add your message handler code here and/or call default

    SCROLLINFO si ;

    GetScrollInfo ( SB_VERT ,& si , SIF_ALL );

    m_ImgVScrollPos = si . nPos ;

    Invalidate ( TRUE );

 

    CScrollView :: OnVScroll ( nSBCode , nPos , pScrollBar );

}

6、     图像显示

更改 OnPaint 函数中图像显示的代码:

dc . BitBlt ( rc . left , rc . top , rc . Width (), rc . Height (), m_pMemDC , rc . left , rc . top , SRCCOPY );

为:

dc.BitBlt(rc.left,rc.top,rc.Width(),rc.Height(),m_pMemDC,(rc.left+m_ImgHScrollPos),(rc.top+m_ImgVScrollPos),SRCCOPY);

 

备注:

Ø         SetScrollSizes()  MFC 库函数,设置滚动条属性。参数含义参见 MSDN

void SetScrollSizes(

   int nMapMode,                                           // 影射模式。

    SIZE sizeTotal,                                           // 滚动范围,即所有 page 加起来的高度或宽度

   const SIZE& sizePage = sizeDefault,         // 每页的大小。根据模式的不同,度量的尺度不同

   const SIZE& sizeLine = sizeDefault          // 每行的大小。根据模式的不同,度量的尺度不同

);

 

nMapMode ,一般使用 MM_TEXT ,以像素为单位。参见 MSDN

 

Ø         BitBlt 将内存中的图拷贝到屏幕上进行显示。参数含义 参见 MSDN

BOOL BitBlt(

  HDC hdcDest,       // handle to destination DC

  int nXDest,           // x-coord of destination upper-left corner

  int nYDest,            // y-coord of destination upper-left corner

  int nWidth,           // width of destination rectangle

  int nHeight,             // height of destination rectangle

  HDC hdcSrc,       // handle to source DC

  int nXSrc,            // x-coordinate of source upper-left corner

  int nYSrc,            // y-coordinate of source upper-left corner

  DWORD dwRop  // raster operation code

);

如有疑问,欢迎留言。

Feedback

# re: MFC中滚动条的实现  回复  更多评论   

2008-04-16 00:45 by vfdff
SetScrollSizes() 只能设置一次吗?

# re: MFC中滚动条的实现  回复  更多评论   

2009-12-06 16:58 by liubaosen
文字滚动条实现:http://armlinux.uueasy.com/read.php?tid=32

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理