Scrollbar Problem



  • Also ich hab hier einen Code, der nicht so richtig funktioniert:

    ; mache es in MASM
    .data
    Scroll            SCROLLINFO <sizeof(SCROLLINFO),SIF_ALL,0,10,1,5,5>
    
    .data?
    pos            dd ?
    
    .code
    ...
    mov eax,uMsg
    .IF eax==WM_INITDIALOG        
        invoke GetDlgItem,hWnd,IDC_SCROLL_TYP
        invoke SetScrollInfo,eax,SB_CTL,addr Scroll,TRUE
    
    .ELSEIF eax==WM_VSCROLL
        mov eax,sizeof(SCROLLINFO)
        mov Scroll.cbSize,eax
        mov Scroll.fMask,SIF_ALL
        invoke GetDlgItem,hWnd,IDC_SCROLL_TYP
        invoke GetScrollInfo,eax,SB_CTL,addr Scroll
        mov eax,Scroll.nPos
        mov pos,eax
    
        mov eax,wParam
        .IF eax==SB_THUMBTRACK
            mov eax,Scroll.nTrackPos
            mov Scroll.nPos,eax
        .ELSEIF eax==SB_LINEUP
            sub Scroll.nPos,1
        .ELSEIF eax==SB_LINEDOWN
            add Scroll.nPos,1
        .ELSEIF eax==SB_PAGEUP
            mov eax,Scroll.nPage
            sub Scroll.nPos,eax
        .ELSEIF eax==SB_PAGEDOWN
            mov eax,Scroll.nPage
            add Scroll.nPos,eax
        .ENDIF
    
        mov eax,pos
        .IF eax!=Scroll.nPos
            mov Scroll.fMask,SIF_POS
            invoke GetDlgItem,hWnd,IDC_SCROLL_TYP
            invoke SetScrollInfo,eax,SB_CTL,addr Scroll,TRUE
        .ENDIF
    .ENDIF
    

    Da regiert der Scrollbalken bei SB_THUMBTRACK nicht so richtig. Wo hab ich hier 'nen Fehler?

    Bitte nicht in WinApi-Forum verschieben, denn ich hab hier tatsächlich ein Assembler Problem. Beweis:

    SCROLLINFO si;
    ...
    case WM_INITDIALOG:
    	si.cbSize = sizeof(SCROLLINFO);
    	si.fMask = SIF_ALL;
    	si.nMin = 0;
    	si.nMax = 10;
    	si.nPage = 1;
    	si.nPos = 5;
    	si.nTrackPos = 0;    // 0 oder weglassen, nur bei GetScrollInfo relevant
    	SetScrollInfo(GetDlgItem(hWnd,IDC_SCROLL),SB_CTL,&si,TRUE);
    	break;
    case WM_VSCROLL:
    	int tempPos;
    	si.cbSize=sizeof(SCROLLINFO);
    	si.fMask=SIF_ALL;
    	GetScrollInfo(GetDlgItem(hWnd,IDC_SCROLL),SB_CTL,&si);
    	tempPos=si.nPos;
    
    	switch(LOWORD(wParam))
    	{
    	case SB_THUMBTRACK:
    		si.nPos=si.nTrackPos;
    		break;
    	case SB_LINEUP:
    		--si.nPos;
    		break;
    	case SB_LINEDOWN:
    		++si.nPos;
    		break;
    	case SB_PAGEUP:
    		si.nPos-=si.nPage;
    		break;
    	case SB_PAGEDOWN:
    		si.nPos+=si.nPage;
    		break;
    	}
    
    	if(tempPos!=si.nPos)
    	{
    		si.fMask=SIF_POS;
    		SetScrollInfo(GetDlgItem(hWnd,IDC_SCROLL),SB_CTL,&si,TRUE);
    	}
    	break;
    

    Eigentlich sollte es das selbe sein.

    mfg A-lex



  • durch den Spammer bin ich zufällig wieder auf den Thread gestoßen:
    du machst imho hier einen Denkfehler/Flüchtigkeitsfehler:

    switch(LOWORD(wParam))
        {
        case SB_THUMBTRACK:
    

    das funktioniert, ja.

    mov eax,wParam
        .IF eax==SB_THUMBTRACK
            mov eax,Scroll.nTrackPos
            mov Scroll.nPos,eax
    

    warum versuchst du aber hier direkt den ganzen wParam zu vergleichen 😉 ? Und nicht etwa nur den LOWORD (siehe dafür nur den AX Register-Teil).Damit vergleichst du SB_THUMBTRACK mit dem kompletten wParam und das kann ja net klappen 😉


Anmelden zum Antworten