Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Проблема с перемещением слайдера (trackbar) (http://forum.oszone.net/showthread.php?t=139855)

alexey_a 11-05-2009 20:27 1115684

Проблема с перемещением слайдера (trackbar)
 
проблема в следующем:

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

Creat0R 11-05-2009 21:07 1115698

Цитата:

Цитата alexey_a
слайдер перемещается но при этом не передает информацию о перемещении родительскому окну »

Пример можно увидеть, где оно должно учитываться?

Цитата:

Цитата alexey_a
нашел инфу, что надо послать родительскому окну нотификацию TRBN_THUMBPOSCHANGING. но как это сделать не понимаю. »

А откуда инфа? Возможно там и решение :)

alexey_a 12-05-2009 12:00 1116171

Цитата:

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

инфа из МСДН.

Цитата:

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

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

Creat0R 12-05-2009 14:59 1116396

Цитата:

Цитата alexey_a
какой приме нужен »

Пример где требуется «передать информацию о перемещении родительскому окну».

Цитата:

Цитата alexey_a
слайдер двигаю элементарно »

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

Код:

#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 1116405

Цитата:

Цитата Creat0R
Пример где требуется «передать информацию о перемещении родительскому окну». »

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

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

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

Creat0R 12-05-2009 15:46 1116451

Цитата:

Цитата alexey_a
пример точный не могу указать »

Цитата:

Цитата alexey_a
можешь попробовать с любым слайдером в готовом стороннем приложение »

Я значит должен и пример сам делать, и ещё приложение искать?

Цитата:

Цитата alexey_a
еще раз повторюсь: слайдер передвигается, а сообщение родительскому окну не отправляется »

Поэтому и пример нужен, чтобы понять проблему.

Ладно, у меня сегодня хорошее настроение, вот пример, и решение проблеме (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 1117606

Цитата:

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

спасибо, великий и могучий! :) и что мне самому в голову не пришло попробовать controlClick?!

alexey_a 14-05-2009 19:12 1118538

Цитата:

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

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

Yashied 14-05-2009 21:24 1118654

Немного поправил пример 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 1118742

Цитата:

Цитата Yashied
DllCall("user32.dll", "lparam", "SendMessage", "hwnd", $GUI, "int", $WM_HSCROLL, "wparam", $SB_ENDSCROLL, "lparam", GUICtrlGetHandle($Slider)) »

Блин, пробовал же подобное, разочаровавшись остановился на банальном ControlClick :)

alexey_a 18-05-2009 19:00 1121719

Цитата:

Цитата Yashied
Немного поправил пример Creat0R`а. Просто мне не нравится ControlClick(). »

теперь все работает!!! здорово! на само деле я тоже так пытался сделать, но так и не получилось. Вопрос, а откуда взялось оперделение константы
Цитата:

Цитата Yashied
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 1121725

Цитата:

Цитата alexey_a
Вопрос, а откуда взялось оперделение константы »


http://msdn.microsoft.com/en-us/libr...75(VS.85).aspx

alexey_a 19-05-2009 09:47 1122081

Цитата:

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

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


Время: 15:24.

Время: 15:24.
© OSzone.net 2001-