Другое С/С++ Вопрос - Ответ

Stiopko

Известный
Проверенный
307
218
Подскажите, как использовать курсор с имгуи? Не могу разобраться.
Подробнее, курсор использовать в своих елементах, или просто информацию о курсоре, изменения позиции курсора, включение выключения видимости курсора?
 

_=Gigant=_

Известный
134
191
Подскажите, как использовать курсор с имгуи? Не могу разобраться.

C++:
bool bShowImGui_Menu;
static int mouse_imgui_menu = 2;

    if (bShowImGui_Menu) //if menu is ON -> ImGui::Begin("##ImGuiMenu", &bShowImGui_Menu....
    {
        mouse_imgui_menu = 0;   
        toggleSAMPCursor(1);        <- //mouse toggle for menu
    }
    else
    {
        if (mouse_imgui_menu == 0)
        {
            toggleSAMPCursor(0);
            mouse_imgui_menu++;
        }
    }

//WND Procedure

extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND wnd, UINT umsg, WPARAM wparam, LPARAM lparam); //imgui win proc
static LRESULT CALLBACK wnd_proc(HWND wnd, UINT umsg, WPARAM wparam, LPARAM lparam) //our win proc (sobeit -> keyhook.cpp)

   if (ImGui_ImplWin32_WndProcHandler(wnd, umsg, wparam, lparam))
         return true;
 

CatKnight

Известный
148
54
Подробнее, курсор использовать в своих елементах, или просто информацию о курсоре, изменения позиции курсора, включение выключения видимости курсора?
Видимость и возможность использовать обычный системный курсор в имгуи элементах. Что-то вроде imgui.showCursor в луа.

C++:
bool bShowImGui_Menu;
static int mouse_imgui_menu = 2;

    if (bShowImGui_Menu) //if menu is ON -> ImGui::Begin("##ImGuiMenu", &bShowImGui_Menu....
    {
        mouse_imgui_menu = 0;  
        toggleSAMPCursor(1);        <- //mouse toggle for menu
    }
    else
    {
        if (mouse_imgui_menu == 0)
        {
            toggleSAMPCursor(0);
            mouse_imgui_menu++;
        }
    }

//WND Procedure

extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND wnd, UINT umsg, WPARAM wparam, LPARAM lparam); //imgui win proc
static LRESULT CALLBACK wnd_proc(HWND wnd, UINT umsg, WPARAM wparam, LPARAM lparam) //our win proc (sobeit -> keyhook.cpp)

   if (ImGui_ImplWin32_WndProcHandler(wnd, umsg, wparam, lparam))
         return true;
Спасибо. Но хотелось бы реализацию с системным курсором из Windows.
 

Stiopko

Известный
Проверенный
307
218
Видимость и возможность использовать обычный системный курсор в имгуи элементах. Что-то вроде imgui.showCursor в луа.


Спасибо. Но хотелось бы реализацию с системным курсором из Windows.
Нету отдельного курсора в имгуи, есть один курсор
 

Musaigen

abobusnik
Проверенный
1,582
1,302
Какая будет нагрузка на процессор, если в потоке будет Sleep(0)?
 

Stiopko

Известный
Проверенный
307
218
Какая будет нагрузка на процессор, если в потоке будет Sleep(0)?
Я хз зачем это тебе но вот, бери, замерял в цикле с Sleep(0) и без, циклы выполнялся по 10000000 раз
C++:
#include <windows.h>
#include <ctime>
#include <chrono>
#include <iostream>

int main()
{
    size_t count = 10000000;
    auto start = std::chrono::system_clock::now();

    for (size_t i = 0; i < count; i++)
        Sleep(0);
    auto end = std::chrono::system_clock::now();

    std::chrono::duration<double> elapsed_seconds = end - start;
    std::cout << "Sleep(0): " << elapsed_seconds.count() << " S << " << count << " " << std::endl;

    start = std::chrono::system_clock::now();
    for (size_t i = 0; i < count; i++)
    {
    }
    end = std::chrono::system_clock::now();

    elapsed_seconds = end - start;
    std::cout << "NULL: " << elapsed_seconds.count() << " S << " << count << " " << std::endl;
    system("pause");
    return 0;
}
36525
 

#Rin

Известный
Всефорумный модератор
1,214
1,036
Какая будет нагрузка на процессор, если в потоке будет Sleep(0)?
Нулевое значение аргумента в Sleep заставляет поток отказаться от оставшейся части его временного интервала в пользу любого другого потока, который готов к запуску. Если других потоков, готовых к выполнению нет, функция немедленно возвращается, и поток продолжает выполнение.*

* На некоторых версиях Windows поведение может немного отличаться.
** Подробнее, можешь еще википедию почитать.


Я хз зачем это тебе но вот, бери, замерял в цикле с Sleep(0) и без, циклы выполнялся по 10000000 раз
C++:
#include <windows.h>
#include <ctime>
#include <chrono>
#include <iostream>

int main()
{
    size_t count = 10000000;
    auto start = std::chrono::system_clock::now();

    for (size_t i = 0; i < count; i++)
        Sleep(0);
    auto end = std::chrono::system_clock::now();

    std::chrono::duration<double> elapsed_seconds = end - start;
    std::cout << "Sleep(0): " << elapsed_seconds.count() << " S << " << count << " " << std::endl;

    start = std::chrono::system_clock::now();
    for (size_t i = 0; i < count; i++)
    {
    }
    end = std::chrono::system_clock::now();

    elapsed_seconds = end - start;
    std::cout << "NULL: " << elapsed_seconds.count() << " S << " << count << " " << std::endl;
    system("pause");
    return 0;
}
Посмотреть вложение 36525
Нагрузка на процессор и время исполнения кода, не одно и тоже. К тому же мы не знаем какие оптимизации произвел компилятор в твоем случае.
 
  • Нравится
Реакции: Stiopko

ALF

Известный
Проверенный
320
537
Я хз зачем это тебе но вот, бери, замерял в цикле с Sleep(0) и без, циклы выполнялся по 10000000 раз
C++:
#include <windows.h>
#include <ctime>
#include <chrono>
#include <iostream>

int main()
{
    size_t count = 10000000;
    auto start = std::chrono::system_clock::now();

    for (size_t i = 0; i < count; i++)
        Sleep(0);
    auto end = std::chrono::system_clock::now();

    std::chrono::duration<double> elapsed_seconds = end - start;
    std::cout << "Sleep(0): " << elapsed_seconds.count() << " S << " << count << " " << std::endl;

    start = std::chrono::system_clock::now();
    for (size_t i = 0; i < count; i++)
    {
    }
    end = std::chrono::system_clock::now();

    elapsed_seconds = end - start;
    std::cout << "NULL: " << elapsed_seconds.count() << " S << " << count << " " << std::endl;
    system("pause");
    return 0;
}
Посмотреть вложение 36525
зачем это всё если есть отладчик?
 

CatKnight

Известный
148
54
Объясните, пожалуйста, как в wndproc заблокировать сообщение для окна, но оставить его для плагина своего? Сейчас использую хук wndprochandler, который изначально идёт в проекте sf plugin. Подходит он для этого же?
 

Adder

Известный
22
0
Пытаюсь пропустить диалог с помощью кода ниже. Диалог пропускается, но перестают работать серверные команды. Сообщения в чат отправляются, но серверные команды не срабатывают ( Данную проблему заметил только на Evolve, на СРП он пропускает диалог и серверные команды работают ) Также пробовал закрывать диалог через SF->getSAMP()->getDialog()->Close(1); ( Проблема та же, диалог закрывается, команды серверные не работают)
Код:
   if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog) {
        WORD DialogID;
        BYTE style, caplen, button1_len, button2_len;
        char caption[255], button1[25], button2[25], info[0x1000];

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(DialogID);
        params->bitStream->Read(style);
        params->bitStream->Read(caplen);
        params->bitStream->Read(caption, caplen);
        caption[caplen] = '\0';
        params->bitStream->Read(button1_len);
        params->bitStream->Read(button1, button1_len);
        button1[button1_len] = '\0';
        params->bitStream->Read(button2_len);
        params->bitStream->Read(button2, button2_len);
        button2[button2_len] = '\0';
        SF->getRakNet()->DecodeString(info, 0x1000, params->bitStream);

        if (DialogID == 0) return false;
    }
 

Roger571

Известный
58
31
@Adder это для того, чтобы не сбивали диалоги командами и прочее, нужно просто отправлять ответ на диалог

C++:
void SendDialogResponse(WORD wDialogID, BYTE bButtonID, WORD wListBoxItem = 65535, char *szInputResp = "")
{
        BitStream bsSend;
        BYTE respLen = static_cast<BYTE>(strlen(szInputResp));

        bsSend.ResetWritePointer();
        bsSend.Write(wDialogID);
        bsSend.Write(bButtonID);
        bsSend.Write(wListBoxItem);
        bsSend.Write(respLen);
        bsSend.Write(szInputResp, respLen);

        SAMP->RPC(RPC_DialogResponse, &bsSend, HIGH_PRIORITY, RELIABLE_ORDERED, NULL, false);
}

SendDialogResponse(0, 0); // 0 - id диалога
 
  • Нравится
Реакции: Adder

Adder

Известный
22
0
Приветствую, при попытке декодить стринг с диалога всё время крашется игра. Если закоментить строку с компресором, не крашит

Код:
            case RPC_ShowDialog:
            {

                if (cheat_state->_generic.cheat_panic_enabled)
                    break;

                WORD DialogID;
                BYTE style, caplen, button1_len, button2_len, button = 1;
                char caption[255], button1[25], button2[25], info[256];
                BitStream        bsData(rpcParams->input, rpcParams->numberOfBitsOfData / 8, false);

                bsData.ResetReadPointer();
                bsData.Read(DialogID);
                bsData.Read(style);
                bsData.Read(caplen);
                bsData.Read(caption, caplen);
                caption[caplen] = '\0';
                bsData.Read(button1_len);
                bsData.Read(button1, button1_len);
                button1[button1_len] = '\0';
                bsData.Read(button2_len);
                bsData.Read(button2, button2_len);
                button2[button2_len] = '\0';
                stringCompressor->DecodeString(info, 256, &bsData);


                break;

            }