MCPcopy Create free account
hub / github.com/KebsCS/KBotExt / ImGui_ImplWin32_WndProcHandler

Function ImGui_ImplWin32_WndProcHandler

KBotExt/imgui/imgui_impl_win32.cpp:539–701  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

537}
538
539IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
540{
541 if (ImGui::GetCurrentContext() == nullptr)
542 return 0;
543
544 ImGuiIO& io = ImGui::GetIO();
545 ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData();
546
547 switch (msg)
548 {
549 case WM_MOUSEMOVE:
550 case WM_NCMOUSEMOVE:
551 {
552 // We need to call TrackMouseEvent in order to receive WM_MOUSELEAVE events
553 ImGuiMouseSource mouse_source = GetMouseSourceFromMessageExtraInfo();
554 const int area = (msg == WM_MOUSEMOVE) ? 1 : 2;
555 bd->MouseHwnd = hwnd;
556 if (bd->MouseTrackedArea != area)
557 {
558 TRACKMOUSEEVENT tme_cancel = { sizeof(tme_cancel), TME_CANCEL, hwnd, 0 };
559 TRACKMOUSEEVENT tme_track = { sizeof(tme_track), (DWORD)((area == 2) ? (TME_LEAVE | TME_NONCLIENT) : TME_LEAVE), hwnd, 0 };
560 if (bd->MouseTrackedArea != 0)
561 ::TrackMouseEvent(&tme_cancel);
562 ::TrackMouseEvent(&tme_track);
563 bd->MouseTrackedArea = area;
564 }
565 POINT mouse_pos = { (LONG)GET_X_LPARAM(lParam), (LONG)GET_Y_LPARAM(lParam) };
566 if (msg == WM_NCMOUSEMOVE && ::ScreenToClient(hwnd, &mouse_pos) == FALSE) // WM_NCMOUSEMOVE are provided in absolute coordinates.
567 break;
568 io.AddMouseSourceEvent(mouse_source);
569 io.AddMousePosEvent((float)mouse_pos.x, (float)mouse_pos.y);
570 break;
571 }
572 case WM_MOUSELEAVE:
573 case WM_NCMOUSELEAVE:
574 {
575 const int area = (msg == WM_MOUSELEAVE) ? 1 : 2;
576 if (bd->MouseTrackedArea == area)
577 {
578 if (bd->MouseHwnd == hwnd)
579 bd->MouseHwnd = nullptr;
580 bd->MouseTrackedArea = 0;
581 io.AddMousePosEvent(-FLT_MAX, -FLT_MAX);
582 }
583 break;
584 }
585 case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK:
586 case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK:
587 case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK:
588 case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK:
589 {
590 ImGuiMouseSource mouse_source = GetMouseSourceFromMessageExtraInfo();
591 int button = 0;
592 if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONDBLCLK) { button = 0; }
593 if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONDBLCLK) { button = 1; }
594 if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONDBLCLK) { button = 2; }
595 if (msg == WM_XBUTTONDOWN || msg == WM_XBUTTONDBLCLK) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; }
596 if (bd->MouseButtonsDown == 0 && ::GetCapture() == nullptr)

Callers 1

WndProcFunction · 0.85

Tested by

no test coverage detected