Scrollbars in CMDIFrameWnd
Wendelin Reich -- wreich@gwdg.de
Thursday, May 16, 1996
******* G'day folks ********
Environment: VC++ 4.1 / Win 95
Task: In order to let the user use the scrollbars when a MDI-Childf gets
out of the client-area of the MDIFrame, I want the latter to support
Scrollbars.
My (wrong) solution: In my CMDIFrameWnd-derived class, I set the
Scrollbar-Styles as follows:
BOOL CMyownMDIFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
{
BOOL bRet = CMDIFrameWnd::PreCreateWindow(cs);
cs.dwExStyle |= WS_VSCROLL | WS_HSCROLL;
return bRet;
}
Problem: With this solution (and also when I set the style before
calling the parent::PreCreateWindow() !) I get (during the start-up
of the app) an *ASSERTION-failure* deep down in MFC, in (as the
debugger says) file winocc.cpp:
CWnd* CWnd::GetDlgItem(something) {
ASSERT(::IsWindow(m_hWnd)); // <-- here
...
}
What did I do wrong? How do I get Scrollbars (like in every other
Windows-App, like Word and Excel f.ex.)?
BTW, David Elliott wrote:
> Try changing the style before calling PreCreateWindow().
As said, I tried this before, but it makes no difference...
--
cu/ru...
Wendelin Reich wreich@gwdg.de
Dept. of Economic Geography Tel (Job): +49-551-398088
Geographisches Institut der Tel (priv.): +49-551-35906
Universitaet Goettingen
D-37077 Goettingen, Germany
Frederic Steppe -- FredericS@msn.com
Saturday, May 18, 1996
>Environment: VC++ 4.1 / Win 95
>
>Task: In order to let the user use the scrollbars when a MDI-Childf gets
>out of the client-area of the MDIFrame, I want the latter to support
>Scrollbars.
>
>My (wrong) solution: In my CMDIFrameWnd-derived class, I set the
>Scrollbar-Styles as follows:
>
>BOOL CMyownMDIFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
> ...
> cs.dwExStyle |= WS_VSCROLL | WS_HSCROLL;
> ...
Well, as WS_HSCROLL and WS_VSCROLL aren't extended styles, you'd better modify
the standard style :
cs.style |= WS_VSCROLL | WS_HSCROLL;
Even this way, I don't know if you'll get the expected result so easily.
Frederic Steppe (frederics@msn.com)
Amir Salzberg -- amirfalz@netvision.net.il
Sunday, May 19, 1996
you have to take care of OnHScroll() and OnVScroll() yourself; like this:
BOOL DetailDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
SetScrollRange (SB_HORZ, 0, 10);
SetScrollRange (SB_VERT, 0, 135);
return TRUE; // return TRUE unless you set the focus to a control
}
void DetailDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
// Scroll the dialog box when needed
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
int pos,gap;
pos = GetScrollPos(SB_VERT);
switch (nSBCode) {
case SB_THUMBPOSITION:
SetScrollPos (SB_VERT, nPos);
break;
case SB_LINEUP:
gap = 15;
if (pos - gap > 0) {
pos -= gap;
} else {
pos = 0;
}
SetScrollPos (SB_VERT, pos);
if (pos > 0)
ScrollWindow(0, 15);
break;
case SB_LINEDOWN:
gap = 15;
if (pos + gap < 135) {
pos += gap;
} else {
pos = 135;
}
SetScrollPos (SB_VERT, pos);
if (pos < 135)
ScrollWindow(0, -15);
}
}
void DetailDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
// Scroll the dialog box when needed
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
int pos,gap;
pos = GetScrollPos(SB_HORZ);
switch (nSBCode) {
case SB_THUMBPOSITION:
SetScrollPos (SB_HORZ, nPos);
break;
case SB_LINELEFT:
gap = 1;
if (pos - gap > 0) {
pos -= gap;
} else {
pos = 0;
}
SetScrollPos (SB_HORZ, pos);
if (pos > 0)
ScrollWindow(1, 0);
break;
case SB_LINERIGHT:
gap = 1;
if (pos + gap < 10) {
pos += gap;
} else {
pos = 10;
}
SetScrollPos (SB_HORZ, pos);
if (pos < 10)
ScrollWindow(-1, 0);
}
| Вернуться в корень Архива
|