如何让一个对话框响应垂直滚动条(十万火急) 我在对话框上显示了很多内容,一个屏幕显示不完,希望通过垂直滚动条来实现观看下面的内容,只是通过属性修改,虽然出现滚动条,但是放开鼠标,滚动块又回到最上边了,如何实现滚动条的功能呀。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 添加新类:CHFScrollDialog用下面的代码覆盖CHFScrollDialog.h------------------------------------------------------------------------------------class CHFScrollDialog : public CDialog{// Constructionpublic: CHFScrollDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL ); CHFScrollDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL ); CHFScrollDialog(); // standard constructor// Dialog Data //{{AFX_DATA(CHFScrollDialog) //}}AFX_DATA// Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CHFScrollDialog) public: protected: //}}AFX_VIRTUAL// Implementationprotected: CSize m_sizeDlgOrigin; // Generated message map functions //{{AFX_MSG(CHFScrollDialog) virtual BOOL OnInitDialog(); afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg void OnSetFocus(CWnd* pOldWnd); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); //}}AFX_MSG DECLARE_MESSAGE_MAP()private: bool m_bInitiazed; int m_nHscrollPage; // Hor scrollbar page step int m_nHscrollMax; // hor scrollbar max position int m_nHscrollPos; // Current hor scrollbar position int m_nVscrollPage; // ver scrollbar page step int m_nVscrollMax; // ver scrollbar max position int m_nVscrollPos; // Current ver scrollbar position};------------------------------------------------------------------------------------ 下面的覆盖CHFScrollDialog.cpp-----------------------------------------------------------------------------CHFScrollDialog::CHFScrollDialog() : CDialog(){ m_nHscrollPos = 0; m_nVscrollPos = 0; m_bInitiazed = false; //{{AFX_DATA_INIT(CHFScrollDialog) //}}AFX_DATA_INIT}CHFScrollDialog::CHFScrollDialog(LPCTSTR lpszTemplateName, CWnd *pParentWnd) : CDialog(lpszTemplateName, pParentWnd){ m_nHscrollPos = 0; m_nVscrollPos = 0; m_bInitiazed = false;}CHFScrollDialog::CHFScrollDialog(UINT nIDTemplate, CWnd *pParentWnd) : CDialog(nIDTemplate, pParentWnd){ m_nHscrollPos = 0; m_nVscrollPos = 0; m_bInitiazed = false;}BEGIN_MESSAGE_MAP(CHFScrollDialog, CDialog) //{{AFX_MSG_MAP(CHFScrollDialog) ON_WM_VSCROLL() ON_WM_HSCROLL() ON_WM_SIZE() ON_WM_SETFOCUS() ON_WM_LBUTTONDOWN() ON_WM_MOUSEWHEEL() ON_WM_KEYDOWN() //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CHFScrollDialog message handlersBOOL CHFScrollDialog::OnInitDialog() { CDialog::OnInitDialog(); m_bInitiazed = true; // TODO: Add extra initialization here CRect rect; GetClientRect(rect); m_sizeDlgOrigin = rect.Size(); m_nHscrollPage = m_sizeDlgOrigin.cx + 1; m_nVscrollPage = m_sizeDlgOrigin.cy + 1; return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE}void CHFScrollDialog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default int yAmount = 0; //Y增量 switch(nSBCode) { case SB_TOP: yAmount = -m_nVscrollPos; break; case SB_BOTTOM: yAmount = m_nVscrollMax - m_nVscrollPos; break; case SB_LINEUP: yAmount = -5; break; case SB_LINEDOWN : yAmount = 5; break; case SB_PAGEUP: yAmount = -(m_nVscrollPage - 50); if(yAmount > 0) yAmount = 0; break; case SB_PAGEDOWN: yAmount = m_nVscrollPage - 50; if(yAmount < 0) yAmount = 0; break; case SB_THUMBTRACK: yAmount = nPos - m_nVscrollPos; break; default: yAmount = 0; } int nVscrollPos = m_nVscrollPos; nVscrollPos += yAmount; if(nVscrollPos < 0) { yAmount = 0 - m_nVscrollPos; } else if(nVscrollPos > m_nVscrollMax) { yAmount = m_nVscrollMax - m_nVscrollPos; } if(yAmount != 0) { ScrollWindow(0, -yAmount); m_nVscrollPos += yAmount; SetScrollPos(SB_VERT, m_nVscrollPos); } CDialog::OnVScroll(nSBCode, nPos, pScrollBar);}void CHFScrollDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default int xAmount = 0; //X增量 switch(nSBCode) { case SB_TOP: xAmount = -m_nHscrollPos; break; case SB_BOTTOM: xAmount = m_nHscrollMax - m_nHscrollPos; break; case SB_LINEUP: xAmount = -5; break; case SB_LINEDOWN : xAmount = 5; break; case SB_PAGEUP: xAmount = -m_nHscrollPage; break; case SB_PAGEDOWN: xAmount = m_nHscrollPage; break; case SB_THUMBTRACK: xAmount = nPos - m_nHscrollPos; break; default: xAmount = 0; } int nHscrollPos = m_nHscrollPos; nHscrollPos += xAmount; if(nHscrollPos < 0) { xAmount = 0 - m_nHscrollPos; } else if(nHscrollPos > m_nHscrollMax) { xAmount = m_nHscrollMax - m_nHscrollPos; } if(xAmount != 0) { ScrollWindow(-xAmount, 0); m_nHscrollPos += xAmount; SetScrollPos(SB_HORZ, m_nHscrollPos); } CDialog::OnHScroll(nSBCode, nPos, pScrollBar);}void CHFScrollDialog::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: Add your message handler code here if(m_bInitiazed && (nType==SIZE_RESTORED || nType==SIZE_MAXIMIZED || nType==SIZE_MAXSHOW) ) { CRect rectCln; GetClientRect(rectCln); // Vert scrollbar // rerecord state; m_nVscrollMax = m_sizeDlgOrigin.cy - rectCln.Height(); m_nVscrollPage = rectCln.Height() + 1; if(m_nVscrollMax <= 0) { ScrollWindow(0, -m_nVscrollPos); m_nVscrollPos = 0; } SCROLLINFO info; ::ZeroMemory(&info, sizeof(SCROLLINFO)); info.cbSize = sizeof(SCROLLINFO); info.fMask = SIF_RANGE|SIF_PAGE|SIF_POS; info.nMin = 0; info.nMax = m_sizeDlgOrigin.cy; info.nPos = m_nVscrollPos; info.nPage = m_nVscrollPage; SetScrollInfo( SB_VERT, &info ); // horizon scrollbar // rerecord state; m_nHscrollMax = m_sizeDlgOrigin.cx - rectCln.Width(); m_nHscrollPage = rectCln.Width() + 1; if(m_nHscrollMax <= 0) { ScrollWindow(0, -m_nHscrollPos); m_nHscrollPos = 0; } // ::ZeroMemory(&info, sizeof(SCROLLINFO)); info.cbSize = sizeof(SCROLLINFO); info.fMask = SIF_RANGE|SIF_PAGE|SIF_POS; info.nMin = 0; info.nMax = m_sizeDlgOrigin.cx; info.nPos = m_nHscrollPos; info.nPage = m_nHscrollPage; SetScrollInfo( SB_HORZ, &info ); }}void CHFScrollDialog::OnSetFocus(CWnd* pOldWnd) {// CDialog::OnSetFocus(pOldWnd); // TODO: Add your message handler code here }void CHFScrollDialog::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDialog::OnLButtonDown(nFlags, point); if(GetFocus() != this) { SetFocus(); }}BOOL CHFScrollDialog::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { // TODO: Add your message handler code here and/or call default int yAmount = (-zDelta)/6; //Y增量 int nVscrollPos = m_nVscrollPos; nVscrollPos += yAmount; if(nVscrollPos < 0) { yAmount = 0 - m_nVscrollPos; } else if(nVscrollPos > m_nVscrollMax) { yAmount = m_nVscrollMax - m_nVscrollPos; } if(yAmount != 0) { ScrollWindow(0, -yAmount); m_nVscrollPos += yAmount; SetScrollPos(SB_VERT, m_nVscrollPos); } return CDialog::OnMouseWheel(nFlags, zDelta, pt);}void CHFScrollDialog::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default int yAmount = 0; //Y增量 if(nChar == VK_NEXT) { yAmount = m_nVscrollPage - 50; if(yAmount < 0) { yAmount = 0; } } else if(nChar == VK_PRIOR) { yAmount = -(m_nVscrollPage - 50); if(yAmount > 0) { yAmount = 0; } } int nVscrollPos = m_nVscrollPos; nVscrollPos += yAmount; if(nVscrollPos < 0) { yAmount = 0 - m_nVscrollPos; } else if(nVscrollPos > m_nVscrollMax) { yAmount = m_nVscrollMax - m_nVscrollPos; } if(yAmount != 0) { ScrollWindow(0, -yAmount); m_nVscrollPos += yAmount; SetScrollPos(SB_VERT, m_nVscrollPos); } CDialog::OnKeyDown(nChar, nRepCnt, nFlags);}----------------------------------------------------------------------------- 对要加入滚动条的对话框:CRyxxdjDlg.h中class CRyxxdjDlg : public CHFScrollDialog//注意{//....};***********************************************************CRyxxdjDlg.cpp中:CRyxxdjDlg::CRyxxdjDlg(CWnd* pParent /*=NULL*/) : CHFScrollDialog(CRyxxdjDlg::IDD, pParent)//注意{}BEGIN_MESSAGE_MAP(CRyxxdjDlg, CHFScrollDialog)//注意END_MESSAGE_MAP()BOOL CRyxxdjDlg::OnInitDialog() { CHFScrollDialog::OnInitDialog();//注意//....}在对话框属性->Styles->Vertical Scroll打勾就OK了。 To:fupinger(仙人抚我颈★结发授长生) 哥们,我不知道 CDialog::OnHScroll(nSBCode, nPos, pScrollBar);是否调用了ScrollWindow,如果没有调用,那是不成的 为何读取不到文件的内容。。 静态分割窗口子窗口如何显示弹出菜单 ADO::_RecordsetPtr open 如何操作写文件 请教:如何在VC++中进行多表查询 寻找Intel的ijl.dll 小弟是初学VC的,怎么办哦 图像处理里的正交变换有什么用? editbox显示的初始值为0的问题 SOS!!!怎样开启 dos窗口 解决问题分全给.VC中的每一个错误码都有一个对应的说明内容, 谁给个 mfc42u.dll 的下载地址??、、谢谢
用下面的代码覆盖CHFScrollDialog.h
------------------------------------------------------------------------------------
class CHFScrollDialog : public CDialog
{
// Construction
public:
CHFScrollDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL );
CHFScrollDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );
CHFScrollDialog(); // standard constructor// Dialog Data
//{{AFX_DATA(CHFScrollDialog)
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CHFScrollDialog)
public:
protected:
//}}AFX_VIRTUAL// Implementation
protected:
CSize m_sizeDlgOrigin; // Generated message map functions
//{{AFX_MSG(CHFScrollDialog)
virtual BOOL OnInitDialog();
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnSetFocus(CWnd* pOldWnd);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
bool m_bInitiazed;
int m_nHscrollPage; // Hor scrollbar page step
int m_nHscrollMax; // hor scrollbar max position
int m_nHscrollPos; // Current hor scrollbar position
int m_nVscrollPage; // ver scrollbar page step
int m_nVscrollMax; // ver scrollbar max position
int m_nVscrollPos; // Current ver scrollbar position
};
------------------------------------------------------------------------------------
-----------------------------------------------------------------------------CHFScrollDialog::CHFScrollDialog()
: CDialog()
{
m_nHscrollPos = 0;
m_nVscrollPos = 0;
m_bInitiazed = false;
//{{AFX_DATA_INIT(CHFScrollDialog)
//}}AFX_DATA_INIT
}CHFScrollDialog::CHFScrollDialog(LPCTSTR lpszTemplateName, CWnd *pParentWnd)
: CDialog(lpszTemplateName, pParentWnd)
{
m_nHscrollPos = 0;
m_nVscrollPos = 0;
m_bInitiazed = false;
}CHFScrollDialog::CHFScrollDialog(UINT nIDTemplate, CWnd *pParentWnd)
: CDialog(nIDTemplate, pParentWnd)
{
m_nHscrollPos = 0;
m_nVscrollPos = 0;
m_bInitiazed = false;
}BEGIN_MESSAGE_MAP(CHFScrollDialog, CDialog)
//{{AFX_MSG_MAP(CHFScrollDialog)
ON_WM_VSCROLL()
ON_WM_HSCROLL()
ON_WM_SIZE()
ON_WM_SETFOCUS()
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEWHEEL()
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CHFScrollDialog message handlersBOOL CHFScrollDialog::OnInitDialog()
{
CDialog::OnInitDialog(); m_bInitiazed = true;
// TODO: Add extra initialization here
CRect rect;
GetClientRect(rect);
m_sizeDlgOrigin = rect.Size();
m_nHscrollPage = m_sizeDlgOrigin.cx + 1;
m_nVscrollPage = m_sizeDlgOrigin.cy + 1;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}void CHFScrollDialog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
int yAmount = 0; //Y增量
switch(nSBCode)
{
case SB_TOP:
yAmount = -m_nVscrollPos;
break;
case SB_BOTTOM:
yAmount = m_nVscrollMax - m_nVscrollPos;
break;
case SB_LINEUP:
yAmount = -5;
break;
case SB_LINEDOWN :
yAmount = 5;
break;
case SB_PAGEUP:
yAmount = -(m_nVscrollPage - 50);
if(yAmount > 0) yAmount = 0;
break;
case SB_PAGEDOWN:
yAmount = m_nVscrollPage - 50;
if(yAmount < 0) yAmount = 0;
break;
case SB_THUMBTRACK:
yAmount = nPos - m_nVscrollPos;
break;
default:
yAmount = 0;
} int nVscrollPos = m_nVscrollPos;
nVscrollPos += yAmount;
if(nVscrollPos < 0)
{
yAmount = 0 - m_nVscrollPos;
}
else if(nVscrollPos > m_nVscrollMax)
{
yAmount = m_nVscrollMax - m_nVscrollPos;
}
if(yAmount != 0)
{
ScrollWindow(0, -yAmount); m_nVscrollPos += yAmount;
SetScrollPos(SB_VERT, m_nVscrollPos);
}
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}void CHFScrollDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
int xAmount = 0; //X增量
switch(nSBCode)
{
case SB_TOP:
xAmount = -m_nHscrollPos;
break;
case SB_BOTTOM:
xAmount = m_nHscrollMax - m_nHscrollPos;
break;
case SB_LINEUP:
xAmount = -5;
break;
case SB_LINEDOWN :
xAmount = 5;
break;
case SB_PAGEUP:
xAmount = -m_nHscrollPage;
break;
case SB_PAGEDOWN:
xAmount = m_nHscrollPage;
break;
case SB_THUMBTRACK:
xAmount = nPos - m_nHscrollPos;
break;
default:
xAmount = 0;
} int nHscrollPos = m_nHscrollPos;
nHscrollPos += xAmount;
if(nHscrollPos < 0)
{
xAmount = 0 - m_nHscrollPos;
}
else if(nHscrollPos > m_nHscrollMax)
{
xAmount = m_nHscrollMax - m_nHscrollPos;
}
if(xAmount != 0)
{
ScrollWindow(-xAmount, 0); m_nHscrollPos += xAmount;
SetScrollPos(SB_HORZ, m_nHscrollPos);
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}void CHFScrollDialog::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(m_bInitiazed && (nType==SIZE_RESTORED || nType==SIZE_MAXIMIZED || nType==SIZE_MAXSHOW) )
{
CRect rectCln;
GetClientRect(rectCln); // Vert scrollbar
// rerecord state;
m_nVscrollMax = m_sizeDlgOrigin.cy - rectCln.Height();
m_nVscrollPage = rectCln.Height() + 1;
if(m_nVscrollMax <= 0)
{
ScrollWindow(0, -m_nVscrollPos);
m_nVscrollPos = 0;
} SCROLLINFO info;
::ZeroMemory(&info, sizeof(SCROLLINFO));
info.cbSize = sizeof(SCROLLINFO);
info.fMask = SIF_RANGE|SIF_PAGE|SIF_POS;
info.nMin = 0;
info.nMax = m_sizeDlgOrigin.cy;
info.nPos = m_nVscrollPos;
info.nPage = m_nVscrollPage;
SetScrollInfo( SB_VERT, &info ); // horizon scrollbar
// rerecord state;
m_nHscrollMax = m_sizeDlgOrigin.cx - rectCln.Width();
m_nHscrollPage = rectCln.Width() + 1;
if(m_nHscrollMax <= 0)
{
ScrollWindow(0, -m_nHscrollPos);
m_nHscrollPos = 0;
} // ::ZeroMemory(&info, sizeof(SCROLLINFO));
info.cbSize = sizeof(SCROLLINFO);
info.fMask = SIF_RANGE|SIF_PAGE|SIF_POS;
info.nMin = 0;
info.nMax = m_sizeDlgOrigin.cx;
info.nPos = m_nHscrollPos;
info.nPage = m_nHscrollPage;
SetScrollInfo( SB_HORZ, &info );
}
}void CHFScrollDialog::OnSetFocus(CWnd* pOldWnd)
{
// CDialog::OnSetFocus(pOldWnd);
// TODO: Add your message handler code here
}void CHFScrollDialog::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnLButtonDown(nFlags, point); if(GetFocus() != this)
{
SetFocus();
}
}BOOL CHFScrollDialog::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: Add your message handler code here and/or call default
int yAmount = (-zDelta)/6; //Y增量
int nVscrollPos = m_nVscrollPos;
nVscrollPos += yAmount;
if(nVscrollPos < 0)
{
yAmount = 0 - m_nVscrollPos;
}
else if(nVscrollPos > m_nVscrollMax)
{
yAmount = m_nVscrollMax - m_nVscrollPos;
}
if(yAmount != 0)
{
ScrollWindow(0, -yAmount); m_nVscrollPos += yAmount;
SetScrollPos(SB_VERT, m_nVscrollPos);
} return CDialog::OnMouseWheel(nFlags, zDelta, pt);
}void CHFScrollDialog::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
int yAmount = 0; //Y增量
if(nChar == VK_NEXT)
{
yAmount = m_nVscrollPage - 50;
if(yAmount < 0)
{
yAmount = 0;
}
}
else if(nChar == VK_PRIOR)
{
yAmount = -(m_nVscrollPage - 50);
if(yAmount > 0)
{
yAmount = 0;
}
} int nVscrollPos = m_nVscrollPos;
nVscrollPos += yAmount;
if(nVscrollPos < 0)
{
yAmount = 0 - m_nVscrollPos;
}
else if(nVscrollPos > m_nVscrollMax)
{
yAmount = m_nVscrollMax - m_nVscrollPos;
}
if(yAmount != 0)
{
ScrollWindow(0, -yAmount); m_nVscrollPos += yAmount;
SetScrollPos(SB_VERT, m_nVscrollPos);
} CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}-----------------------------------------------------------------------------
CRyxxdjDlg.h中
class CRyxxdjDlg : public CHFScrollDialog//注意
{
//....
};
***********************************************************
CRyxxdjDlg.cpp中:CRyxxdjDlg::CRyxxdjDlg(CWnd* pParent /*=NULL*/)
: CHFScrollDialog(CRyxxdjDlg::IDD, pParent)//注意
{
}BEGIN_MESSAGE_MAP(CRyxxdjDlg, CHFScrollDialog)//注意
END_MESSAGE_MAP()BOOL CRyxxdjDlg::OnInitDialog()
{
CHFScrollDialog::OnInitDialog();//注意
//....
}
在对话框属性->Styles->Vertical Scroll打勾就OK了。
哥们,我不知道 CDialog::OnHScroll(nSBCode, nPos, pScrollBar);是否调用了ScrollWindow,如果没有调用,那是不成的