Вверх ↑
Этот топик читают: Гость
Гость
Ответов: 17029
Рейтинг: 0
#1: 2007-12-22 20:08:09 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2021-05-21 12:11:25
карма: 0

0
Ответов: 5446
Рейтинг: 323
#2: 2007-12-22 21:18:21 ЛС | профиль | цитата
Скажем так: в том примере возникает "конфликт" двух функций, меняющих положение ползунка: во-первых, это действия пользователя, а во-вторых - автоматическое изменение положения по мере проигрывания файла. Если бы я столкнулся с такой проблемой при написании программы, то я бы при поступлении события WM_HSCROLL с SB_THUMBTRACK установил бы флаг "Ползунок не тронь!", и проверял его перед установкой позиции. А при поступлении WM_HSCROLL с SB_ENDSCROLL - снимал бы этот флаг.

Да, и кстати, "правильные пацаны" используют GetScrollInfo для определения позиции ползунка Ибо сказано:
"MSDN:WM_HSCROLL" писал(а):
Note that the WM_HSCROLL message carries only 16 bits of scroll box position data. Thus, applications that rely solely on WM_HSCROLL (and WM_VSCROLL) for scroll position data have a practical maximum position value of 65,535.

------------ Дoбавленo:

Чуть более общий сценарий: вообще всегда при поступлении WM_xSCROLL ставим сий флаг, а снимаем его:

  • По окончании обработки, если он не был до входа в процедуру выставлен и если LOWORD(Msg.wParam) не равен SB_THUMBTRACK
  • Если LOWORD(Msg.wParam) равен SB_ENDSCROLL или SB_THUMBPOSITION.

А в данном конкретном примере нам надо обеспечить посылку onPosition до того, как мы в очередной раз программно подвинем ScrollBar.

карма: 1

0
Гость
Ответов: 17029
Рейтинг: 0
#3: 2007-12-22 21:25:09 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2021-05-21 12:11:26
карма: 0

0
Ответов: 9906
Рейтинг: 351
#4: 2007-12-22 21:39:24 ЛС | профиль | цитата
iarspider писал(а):
Скажем так: в том примере возникает "конфликт" двух функций, меняющих положение ползунка: во-первых, это действия пользователя, а во-вторых - автоматическое изменение положения по мере проигрывания файла

Либо покажи схему, в которой "автоматическое изменение положения по мере проигрывания файла" сделано не от таймера, либо не пудри людям мозги.
События в одном потоке НЕ КОНФЛИКТУЮТ.
Если разные потоки, то эти флаги, вместе с их проверками, называются критические секции - для потоков одного процесса, и мьютексы - для разных.
карма: 9

0
Гость
Ответов: 17029
Рейтинг: 0
#5: 2007-12-22 21:43:21 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2021-05-21 12:11:26
карма: 0

0
Ответов: 9906
Рейтинг: 351
#6: 2007-12-22 21:47:11 ЛС | профиль | цитата
HELP писал(а):
VSh, я не предоставил схему, потому что она есть в папке examples

А имя файла не написал, потому-что это "очевидно".
Так что-ли
карма: 9

0
Гость
Ответов: 17029
Рейтинг: 0
#7: 2007-12-22 21:53:02 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2021-05-21 12:11:26
карма: 0

0
Ответов: 9906
Рейтинг: 351
#8: 2007-12-22 22:20:08 ЛС | профиль | цитата
Не надо делать, не тебе сказано было

Подели этот Position на 10 при внесение в ScrollBar, и умнож на те же 10 при установке Position из ScrollBar-а
И не мучайся

Все понятно в общем: полный путь к файлу написать - религия не позволяла
карма: 9

0
Гость
Ответов: 17029
Рейтинг: 0
#9: 2007-12-22 22:32:04 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2021-05-21 12:11:26
карма: 0

0
Разработчик
Ответов: 26109
Рейтинг: 2124
#10: 2007-12-22 22:37:29 ЛС | профиль | цитата
HELP, ты что, в философы записался? Теоретик, блини...
А то выдал:
HELP писал(а):
А вещи, которые очевидны для новичков, совсем даже не очевидны для админом и профессионалов!

карма: 22

0
Ответов: 5446
Рейтинг: 323
#11: 2007-12-22 22:47:11 ЛС | профиль | цитата
Galkov, пардон, согласен, соврал. В тестовой схеме всё работает...
code_7996.txt

Но тогда я совсем не понимаю, "где собака порылась" (с)

------------ Дoбавленo:


Ага, так мы ещё и разные схемы исследуем?! Я-то Bass_Test изучаю...
карма: 1

0
файлы: 1code_7996.txt [452B] [270]
Ответов: 9906
Рейтинг: 351
#12: 2007-12-22 23:27:01 ЛС | профиль | цитата
iarspider, а мне теперь уже показалось, что мы говорили о разных "конфликтах"
Я-то говорил о кодовых, когда все громко крякает...
А в смысле "функционального" - да, таймер надо останавливать на время "таскания".
------------ Дoбавленo:

Кстати, про "правильных пацанов" и GetScrollInfo...
Давно не возился, но не очень уверен, что GetScrollInfo вернет адекватную информацию ДО окончания таскания
Есть подозрения, что нет
Ты проверял
------------ Дoбавленo:

