Jump to content

GUI наводка


Recommended Posts

Не знал как назвать тему, простите... Я давно хотел сделать для некоторых моих GUI-менюшек на сервере следующее: при наводке курсором на ГУИ-элемент (например image) чтобы над курсором выбивалась текстовая надпись с нужным мне текстом и следовала бы за курсором до тех пор, пока он на этом элементе (image). Я даже не знаю как объяснить, но думаю что это какя-то мелочь, потому как где-то это видел, только вот не помню точно где. В общем, может рисунок поможет понять о чем я :)

exampleh.png

Link to comment

Можно в OnClientRender обрабатывать позицию курсора, и когда он в пределах кнопки (сверять координаты), то отрисовываешь dx текст по координатам курсора.

Link to comment
Можно в OnClientRender обрабатывать позицию курсора, и когда он в пределах кнопки (сверять координаты), то отрисовываешь dx текст по координатам курсора.

Это трудный путь, а вот легкий: OnClientMouseEnter и OnClientMouseLeave

P.S. это называют tooltip

Link to comment
Можно в OnClientRender обрабатывать позицию курсора, и когда он в пределах кнопки (сверять координаты), то отрисовываешь dx текст по координатам курсора.

Это трудный путь, а вот легкий: OnClientMouseEnter и OnClientMouseLeave

P.S. это называют tooltip

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

чтобы над курсором выбивалась текстовая надпись с нужным мне текстом и следовала бы за курсором до тех пор, пока он на этом элементе (image).

OnClientMouseEnter, OnClientMouseLeave - вроде как вызываются один раз когда курсор попал/вышел из фокуса элемента?

Как вариант ешё OnClientMouseMove - закрепить событие на нужный элемент (Но надпись будет только когда курсор двигается).

Link to comment
Можно в OnClientRender обрабатывать позицию курсора, и когда он в пределах кнопки (сверять координаты), то отрисовываешь dx текст по координатам курсора.

Это трудный путь, а вот легкий: OnClientMouseEnter и OnClientMouseLeave

P.S. это называют tooltip

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

чтобы над курсором выбивалась текстовая надпись с нужным мне текстом и следовала бы за курсором до тех пор, пока он на этом элементе (image).

OnClientMouseEnter, OnClientMouseLeave - вроде как вызываются один раз когда курсор попал/вышел из фокуса элемента?

Как вариант ешё OnClientMouseMove - закрепить событие на нужный элемент (Но надпись будет только когда курсор двигается).

+ к этоме guiCreateLabel, guiSetPosition.

Link to comment

Как бы с событиями понял, но не могу отрисовать текст функцией dxDrawText с событием onCientRender. Дело в том что непонятно как там прописать в аргументах координаты курсора. Ведь у getCursorPosition() пять аргументов float, а у функции dxDrawText для координат только я как понял четыре параметра int left, int top, int right=left, int bottom=top. Поэтому не получается ничего пока.

Link to comment

