Armenian Knowledge Base  

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

Reply
 
LinkBack Thread Tools
Old 07.02.2004, 14:08   #1
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
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!
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/
Reply With Quote
Old 08.02.2004, 09:39   #2
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 8
Default

Что есть метод HScroll? Так как его нет ни в CScrollBar ни в CWnd - е.
A сообщение скорее всего приходит с 2 разными кодами.
Reply With Quote
Old 09.02.2004, 12:02   #3
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
Default

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

что есть "HScroll" ? Г-м, метод. Сам поищи - найдешь в списке.
Не пойму, почему "OnHScroll" не вызывается.
Reply With Quote
Old 09.02.2004, 12:45   #4
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 8
Default

MSDN знает такую функцию только для Javы - Может ты привязал сообщение к функции HScroll?
Reply With Quote
Old 09.02.2004, 13:05   #5
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
Default

Quote:
Originally Posted by Agregat
MSDN знает такую функцию только для Javы - Может ты привязал сообщение к функции HScroll?
ты сам попробуй - создай класс derived from CScrollBar. И глянь КлассВизард - увидишь в списке мессагов 2 хандлера.
Reply With Quote
Old 09.02.2004, 13:17   #6
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
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(CyourScrollCScrollBar)
    
//{{AFX_MSG_MAP(CyourScroll)
    
ON_WM_HSCROLL()
    
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

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

void CyourScroll::OnHScroll(UINT nSBCodeUINT nPosCScrollBarpScrollBar
{
    
Beep(1000100);
    
    
CScrollBar::OnHScroll(nSBCodenPospScrollBar);

дык ведь бибикает, сссобака! после "SetScrollInfo()".


во зараза - когда вызываем "SetScrollInfo()", появляется такой вот уродливый скроллбар-дупликат. Но Window HANDLE - один и тот же.
Attached Thumbnails
Clipboard01.jpg  
Reply With Quote
Old 09.02.2004, 13:20   #7
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
Default

ya uvelichil HEIGHT skroll-a, posle "setscrollinfo()" vot chto imeem:
Attached Thumbnails
Clipboard01.jpg  
Reply With Quote
Old 10.02.2004, 12:37   #8
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
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() )!


ну что такое......
Reply With Quote
Old 11.02.2004, 09:33   #9
Академик
 
greka's Avatar
 
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Downloads: 0
Uploads: 0
Reputation: 18 | 5
Default

PHP Code:
void CDrawWAVDlg::assignScrollControlCDrawWithScroll *pDS,
 
CMemoryMappedFile *pMemFileCGdraw *pDrawint sbDlgID )
{
    
CScrollBar *ps = (CScrollBar*)GetDlgItemsbDlgID );
    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 nSBCodeUINT nPosCScrollBarpScrollBar
{
    
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->SetScrollPospos );
            
SetDlgItemIntIDC_STATIC_POSpScrollBar->GetScrollPos(), FALSE );            
            break;
        case 
SB_ENDSCROLL:
            
SetDlgItemIntIDC_STATIC_POSpScrollBar->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 minm_ds.m_scrollMaxmaxpossi.nMin ) );
        
        
pScrollBar->SetScrollPospos );
        
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 With Quote
Sponsored Links
Reply

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 10:50.


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