BTW: еше раз про "правильных пацанов" - я не очень хорошо знаю их возможности
А вот про "белых людей" могу сказать: читая с частотой 16КГц всего 2 бита (а не 16) информации с микронного датчика координаты - не имеют проблем.
Даже БЕЗ алгоритмических ограничений на скорость (на ускорение есть ограничение - ~20g)
карма: 9

0
Ответов: 5446
Рейтинг: 323
#13: 2007-12-22 23:33:45 ЛС | профиль | цитата
Про GetScrollInfo - вот что пишет дядя Билли:
MSDN:GetScrollInfo писал(а):

To get the 32-bit position of the scroll box (thumb) during a SB_THUMBTRACK request code in a WM_HSCROLL or WM_VSCROLL message, call GetScrollInfo with the SIF_TRACKPOS value in the fMask member of the SCROLLINFO structure. The function returns the tracking position of the scroll box in the nTrackPos member of the SCROLLINFO structure. This allows you to get the position of the scroll box as the user moves it. The following sample code illustrates the technique.

#cpp
SCROLLINFO si;
case WM_HSCROLL:
switch(LOWORD(wparam)) {
case SB_THUMBTRACK:
// Initialize SCROLLINFO structure

ZeroMemory(&si, sizeof(si));
si.cbSize = sizeof(si);
si.fMask = SIF_TRACKPOS;

// Call GetScrollInfo to get current tracking
// position in si.nTrackPos

if (!GetScrollInfo(hwnd, SB_HORZ, &si) )
return 1; // GetScrollInfo failed
break;
.
.
.
}


То бишь - обязуется, но только если попросим правильно (c SIF_TRACKPOS, а не с SIF_POS).

Последний пассаж про "правильных пацанов" несколько не очень понял.
карма: 1

0
Ответов: 9906
Рейтинг: 351
#14: 2007-12-23 01:28:10 ЛС | профиль | цитата
Кое-что я подзабыл, конечно...
Но что-то мне кажется, что SB_THUMBTRACK и SB_THUMBPOSITION - не одно и то же...

Конкретный вопрос: умничать будешь, или пальцем показывать

Последний пассаж означает, что существуют простые алгоритмические средства, позволяющие не терять полную (например 32 бита) информацию при регулярном получение неполной (16 бит). Если кое что гарантировано, например, что нет больших (>32767) скачков между двумя соседними сеаесами получения неполной (16 бит)


------------ Дoбавленo:

HELP писал(а):
А вещи, которые очевидны для новичков, совсем даже не очевидны для админом и профессионалов!


HELP, вбей себе в мозг
Очевидность - понятие относительное
"Совсем даже не очевидны" для любого, кто не видит происходящего у тебя на экране
У этого вопроса борода такая, что и подумать страшно.
К примеру я знаю отношение к этому вопросу почти любого постоянного посетителя
Знаю, что "вбей себе в мозг" сработает с вероятностью не больше 10%
Но, в принципе, мне запомнилось древнее высказывание Dilma на этот предмет: http://hiasm.com/forum.html?q=3&p=11273#p11273
Обратите внимание на дату

А конкретные кодовые соображения про масштабирование и выключение таймера примерно таковы

#sha
Add(MainForm,89500,14,77)
{
Left=312
Top=234
Width=392
Height=112
}
Add(MediaPlayer,98238,238,77)
{
VideoScale=1
}
Add(Hub,58639,175,77)
{
link(onEvent1,98238:doPlay,[])
link(onEvent2,4265710:doOperation,[(221,90)(221,153)])
}
Add(ODialog,20862,119,77)
{
StartDir="MUSICABBA"
link(onExecute,58639:doEvent1,[])
}
Add(Math,117273,399,140)
{
OpType=2
Op2=10
ResultType=0
link(onResult,98238:doPosition,[(443,146)(443,125)(226,125)(226,104)])
}
Add(ScrollBar,75508,294,140)
{
Left=20
Top=50
Width=340
Height=20
Color=-16777200
Max=60000
ScrollMode=1
Point(doMax)
Point(onMouseDown)
link(onPosition,4330469:doEvent1,[])
link(onMouseDown,56813:doStop,[(342,153)(342,187)(165,187)(165,153)])
}
Add(Hub,4330469,350,140)
{
link(onEvent1,117273:doOperation,[])
link(onEvent2,56813:doTimer,[(393,153)(393,193)(158,193)(158,146)])
}
Add(Button,18742,63,77)
{
Left=20
Top=20
Font=[Arial,8,0,0,1]
Caption="Open"
link(onClick,20862:doExecute,[])
}
Add(Timer,56813,175,140)
{
link(onTimer,1733705:doOperation,[])
}
Add(Math,1733705,238,140)
{
OpType=3
Op2=10
ResultType=0
link(onResult,75508:doPosition,[])
link(Op1,98238:Position,[])
}
Add(Math,4265710,245,147)
{
OpType=3
Op2=10
ResultType=0
link(onResult,75508:doMax,[])
link(Op1,98238:Length,[])
}
карма: 9

0
Ответов: 1328
Рейтинг: 69
#15: 2007-12-23 03:31:56 ЛС | профиль | цитата
HELP писал(а):
можно ли перематывать музуку другим компонентом

Мне больше нравится TrackBar
code_7998.txt
карма: 2

0
файлы: 1code_7998.txt [1.4KB] [318]
Сообщение
...
Прикрепленные файлы
(файлы не залиты)