 |
HScroll and OnHScroll issue |
 |
07.02.2004, 14:08
|
#1
|
Академик
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
|
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!
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/
|
|
|
08.02.2004, 09:39
|
#2
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
Что есть метод HScroll? Так как его нет ни в CScrollBar ни в CWnd - е.
A сообщение скорее всего приходит с 2 разными кодами.
|
|
|
09.02.2004, 12:02
|
#3
|
Академик
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
|
Quote:
Originally Posted by Agregat
Что есть метод HScroll? Так как его нет ни в CScrollBar ни в CWnd - е.
A сообщение скорее всего приходит с 2 разными кодами.
|
разобрался.
Во второй раз (в 3-й, 5-й, 10-й...) приходит уведомление "SB_ENDSCROLL".
что есть "HScroll" ? Г-м, метод. Сам поищи - найдешь в списке.
Не пойму, почему "OnHScroll" не вызывается.
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/
|
|
|
09.02.2004, 12:45
|
#4
|
Грустно...
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 43
Posts: 21,717
Rep Power: 9
|
MSDN знает такую функцию только для Javы - Может ты привязал сообщение к функции HScroll?
|
|
|
09.02.2004, 13:05
|
#5
|
Академик
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
|
Quote:
Originally Posted by Agregat
MSDN знает такую функцию только для Javы - Может ты привязал сообщение к функции HScroll?
|
ты сам попробуй - создай класс derived from CScrollBar. И глянь КлассВизард - увидишь в списке мессагов 2 хандлера.
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/
|
|
|
 |
|
 |
09.02.2004, 13:17
|
#6
|
Академик
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
|
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 - один и тот же.
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/
|
|
|
 |
09.02.2004, 13:20
|
#7
|
Академик
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
|
ya uvelichil HEIGHT skroll-a, posle "setscrollinfo()" vot chto imeem:
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/
|
|
|
 |
BUG или FiTcha ? |
 |
10.02.2004, 12:37
|
#8
|
Академик
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
|
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() )!
ну что такое......
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/
|
|
|
 |
|
 |
11.02.2004, 09:33
|
#9
|
Академик
Join Date: 09 2001
Location: inside myself
Posts: 5,369
Rep Power: 6
|
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.
__________________
И повешенные могут качаться в неположенную сторону. /С.Е.Лец/
|
|
|
 |
All times are GMT. The time now is 09:14. |
|
|