Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » scrollen im Dialog geht nicht.

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
26.04.2009, 18:24 Uhr
~tomycat
Gast


hallo,
mfc Fesenster erstellt in vc++ 2003.
Das Fenster habe ich übergroß gemacht(es gibt viele viele Knöpfe).
Setwindowspos klein gemacht.
(WM_VSCROLL). angeklickt
Verical Scrollbar hinzugefügt.

wenn ich jetzt den Ball nach unten schiebe,dann geht der sofort wieder hoch.
warum?

meine neue erstellte Klasse...

C++:
void ClinkerbalkenDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    // TODO: Add your message handler code here and/or call default

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

}


was muss ich dareinschreiben?
ich habe schon über Tage goggelt und MSDN sudiert :-)
Ich bin wirklich für jede Hilfe 1000 mal dankbar :-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.04.2009, 20:42 Uhr
~tomycat
Gast


hallo,
ich ging jetzt folgender Anleitung nach
http://support.microsoft.com/kb/262954

ok,
neues Projekt erstellt mit dem Namen Test und Dialogbasiernd.

in meiner TestDlg.cpp habe ich folgendes eingefügt


C++:
int m_nCurHeight;
int m_nScrollPos;
CRect m_rect;



in BOOL CTestDlg::OnInitDialog() habe ich folgendes hnzugefügt...

C++:
SetWindowPos(0,100,100,100,100,SWP_NOMOVE); // IST VON MIR :-)
GetWindowRect(m_rect);
m_nScrollPos = 0;



WM_SIZE angeklickt und folgenes hinzugefügt...

C++:
CDialog::OnSize(nType, cx, cy);

    // TODO: Add your message handler code here.
    m_nCurHeight = cy;
    int nScrollMax;
    if (cy < m_rect.Height())
    {
         nScrollMax = m_rect.Height() - cy;
    }
    else
         nScrollMax = 0;

    SCROLLINFO si;
    si.cbSize = sizeof(SCROLLINFO);
    si.fMask = SIF_ALL; // SIF_ALL = SIF_PAGE | SIF_RANGE | SIF_POS;
    si.nMin = 0;
    si.nMax = nScrollMax;
    si.nPage = si.nMax/10;
    si.nPos = 0;
        SetScrollInfo(SB_VERT, &si, TRUE);



WM_VCroll angeklickt und hinzugefügt...

C++:
    // TODO: Add your message handler code here and/or call default.
    int nDelta;
    int nMaxPos = m_rect.Height() - m_nCurHeight;

    switch (nSBCode)
    {
    case SB_LINEDOWN:
        if (m_nScrollPos >= nMaxPos)
            return;
        nDelta = min(nMaxPos/100,nMaxPos-m_nScrollPos);
        break;

    case SB_LINEUP:
        if (m_nScrollPos <= 0)
            return;
        nDelta = -min(nMaxPos/100,m_nScrollPos);
        break;

         case SB_PAGEDOWN:
        if (m_nScrollPos >= nMaxPos)
            return;
        nDelta = min(nMaxPos/10,nMaxPos-m_nScrollPos);
        break;

    case SB_THUMBPOSITION:
        nDelta = (int)nPos - m_nScrollPos;
        break;

    case SB_PAGEUP:
        if (m_nScrollPos <= 0)
            return;
        nDelta = -min(nMaxPos/10,m_nScrollPos);
        break;
    
         default:
        return;
    }
    m_nScrollPos += nDelta;
    SetScrollPos(SB_VERT,m_nScrollPos,TRUE);
    ScrollWindow(0,-nDelta);
    CDialog::OnVScroll(nSBCode, nPos, pScrollBar);




ich habe keine scrollbar,warum
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.05.2009, 13:02 Uhr
~tomycat
Gast


ok, neu angesetzt...
Jetzt habe ich eines der CodeProjekts auseinandergenommen.

WENN ICH:

Die KLasse:

C++:
CScrollDlgDemoDlg::CScrollDlgDemoDlg(CWnd* pParent /*=NULL*/)
       : CDialog(CScrollDlgDemoDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    m_bInitialized = FALSE;                      // <-- neu !!!!!!!!!!!!!
}



Message Map:

C++:
BEGIN_MESSAGE_MAP(CScrollDlgDemoDlg, CDialog)

        ON_WM_VSCROLL()  //neu
    ON_WM_SIZE()   //neu
END_MESSAGE_MAP()


