多文档程序 设置了子窗口style为WS_HSCROLL 怎么用

fire2008hqy 2011-11-01 11:29:27
设置了WS_HSCROLL 添加了响应OnHScroll 但是完全没有反应,我这不是对话框添加的控件,我不知道直接设置了WS_HSCROLL这个东西的ID是什么,我觉得好像OnHScroll 和WS_HSCROLL 没关联起来一样。。。是不是应该在VIEW类里面加上什么东西啊
...全文
243 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-11-29
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
fire2008hqy 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jennyvenus 的回复:]

C/C++ code
void CMyView::Create(CWnd *pParentWnd, const RECT &rect, UINT nID, DWORD dwStyle)
{
CView::Create(NULL, "", dwStyle, rect, pParentWnd, nID);

m_HScrollBar.Create( SBS_HORZ | S……
[/Quote]
jennyvenus 大哥,create是要写歌重载的吗,VIEW类里面没有CREATE 只有OnCreate,我MFC菜鸟,该咋办
fire2008hqy 2011-11-02
  • 打赏
  • 举报
回复
jennyvenus 大哥,create是要写歌重载的吗,VIEW类里面没有CREATE 只有OnCreate
Eleven 2011-11-01
  • 打赏
  • 举报
回复
你的View的基类用CScrollView不简单一些吗?
用户 昵称 2011-11-01
  • 打赏
  • 举报
回复
BOOL
CSmartEditorView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class

CWnd *pParentWnd = CWnd::FromHandlePermanent( cs.hwndParent );
if( NULL == pParentWnd ||
!pParentWnd->IsKindOf( RUNTIME_CLASS( CSplitterWnd ) ) )
{
// View must always create its own scrollbars,
// if only it's not used within splitter
cs.style |= ( WS_HSCROLL | WS_VSCROLL );
}
cs.lpszClass = AfxRegisterWndClass( CS_DBLCLKS );
return CView::PreCreateWindow(cs);
}

void CSmartEditorView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
SCROLLINFO si;
int page_lines, line_count, new_topline;

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

// Note we cannot use nPos because of its 16-bit nature
memset( &si, 0, sizeof( SCROLLINFO ) );

si.cbSize = sizeof( SCROLLINFO );
si.fMask = SIF_ALL;
VERIFY( GetScrollInfo( SB_VERT, &si ) );

page_lines = GetScreenLines();
line_count = GetLineCount();

switch( nSBCode )
{
case SB_TOP:
new_topline = 0;
break;
case SB_BOTTOM:
new_topline = line_count - page_lines + 1;
break;
case SB_LINEUP:
new_topline = m_top_line - 1;
break;
case SB_LINEDOWN:
new_topline = m_top_line + 1;
break;
case SB_PAGEUP:
new_topline = m_top_line - si.nPage + 1;
break;
case SB_PAGEDOWN:
new_topline = m_top_line + si.nPage - 1;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
new_topline = si.nTrackPos;
break;
default:
return;
}

if( new_topline < 0 )
{
new_topline = 0;
}

if( new_topline >= line_count )
{
new_topline = line_count - 1;
}

BOOL bUpdateSiblings = FALSE;
if( m_top_line != new_topline )
{
int scroll_line_count = m_top_line - new_topline;
m_top_line = new_topline;
ScrollWindow( 0, scroll_line_count * GetLineHeight() );
UpdateWindow();
}

RecalcVScrollBar( TRUE );
}

void
CSmartEditorView::RecalcVScrollBar( BOOL bPositionOnly )
{
SCROLLINFO si;

memset( &si, 0, sizeof( SCROLLINFO ) );
si.cbSize = sizeof( SCROLLINFO );

if( bPositionOnly )
{
//只更新区域,应该是用户纯滚动屏幕
si.fMask = SIF_POS;
si.nPos = m_top_line;
}
else
{
if( GetScreenLines() >= GetLineCount() && m_top_line > 0)
{
m_top_line = 0;
Invalidate();
}
si.fMask = SIF_DISABLENOSCROLL | SIF_PAGE | SIF_POS | SIF_RANGE;
si.nMin = 0;
si.nMax = GetLineCount() - 1;
si.nPage = GetScreenLines();
si.nPos = m_top_line;
}

VERIFY( SetScrollInfo( SB_VERT, &si ) );
}


俺以前就在CView里面这么做的。
用户 昵称 2011-11-01
  • 打赏
  • 举报
回复
void CMyView::Create(CWnd *pParentWnd, const RECT &rect, UINT nID, DWORD dwStyle)
{
CView::Create(NULL, "", dwStyle, rect, pParentWnd, nID);

m_HScrollBar.Create( SBS_HORZ | SBS_TOPALIGN, CRect( rect.left, rect.bottom, rect.right - rect.left, 20), pParentWnd, 0 );
m_HScrollBar.ShowScrollBar();
}
用户 昵称 2011-11-01
  • 打赏
  • 举报
回复
在你的view的PreCreateWindow中添加
cs.style=cs.style|WS_HSCROLL|WS_VSCROLL;

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