- 307
- 218
Подробнее, курсор использовать в своих елементах, или просто информацию о курсоре, изменения позиции курсора, включение выключения видимости курсора?Подскажите, как использовать курсор с имгуи? Не могу разобраться.
Подробнее, курсор использовать в своих елементах, или просто информацию о курсоре, изменения позиции курсора, включение выключения видимости курсора?Подскажите, как использовать курсор с имгуи? Не могу разобраться.
Подскажите, как использовать курсор с имгуи? Не могу разобраться.
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;
Видимость и возможность использовать обычный системный курсор в имгуи элементах. Что-то вроде imgui.showCursor в луа.Подробнее, курсор использовать в своих елементах, или просто информацию о курсоре, изменения позиции курсора, включение выключения видимости курсора?
Спасибо. Но хотелось бы реализацию с системным курсором из Windows.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;
Нету отдельного курсора в имгуи, есть один курсорВидимость и возможность использовать обычный системный курсор в имгуи элементах. Что-то вроде imgui.showCursor в луа.
Спасибо. Но хотелось бы реализацию с системным курсором из Windows.
Я хз зачем это тебе но вот, бери, замерял в цикле с Sleep(0) и без, циклы выполнялся по 10000000 разКакая будет нагрузка на процессор, если в потоке будет Sleep(0)?
#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;
}
Нулевое значение аргумента в Sleep заставляет поток отказаться от оставшейся части его временного интервала в пользу любого другого потока, который готов к запуску. Если других потоков, готовых к выполнению нет, функция немедленно возвращается, и поток продолжает выполнение.*Какая будет нагрузка на процессор, если в потоке будет Sleep(0)?
Нагрузка на процессор и время исполнения кода, не одно и тоже. К тому же мы не знаем какие оптимизации произвел компилятор в твоем случае.Я хз зачем это тебе но вот, бери, замерял в цикле с Sleep(0) и без, циклы выполнялся по 10000000 раз
Посмотреть вложение 36525C++:#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; }
зачем это всё если есть отладчик?Я хз зачем это тебе но вот, бери, замерял в цикле с Sleep(0) и без, циклы выполнялся по 10000000 раз
Посмотреть вложение 36525C++:#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; }
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;
}
офкос ты не закроешь диалог, который ещё не получил от сервера. закрывай после хука.Также пробовал закрывать диалог через SF->getSAMP()->getDialog()->Close(1);
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 диалога
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;
}
info, 0x1000, &bsData
Это в аргументы DecodeString
потому что вместо этого надо читать длину строки и использовать ее в декодированииПробовал так, всё равно эффект тот же