BOOL CScrollDlgDemoDlg::OnInitDialog()
{
//neu ab hier.............
m_nHscrollPos = 0;
m_nVscrollPos = 0;
GetClientRect(&m_ClientRect);
m_bInitialized = TRUE;
CRect initRect;
GetClientRect(initRect);
initRect.left = initRect.right - GetSystemMetrics(SM_CXHSCROLL);
initRect.top = initRect.bottom - GetSystemMetrics(SM_CYVSCROLL);
DWORD dwStyle = WS_CHILD |
SBS_SIZEBOX |
SBS_SIZEBOXBOTTOMRIGHTALIGN |
SBS_SIZEGRIP |
WS_VISIBLE;

m_Grip.Create(dwStyle,initRect, this, AFX_IDW_SIZE_BOX);


SetWindowPos(NULL ,180,40,200,250,SWP_NOREPOSITION);
//bis hier
....
[/cpp]

CGripper:


C++:
BEGIN_MESSAGE_MAP(CGripper, CScrollBar)    
END_MESSAGE_MAP()

UINT CGripper::OnNcHitTest(CPoint point)
{
    UINT ht = CScrollBar::OnNcHitTest(point);
    if(ht==HTCLIENT)
    {
        ht = HTBOTTOMRIGHT;
    }
    return ht;
}



onVSroll und OnSize:


C++:

void CScrollDlgDemoDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    int nInc;
    switch (nSBCode)
    {
        case SB_TOP:        nInc = -m_nVscrollPos;               break;
        case SB_BOTTOM:     nInc = m_nVscrollMax-m_nVscrollPos;  break;
        case SB_LINEUP:     nInc = -1;                           break;
        case SB_LINEDOWN:   nInc = 1;                            break;
        case SB_PAGEUP:     nInc = min(-1, -m_nVertInc);         break;
        case SB_PAGEDOWN:   nInc = max(1, m_nVertInc);           break;
        case SB_THUMBTRACK: nInc = nPos - m_nVscrollPos;         break;
        default:            nInc = 0;
    }

    nInc = max(-m_nVscrollPos, min(nInc, m_nVscrollMax - m_nVscrollPos));

        m_nVscrollPos += nInc;
        int iMove = -4 * nInc;
        ScrollWindow(0, iMove, NULL, NULL);
        SetScrollPos(SB_VERT, m_nVscrollPos, TRUE);

    CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CScrollDlgDemoDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialog::OnSize(nType, cx, cy);
    if (m_bInitialized)
    {

    ScrollWindow(0, m_nVscrollPos*4, NULL, NULL);
    m_nHscrollPos = 0;
    m_nVscrollPos = 0;
    SetScrollPos(SB_VERT, m_nVscrollPos, TRUE);
    CRect tempRect;
    GetClientRect(&tempRect);
    WINDOWPLACEMENT wp;
    GetWindowPlacement(&wp);
    BOOL bMaximized = (wp.showCmd == SW_MAXIMIZE);
    m_nVertInc = (m_ClientRect.Height() - tempRect.Height())/4;
    m_Grip.ShowWindow(SW_SHOW);
    m_nVscrollMax = max(0, m_nVertInc);
    m_nVscrollPos = min(m_nVscrollPos, m_nVscrollMax);
    SetScrollRange(SB_VERT, 0, m_nVscrollMax, FALSE);
    SetScrollPos(SB_VERT, m_nVscrollPos, TRUE);
    }




DIE HEADER DATEI:


C++:
class CScrollDlgDemoDlg : public CDialog
{
public:
...
protected:
....
    //neu:ab hier
    void SetupScrollbars();
    void ResetScrollbars();
    int  m_nHorzInc, m_nVertInc,
         m_nVscrollMax, m_nHscrollMax,
         m_nVscrollPos, m_nHscrollPos;

    CRect m_ClientRect;
    BOOL m_bInitialized;
    CGripper m_Grip;
    afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    afx_msg void OnSize(UINT nType, int cx, int cy);
    //neu ende



class Cgripper...


C++:
//neu
class CGripper : public CScrollBar
{
public:
    CGripper(){};
public:
    virtual ~CGripper(){};
protected:
    afx_msg UINT OnNcHitTest(CPoint point);
    DECLARE_MESSAGE_MAP()
};
//neu ende



----------------------------
Wenn ich ein neues Projekt erstelle (MFC Dialog basis) und ich die Codes schnipsel hinzufüge(CScrollDlgDemoDlg in Cblabla umbenannt), dann habe ich ein scroll Leiste am Rechten Rand,geht 1a !!!

Zu meinem Problem, ich habe vom meinem MFC Hauptdialog ein CDialog mit einer neuen Klasse ertsellt und die Code schnipsel hinzugefügt(CScrollDlgDemoDlg in Chochund umbenannt),dann fehlt mir...

C++:
Chochund::Chochund(CWnd* pParent /*=NULL*/)
       : CDialog(Chochund::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}



ok,hinzugefügt kommt folgende Fehlermeldung:


Code:
hochund.cpp(281): error C2084: function 'Chochund::Chochund(CWnd *)' already has a body



Ich bin für Idee/Vorschlag 1000 mal Dankbar,weil dann ist mein Projekt 99% fertig ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.05.2009, 08:26 Uhr
Tommix



Hallo,
ich rate mal ins Blaue... Hast Du vielleicht im Header

C++:
class Chochund: public CDialog
{
public:
    Chochund(CWnd*) {}
//....


statt

C++:
class Chochund: public CDialog
{
public:
    Chochund(CWnd*);
//....


stehen?

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: