| 537 | } |
| 538 | |
| 539 | IMGUI_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) |
no test coverage detected