Jump to content

GUI наводка


Recommended Posts

Posted

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

exampleh.png

Posted

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

+ к этоме guiCreateLabel, guiSetPosition.

Posted

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

Posted

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

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

И почитай мой пост который выше.

Posted

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

Posted

Кароче вот тебе готовый код :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 
  

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

Posted
+ к этоме guiCreateLabel, guiSetPosition.

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

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

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

Posted
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

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

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

Ага уже прочитал: "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 
) 

Posted

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

  
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. Это примерный код.

Posted

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

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

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

Posted

local x, y = getCursorPosition(); -- возвращает relative 

getCursorPosition неправильно отображается в [/lua] теге.

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

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

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

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

Posted
  
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 
  

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

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

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

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

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...