vertical Scrollbar funkt nicht



  • hi,
    mfc Fesenster erstellt in vc++ 2003.
    übergorß das Fesner gemacht.
    Setwindowspos klein gemacht.
    Verical Scrollbar hinzugefügt.
    wenn ich jetzt den Ball nach unten schiebe,dann geht der sofort wieder hoch.
    warm?


  • Mod

    Weil Du dem Scrollbar nicht gesagt hast welchen Range er hat?
    SetScrollInfo, SetScrollRange, SetScrollPos... etc.

    Man lese die MSDN...
    http://msdn.microsoft.com/en-us/library/bb787527(VS.85).aspx



  • sorry, ich stehe voll auf dem Schlauch.
    soll ich eine Variable hinzufügen,wenn ja da kommt dann Buttion1 ?!
    Stimmt das?
    Wo soll ich den Quellcode hinzufügen?
    Ich möchte nichts anderes machen, wie ein risen Fenster mit setwindowspos scollen.
    Braucheich WM_VCROLL ?
    Ich stehe wie ein Ochse vor dem Berg 🙂


  • Mod

    Du musst das dann machen, wenn Du weußt wieviel Zeilen vorhanden sind.
    Und Du musst einen entsprechenden WM_VSCROLL Handler einbauen.

    Einfacher kan es aber evtl. sein CScrollView direkt zu verwemdem.

    Siehe Scribble Tutorial!



  • ok,thx.
    ich habe jetzt ein test Projekt erstellt.

    Fenster gross gezogen und mit setwindowpos klein gemacht,
    klick auf WM_Vblabla, was muss ich jetzt grob reinschreiben?!

    CnSBCode, nPos, pScrollBar <-- welche Werte muss ich ändern?

    Sorry, ich sehe vor lauter Bäume den wald nicht mehr.



  • 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...

    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...

    // 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


  • Mod



  • ok,
    ich ging deinen Rat nach, danke.
    Jetzt studiere ich gerade den Quellcode.

    1.Problem...
    ich habe die....
    #define AFX_SCROLLDLGDEMODLG_H__2AD05597_2849_11D3_8EF0_00104B30908A__INCLUDED_ herausgenommen und bekomme folgende Fehlermeldung.Kann ich die def auch anderst schreiben?

    error C2011: 'CScrollDlgDemoDlg' : 'class' type redefinition
    
    ScrollDlgDemoDlg.h(6) : see declaration of 'CScrollDlgDemoDlg'
    

    2.Problem...
    in meinem selbst erstellten Projekt habe ich...

    int_PTR nResponse = dlg.DoModal();
    

    in dem Projekt...

    int nResponse = dlg.DoModal();
    

    warum ist das so?



  • @Martin Richter

    also ich habe deinen Rat befolgt.
    Jetzt habe ich eines der CodeProjekts auseinandergenommen.

    WENN ICH:

    Die KLasse:

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

    Message Map:

    BEGIN_MESSAGE_MAP(CScrollDlgDemoDlg, CDialog)
    
            ON_WM_VSCROLL()  //neu
    	ON_WM_SIZE()   //neu
    END_MESSAGE_MAP()
    

    oninitDialog:

    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
    ....
    

    CGripper:

    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:

    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:

    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...

    //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...

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

    ok,hinzugefügt kommt folgende Fehlermeldung:

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

    ok,ähhhh ich lasse die Chochund::Chochund(CWnd* pParent /=NULL/)....weg,was sowieso nicht da ist 🙂 Dann läuft mein Projekt,bis ich auf den folgenden Knopf drücke von meinem Hauptfenster...

    Chochund* pDialog; //Csystemanzeige ist meine Klasse was ich erstellt 
    
       pDialog = new Chochund(); 
       if(pDialog != NULL)
       {
          BOOL ret = pDialog->Create(IDD_hochund,this); //IDD_SYSTEM ist mein Dialogfenster
          if(!ret)  
             AfxMessageBox("Error creating Dialog");
          pDialog->ShowWindow(SW_SHOW);
       }
       else
          AfxMessageBox("Error Creating Dialog Object");
    

    Error in Zeile 330 von der Wino.cpp (hab ich noch nie gesehen).Wenn ich auf ignorieren drücke, dann kommt mein CDialog und ich kann scrollen 🙂

    Muss ich die Zeile...

    m_bInitialized = FALSE;
    

    in meinem Hauptfenster unterbringen?Das ist die einzigste Zeile die ich noch nicht untergebracht habe 🙂

    Ich bin für Idee/Vorschlag 1000 mal Dankbar,weil dann ist mein Projekt 99% fertig.



  • ok, habs hinbekommen...
    aus...
    [/cpp]
    m_Grip.ShowWindow(SW_SHOW);

    machte ich...
    

    //m_Grip.ShowWindow(SW_SHOW);
    [cpp]

    🙂 🙂 🙂 🙂 🙂 🙂 🙂


Anmelden zum Antworten