Войти

Показать полную графическую версию : [решено] Проблема с перемещением слайдера (trackbar)


alexey_a
11-05-2009, 20:27
проблема в следующем:

я двигаю слайдер с помощью функции _GUICtrlSlider_SetPos , слайдер перемещается но при этом не передает информацию о перемещении родительскому окну. нашел инфу, что надо послать родительскому окну нотификацию TRBN_THUMBPOSCHANGING. но как это сделать не понимаю.

Creat0R
11-05-2009, 21:07
слайдер перемещается но при этом не передает информацию о перемещении родительскому окну »
Пример можно увидеть, где оно должно учитываться?

нашел инфу, что надо послать родительскому окну нотификацию TRBN_THUMBPOSCHANGING. но как это сделать не понимаю. »
А откуда инфа? Возможно там и решение :)

alexey_a
12-05-2009, 12:00
Цитата alexey_a:нашел инфу, что надо послать родительскому окну нотификацию TRBN_THUMBPOSCHANGING. но как это сделать не понимаю. »
А откуда инфа? Возможно там и решение »

инфа из МСДН.

Цитата alexey_a:слайдер перемещается но при этом не передает информацию о перемещении родительскому окну »
Пример можно увидеть, где оно должно учитываться? »

не понял, какой приме нужен. а слайдер двигаю элементарно:
$hwnd = ControlGetHandle($title, "", $ID)
_GUICtrlSlider_SetPos($hwnd, $pos)

Creat0R
12-05-2009, 14:59
какой приме нужен »
Пример где требуется «передать информацию о перемещении родительскому окну».

слайдер двигаю элементарно »
Немного подправленный пример из справки работает нормально:

#include <GuiConstantsEx.au3>
#include <GuiSlider.au3>

; Create GUI
GUICreate("Slider Set Pos", 400, 296)
$hSlider = GUICtrlCreateSlider(2, 2, 396, 20, BitOR($TBS_TOOLTIPS, $TBS_AUTOTICKS, $TBS_ENABLESELRANGE))
GUISetState()

; Set Pos
$hwnd = ControlGetHandle("Slider Set Pos", "", $hSlider)
_GUICtrlSlider_SetPos($hwnd, 50)

; Get Pos
MsgBox(4160, "Information", "Pos: " & _GUICtrlSlider_GetPos($hSlider))

; Loop until user exits
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

alexey_a
12-05-2009, 15:08
Пример где требуется «передать информацию о перемещении родительскому окну». »
пример точный не могу указать. но суть в следующем: у меня есть готовое приложение, в нем есть слайдер, двигая который мы изменяем картинку. так вот когда слайдер передвигаю, то картинка не меняется. можешь попробовать с любым слайдером в готовом стороннем приложение. Немного подправленный пример из справки работает нормально: »
еще раз повторюсь: слайдер передвигается, а сообщение родительскому окну не отправляется. т.е. получается,что бегунок слайдера просто перерисовывается в новом месте, а родительское окно об этом ничег оне знает.

Creat0R
12-05-2009, 15:46
пример точный не могу указать »
можешь попробовать с любым слайдером в готовом стороннем приложение »
Я значит должен и пример сам делать, и ещё приложение искать?

еще раз повторюсь: слайдер передвигается, а сообщение родительскому окну не отправляется »
Поэтому и пример нужен, чтобы понять проблему.

Ладно, у меня сегодня хорошее настроение, вот пример, и решение проблеме (ControlClick :)):

#include <GuiConstants.au3>
#include <GuiSlider.au3>

$GUI = GUICreate("Test Script", 300, 200)

$Icon = GUICtrlCreateIcon("Shell32.dll", Random(1, 10, 1), 20, 80, 16, 16)
$Slider = GUICtrlCreateSlider(20, 40, 260, 20)

$Button = GUICtrlCreateButton("Set Slider", 20, 10, 60, 20)

