Go Back   Armenian Knowledge Base > Technical sections > Languages, Compilers, Interpreters

Reply
 
Thread Tools

HScroll and OnHScroll issue
Old 07.02.2004, 14:08   #1
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 7
Default HScroll and OnHScroll issue

h-m, I'm getting lost!

I've created a class derived from CScrollBar.

Then I'm willing to trace each time user scrolls it.

And noticed that in "CMyScrollBar::HScroll(...)" method invoked TWICE when I'm pressing scrollbar buttons.

In opposite - "CMyScrollBar::OnHScroll(...)" method invoked NEVER.


Please explain what's goin' on.

thanks!
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/

Old 08.02.2004, 09:39   #2
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 44
Posts: 21,717
Rep Power: 9
Default

Что есть метод HScroll? Так как его нет ни в CScrollBar ни в CWnd - е.
A сообщение скорее всего приходит с 2 разными кодами.

Old 09.02.2004, 12:02   #3
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 7
Default

Quote:
Originally Posted by Agregat
Что есть метод HScroll? Так как его нет ни в CScrollBar ни в CWnd - е.
A сообщение скорее всего приходит с 2 разными кодами.
разобрался.
Во второй раз (в 3-й, 5-й, 10-й...) приходит уведомление "SB_ENDSCROLL".

что есть "HScroll" ? Г-м, метод. Сам поищи - найдешь в списке.
Не пойму, почему "OnHScroll" не вызывается.

Old 09.02.2004, 12:45   #4
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 44
Posts: 21,717
Rep Power: 9
Default

MSDN знает такую функцию только для Javы - Может ты привязал сообщение к функции HScroll?

Old 09.02.2004, 13:05   #5
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 7
Default

Quote:
Originally Posted by Agregat
MSDN знает такую функцию только для Javы - Может ты привязал сообщение к функции HScroll?
ты сам попробуй - создай класс derived from CScrollBar. И глянь КлассВизард - увидишь в списке мессагов 2 хандлера.

Old 09.02.2004, 13:17   #6
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 7
Default

PHP Code:
// yourScroll.cpp : implementation file
//

#include "stdafx.h"
#include "delete_Me.h"
#include "yourScroll.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CyourScroll

CyourScroll::CyourScroll()
{
}

CyourScroll::~CyourScroll()
{
}


BEGIN_MESSAGE_MAP(CyourScroll, CScrollBar)
    
//{{AFX_MSG_MAP(CyourScroll)
    
ON_WM_HSCROLL()
    
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CyourScroll message handlers

void CyourScroll::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
    
Beep(1000, 100);
    
    
CScrollBar::OnHScroll(nSBCode, nPos, pScrollBar);
} 
дык ведь бибикает, сссобака! после "SetScrollInfo()".


во зараза - когда вызываем "SetScrollInfo()", появляется такой вот уродливый скроллбар-дупликат. Но Window HANDLE - один и тот же.
Attached Thumbnails
Clipboard01.jpg  

Old 09.02.2004, 13:20   #7
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 7
Default

ya uvelichil HEIGHT skroll-a, posle "setscrollinfo()" vot chto imeem:
Attached Thumbnails
Clipboard01.jpg  

BUG или FiTcha ?
Old 10.02.2004, 12:37   #8
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 7
Exclamation BUG или FiTcha ?

вот что я обнаружил, может кто прояснить ЗАКОНОМЕРНОСТЬ ?

PHP Code:
    SCROLLINFO si;
    
si.cbSize = sizeof(si); 
    
si.fMask  = SIF_ALL;
    
si.nMin   = 0; 
    
si.nMax   = 13;
    
si.nPage  = 0+si.nMax/10;  // look here!
    
si.nPos   = 0; 

    
ps->SetScrollInfo( &si ); 

в этом случае скролить можно по всему рангу [si.nMin...si.nMax]
интересное начинается, когда "si.nPage = 1+si.nMax/10;"
Вроде бы не имеющий отношения к scrollStep-u, но - хоть лопни, но значения == 13 == si.nMax никак не добиться (т.е. даже posredstwom SetScrollInfo() )!


ну что такое......

Old 11.02.2004, 09:33   #9
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 7
Default

PHP Code:
void CDrawWAVDlg::assignScrollControl( CDrawWithScroll *pDS,
 
CMemoryMappedFile *pMemFile, CGdraw *pDraw, int sbDlgID )
{
    
CScrollBar *ps = (CScrollBar*)GetDlgItem( sbDlgID );
    if (!
ps)
    {    
TRACE(" error: can't get handle of Scroll bar\n");
        return;    }

    
int fileLength = pMemFile->GetLength() -1;
    
int pageSize = fileLength/10;// use 10% for a pageSize.
    
    
SCROLLINFO si;
    
si.cbSize = sizeof(si); 
    
si.fMask  = SIF_ALL;
    
si.nMin   = 0; 
    [
b]si.nMax   = fileLength + pageSize -1;[/b]
    
si.nPage  = pageSize; 
    
si.nPos   = 0;
    
ps->SetScrollInfo( &si );
...
    
pDS->m_scrollMax = fileLength;
}


...
void CDrawWAVDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
    
SCROLLINFO si;
    
int pos;
    
int currPos = pScrollBar->GetScrollPos();
    
pScrollBar->GetScrollInfo( &si );
    
TRACE( "*** currPos = %d\n", currPos );
    switch (
nSBCode)
    {
        case 
SB_TOP:
            
pos = -currPos;
            break;
        case 
SB_BOTTOM:
            
pos = si.nMax - currPos;
            break;
        case 
SB_LINEUP:
            
pos = -1;
            break;
        case 
SB_LINEDOWN:
            
pos = 1;
            break;
        case 
SB_PAGEUP:
            
pos = -(int)si.nPage;
            break;
        case 
SB_PAGEDOWN:
            
pos = si.nPage;
            break;
        case 
SB_THUMBTRACK:
            
pos = 0;
            
pos = si.nTrackPos;// get the current position
            
pScrollBar->SetScrollPos( pos );
            
SetDlgItemInt( IDC_STATIC_POS, pScrollBar->GetScrollPos(), FALSE );            
            break;
        case 
SB_ENDSCROLL:
            
SetDlgItemInt( IDC_STATIC_POS, pScrollBar->GetScrollPos(), FALSE );            
            break;
        default:    
pos = 0;
    }

    if ( (
SB_ENDSCROLL !=nSBCode ) && (SB_THUMBTRACK != nSBCode) )
    {
        
pos += currPos;


        
// check bounds:
        // NOTE: use not "si.nMax", but manual managed "m_nMax" member.
        
pos = min( m_ds.m_scrollMax, max( pos, si.nMin ) );
        
        
pScrollBar->SetScrollPos( pos );
        
TRACE( " setscrollpos() = %d\n", pos );
        
TRACE( " getscrollpos() = %d\n", pScrollBar->GetScrollPos() );// read actual position set.
    
}


//    CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
} 
Dunno, is it a bug or a feature of ScrollControl, anyway I noticed the following regularity:
SetScrollPos() doesn't set the "SCROLLINFO.nMax" position if SCROLLINFO.nPage member is just some "percentage" of "SCROLLINFO.nMax".

So we have to adjust "SCROLLINFO.nMax" by "SCROLLINFO.nPage" ( and substract one if you want scroll range [0..nMax] ).

Voila, friends.

what about strange "design" (see topik attachments) I suppose that's because of resource IDs duplicates. I've created anew the whole project and started GUI design with extra care - and all works fine at the moment.
Reply




Реклама:
реклама
Buy text link .

All times are GMT. The time now is 12:37.
Top

Powered by vBulletin® Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.