Мы, наверное, недостаточно убедили (: есть стандартный ресурс, называется tooltip. Весь функционал там уже создан. В нем есть экспорт функции для создания/изменения DX подсказок, которые можно юзать из других ресурсов. Надеюсь, вы умеете юзать экспорт функции из других ресурсов, если нет, то покажем.

Link to comment

Кароче вот тебе готовый код :D

  
local gui_s = {image = nil, label = nil} 
  
addEventHandler("onClientResourceStart", getResourceRootElement(),  
    function (resource) 
            gui_s.image = guiCreateStaticImage(Коор. X, Коор. Y, Ширина, Высота, "Путь", false, nil) 
            gui_s.label = guiCreateLabel(0.0, 0.0, Ширина, Высота, "Текст", false, nil)     
            addEventHandler("onClientMouseMove", gui_s.image, s_onClientMouseMove, false) 
            showCursor(true) 
    end 
) 
  
function s_onClientMouseMove(x, y) 
    guiSetPosition(gui_s.label, x, y, false) 
end 
  

Вроде правильно, не тестил, писал в браузере. В теории должно работать, если не перепутал названия событий и функций.

Link to comment
+ к этоме guiCreateLabel, guiSetPosition.

Нет, я уже выше написал про dxDrawText. Это более аргономичное решение.

Мы, наверное, недостаточно убедили (: есть стандартный ресурс, называется tooltip. Весь функционал там уже создан. В нем есть экспорт функции для создания/изменения DX подсказок, которые можно юзать из других ресурсов. Надеюсь, вы умеете юзать экспорт функции из других ресурсов, если нет, то покажем.

Разве текст будет бегать за курсором в нужной области? Помоему он там просто появится в одной точке и изчезнет через некоторое время.

Link to comment
local descinfo={} 
descinfo.lbl = guiCreateLabel(0.0, 0.0,200,40, "Текст", false, nil)     
addEventHandler("onClientMouseEnter",getRootElement(),function(x, y) 
    if(descinfo[source]) then 
        guiSetPosition(descinfo.lbl, x, y, false) 
        guiSetText(descinfo.lbl,descinfo[source]) 
        guiBringToFront(descinfo.lbl) 
        descinfo.current=source 
    else guiSetText(descinfo.lbl,"") end 
end) 
addEventHandler("onClientMouseLeave", getRootElement(), function() if(source==descinfo.current) then descinfo.current=nil guiSetText(descinfo.lbl,"") end end) 
addEventHandler("onClientMouseMove",getRootElement(),function(x,y) if(descinfo.current==source) then guiSetPosition(descinfo.lbl,x,y,false) end end) 
function setDescription(elem,desc) assert(elem) descinfo[elem]=desc end 
-- хак, по желанию  
descinfo.showcursor=showCursor 
showCursor=function(show) showCursor(show) if(not show) guiSetText(descinfo.lbl,"") end end  
  
setDescription(guiCreateButton( 0.7, 0.1, 0.2, 0.1, "Test!", true )," Не нажимать! бесполезно!") 

мой вариант, проверен через runcode

Link to comment
Читал значения возвращаемых аргументов, нет?

Видимо нет, почитай. :)

Ага уже прочитал: "Returns 5 values: cursorX, cursorY, worldX, worldY, worldZ. The first two values are the 2D relative screen coordinates of the cursor: cursorX goes from 0 (left side of the screen) to 1 (right side), cursorY goes from 0 (top) to 1 (bottom). The 3 values that follow are the 3D world map coordinates that the cursor points at. If the cursor isn't showing, returns false as the first value." - думал что первые две - это абсолютные коорды, а они относительные, т.е. не подходят, поэтому отловил самим событием onClientMouseMove.

Разве текст будет бегать за курсором в нужной области? Помоему он там просто появится в одной точке и изчезнет через некоторое время.

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

Нет, я уже выше написал про dxDrawText. Это более аргономичное решение.

Им и делаю, но отрисовка не дает возможности всегда быть надписи, пока курсор наведен на мою кнопку.

Вот мой код если что:

addEventHandler( "onClientMouseMove", getRootElement(),  
    function(aX, aY) 
    if (source == MyButton[1]) then 
        dxDrawText ( "Button", aX, aY-25 , 0, 0, tocolor ( 255, 0, 0, 255 ), 1, "pricedown", "left", "top", false, false, true ) 
        end 
    end 
) 

Link to comment

Вообщем самый простой и самый правильный на мой взгляд вариант решения:

  
local scrX, scrY = guiGetScreenSize(); 
  
// ButtonX реальная (не относительная) позиция кнопки X 
// ButtonY реальная (не относительная) позиция кнопки Y 
// SizeX ширина кнопки 
// SizeY высота кнопки 
  
function draw() 
    local x, y = getCursorPosition" class="kw4">getCursorPosition(); // возвращает relative 
     
    if x and y then 
        x, y =  scrX * x, scrY * y; // из relative в absolute 
        if x >= ButtonX and x <= ButtonX + SizeX and y >= ButtonY and y <= ButtonY + SizeY then 
            dxDrawText( 'Example', x, y ); 
        end 
    end 
end 
  
addEventHandler( 'onClientRender', root, draw ); 
  

P.S. Это примерный код.

Link to comment

Kernell, к сожалению, твой код вообще не работает и по-моему из-за этой строки:

local x, y = getCursorPosition" class="kw4">getCursorPosition(); // возвращает relative

Вообще не пойму тут синтаксиса.

Link to comment
Мы, наверное, недостаточно убедили (: есть стандартный ресурс, называется tooltip. Весь функционал там уже создан. В нем есть экспорт функции для создания/изменения DX подсказок, которые можно юзать из других ресурсов. Надеюсь, вы умеете юзать экспорт функции из других ресурсов, если нет, то покажем.

Разве текст будет бегать за курсором в нужной области? Помоему он там просто появится в одной точке и изчезнет через некоторое время.

Там есть экспорт функция для изменения позиции подсказки. Вот ее и нужно менять согласно позиции курсора в любом onRender событии. Это легче чем снова изобретать этот же ресурс.

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

Link to comment
  
local gui_s = {image = nil, pos_x = 0.0, pos_y = 0.0} 
  
addEventHandler("onClientResourceStart", getResourceRootElement(),  
    function (resource) 
            gui_s.image = guiCreateStaticImage(Коор. X, Коор. Y, Ширина, Высота, "Путь", false, nil) 
            addEventHandler("onClientMouseMove", gui_s.image, s_onClientMouseMove, false) 
            showCursor(true) 
    end 
) 
  
addEventHandler("onClientRender", getRootElement(),  
    function() 
        dxDrawText("TEXT", gui_s.pos_x, gui_s.pos_y, gui_s.pos_x, gui_s.pos_y, tocolor(255, 255, 255, 255), 1.0, "default-bold", "center", "center", false, false, true)  
    end 
) 
  
function s_onClientMouseMove(x, y) 
    gui_s.pos_x = x 
    gui_s.pos_y = y 
end 
  

Link to comment
Kernell, к сожалению, твой код вообще не работает и по-моему из-за этой строки:

local x, y = getCursorPosition" class="kw4">getCursorPosition(); // возвращает relative

Вообще не пойму тут синтаксиса.

Это баг тега lua. Наверное не сложно догадаться что там.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...