GUISetState(@SW_SHOW, $GUI)

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Button
$hSlider = ControlGetHandle($GUI, "", $Slider)
_GUICtrlSlider_SetPos($hSlider, Random(1, 100, 1))
ControlClick($GUI, "", $hSlider)
Case $Slider
ConsoleWrite("Slider changed" & @CRLF)
GUICtrlSetImage($Icon, "Shell32.dll", Random(1, 10, 1))
EndSwitch
WEnd

alexey_a
13-05-2009, 18:50
Ладно, у меня сегодня хорошее настроение, вот пример, и решение проблеме (ControlClick ): »
спасибо, великий и могучий! :) и что мне самому в голову не пришло попробовать controlClick?!

alexey_a
14-05-2009, 19:12
Ладно, у меня сегодня хорошее настроение, вот пример, и решение проблеме (ControlClick ): »
проблема втом, что после ControlClick слайдер сдвигается на одну позицию. ControlClick делает клик по середине контрола. соответственно: если ты пытаешься установить на позицию 1, то слайдер устанавливается на позицию 2, т.е. все время ("необходимая позиция"+1), пока необходимая позиция находится до середины контрола, и все время ("необходимая позиция"-1), пока необходимая позиция находится после середины контрола. Т.е я никаким образом не могу установить позиции: начальная и конечная. :)

Yashied
14-05-2009, 21:24
Немного поправил пример Creat0R`а. Просто мне не нравится ControlClick().

:wink:

#include <GuiConstants.au3>
#include <GuiSlider.au3>
#include <WindowsConstants.au3>

Global Const $SB_ENDSCROLL = 0x0008

$GUI = GUICreate("Test Script", 300, 200)

$Icon = GUICtrlCreateIcon("Shell32.dll", Random(1, 10, 1), 20, 80, 16, 16)
$Slider = GUICtrlCreateSlider(20, 40, 260, 20)

$Button = GUICtrlCreateButton("Set Slider", 20, 10, 60, 20)

GUISetState(@SW_SHOW, $GUI)

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $Button
; $hSlider = ControlGetHandle($GUI, "", $Slider)
_GUICtrlSlider_SetPos($Slider, Random(1, 100, 1))
DllCall("user32.dll", "lparam", "SendMessage", "hwnd", $GUI, "int", $WM_HSCROLL, "wparam", $SB_ENDSCROLL, "lparam", GUICtrlGetHandle($Slider))
; ControlClick($GUI, "", $hSlider)
Case $Slider
ConsoleWrite("Slider changed" & @CRLF)
GUICtrlSetImage($Icon, "Shell32.dll", Random(1, 10, 1))
EndSwitch
WEnd

Creat0R
14-05-2009, 22:52
DllCall("user32.dll", "lparam", "SendMessage", "hwnd", $GUI, "int", $WM_HSCROLL, "wparam", $SB_ENDSCROLL, "lparam", GUICtrlGetHandle($Slider)) »
Блин, пробовал же подобное, разочаровавшись остановился на банальном ControlClick :)

alexey_a
18-05-2009, 19:00
Немного поправил пример Creat0R`а. Просто мне не нравится ControlClick(). »

теперь все работает!!! здорово! на само деле я тоже так пытался сделать, но так и не получилось. Вопрос, а откуда взялось оперделение константы Global Const $SB_ENDSCROLL = 0x0008 » ? это стандартное оперделение?

кстати я сделал чуть по-другому (строк побольше :)):
$contr_id = _WinAPI_GetDlgCtrlID($hwnd)
$parent_h = _WinAPI_GetParent($hwnd)
_GUICtrlSlider_SetPos($hwnd, $pos)
_SendMessage($parent_h, $WM_HSCROLL, $SB_ENDSCROLL, $contr_id)

Yashied
18-05-2009, 19:05
Вопрос, а откуда взялось оперделение константы »


http://msdn.microsoft.com/en-us/library/bb787575(VS.85).aspx

alexey_a
19-05-2009, 09:47
Цитата alexey_a:Вопрос, а откуда взялось оперделение константы »
http://msdn.microsoft.com/en-us/libr...75(VS.85).aspx »

Спасибо! Что-то даже и не подумал, что для управления слайдером необходимо отсылать сообщения, которые предназначены для скролбаров.




© OSzone.net 2001-2012