vc 实现垂直滚动条对话框
来源:互联网 发布:心动网络股份有限公司 编辑:程序博客网 时间:2024/06/11 07:10
关于SCROLLINFO
滚动条(卷动列)信息,结构定义为: typedef struct tagSCROLLINFO { UINT cbSize ; // set to sizeof (SCROLLINFO) UINT fMask ; // values to set or get int nMin ; // minimum range value int nMax ; // maximum range value UINT nPage ; // page size int nPos ; // current position int nTrackPos ; // current tracking position }SCROLLINFO 函数SetScrollInfo和GetScrollInfo的参数LPSCROLLINFO lpsi指向该结构。 在程序中,可以定义如下的SCROLLINFO结构型态: SCROLLINFO si ; 在调用SetScrollInfo或GetScrollInfo之前,必须将cbSize字段设定为结构的大小: si.cbSize = sizeof (si) ; 或 si.cbSize = sizeof (SCROLLINFO) ; 逐渐熟悉Windows后,您就会发现另外几个结构像这个结构一样,第一个字段指出了结构大小。这个字段使将来的Windows版本可以扩充结构并添加新的功能,并且仍然与以前编译的版本兼容。 把fMask字段设定为一个以上以SIF前缀开头的旗标,并且可以使用C的位操作OR运算子(|)组合这些旗标。 SetScrollInfo函数使用SIF_RANGE旗标时,必须把nMin和nMax字段设定为所需的卷动列范围。GetScrollInfo函数使用SIF_RANGE旗标时,应把nMin和nMax字段设定为从函数传回的目前范围。 SIF_POS旗标也一样。当通过SetScrollInfo使用它时,必须把结构的nPos字段设定为所需的位置。可以通过GetScrollInfo使用SIF_POS旗标来取得目前位置。 使用SIF_PAGE旗标能够取得页面大小。用SetScrollInfo函数把nPage设定为所需的页面大小。GetScrollInfo使用SIF_PAGE旗标可以取得目前页面的大小。如果不想得到比例化的卷动列,就不要使用该旗标。 当处理带有SB_THUMBTRACK或SB_THUMBPOSITION通知码的WM_VSCROLL或WM_HSCROLL消息时,通过GetScrollInfo只使用SIF_TRACKPOS旗标。从函数的传回中,SCROLLINFO结构的nTrackPos字段将指出目前的32位的卷动方块位置。
//头文件中添加如下内容,m_page记得初始化int m_page;int GetScrollPos(int nBar, UINT nSBCode);void ScrollClient(int nBar, int nPos) ;void VScrool(int nBar, UINT nSBCode) ;
//在OnInitDialog里添加如下代码为对话框创建一个垂直滚动条CRect rc; GetClientRect(&rc); const SIZE sz = { rc.right - rc.left, rc.bottom - rc.top }; SCROLLINFO si; si.cbSize = sizeof(SCROLLINFO); si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE; si.nPos = si.nMin = 1; si.nMax = sz.cy*m_page; si.nPage = sz.cy; SetScrollInfo(SB_VERT, &si, FALSE); //此函数将产生一个垂直滚动条//为对话框添加下列函数
void ChyperlinkDlg::ScrollClient(int nBar, int nPos) { static int s_prevx = 1; static int s_prevy = 1; int cx = 0; int cy = 0; int& delta = cy; int& prev = s_prevy; delta = prev - nPos; prev = nPos; if(cx || cy) { ScrollWindow(cx, cy, NULL, NULL); } }
int ChyperlinkDlg::GetScrollPos(int nBar, UINT nSBCode) { SCROLLINFO si; si.cbSize = sizeof(SCROLLINFO); si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS; GetScrollInfo(nBar, &si); const int minPos = si.nMin; const int maxPos = si.nMax - (si.nPage - 1); int result = -1; switch(nSBCode) { case SB_LINEUP /*SB_LINELEFT*/: result = max(si.nPos - 1, minPos); break; case SB_LINEDOWN /*SB_LINERIGHT*/: result = min(si.nPos + 1, maxPos); break; case SB_PAGEUP /*SB_PAGELEFT*/: result = max(si.nPos - (int)si.nPage, minPos); break; case SB_PAGEDOWN /*SB_PAGERIGHT*/: result = min(si.nPos + (int)si.nPage, maxPos); break; case SB_THUMBPOSITION: // do nothing break; case SB_THUMBTRACK: result = si.nTrackPos; break; case SB_TOP /*SB_LEFT*/: result = minPos; break; case SB_BOTTOM /*SB_RIGHT*/: result = maxPos; break; case SB_ENDSCROLL: // do nothing break; } return result; }
void ChyperlinkDlg::VScrool(int nBar, UINT nSBCode) { const int scrollPos = GetScrollPos(nBar,nSBCode); if(scrollPos == -1) return; SetScrollPos(nBar, scrollPos, TRUE); ScrollClient(nBar, scrollPos); }
//最后为对话框添加WM_VSCROLL消息响应函数
void ChyperlinkDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar){// TODO: 在此添加消息处理程序代码和/或调用默认值VScrool(SB_VERT,nSBCode);CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);}
好啦,大功告成~
- vc 实现垂直滚动条对话框
- 对话框实现水平垂直滚动条
- VC 对话框添加滚动条
- 使对话框的垂直滚动条自由滚动
- 实现Textview 有垂直滚动条
- MFC垂直滚动条的实现
- WTL 给一个对话框添加垂直滚动条
- Android:给对话框AlertDialog添加垂直滚动条
- 为对话框设置水平,垂直条及鼠标移动滚动
- MFC对话框水平和垂直滚动条功能
- MFC对话框水平和垂直滚动条功能
- 跟随垂直滚动条滚动的DIV实现
- 垂直水平滚动条
- LinearLayout 垂直滚动条
- LinearLayout 垂直滚动条
- Android 垂直滚动条
- 垂直滚动条测试
- LinearLayout 垂直滚动条
- C++常用函数(续)
- C#转义字符
- 日期的正则表达式
- java邮件正则表达式
- 一枚电子信息男的困惑
- vc 实现垂直滚动条对话框
- typedef struct与struct
- Linux命令使用技巧
- 这些题目,来测试一下你的C语言水平
- hdu 3991 Harry Potter and the Present II //最小路径覆盖
- Fatal server error:Server is already active for display 0
- java5中的可变参数
- CentOS(with XEN)&Ubuntu双系统引导的问题
- ubuntu下声音的控制方法