/
vTech
/
FcApps
Обзор
Документация
Войти
/
vTech
/
FcApps
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
FcLibs/FcWindow/src/FcStatic/FcStatic_WINAPI.h
185 строк
8 KB
vTech
alpha_00
03 дек 2025, 17:45
03 дек 2025, 17:45
ab8382d
Код
Авторство
О чём код?
#if defined(_WIN32) || defined(_WIN64) #include "FcWindow_config.h" #include "FcWindow.h" #include "FcWindow_mouse.h" #include <windowsx.h> //const TCHAR FCWINDOWGL_ATOM_WM_GL_ERROR[] = TEXT("WM_GL_ERROR"); #define MapEvent(e, fn) \ { \ case e: \ if ( fn != nullptr ) \ return static_cast<LPARAM>( HANDLE_##e((hWnd), (wParam), (lParam), fn) ); \ } LRESULT APIENTRY FcWindowGL_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { RECT mWindowRect; UINT mMouseY; INT i; WCHAR mCode; BYTE mData[256]; FcWindowGL_t* mWindow = (FcWindowGL_t*)GetWindowLongPtr(hwnd, GWLP_USERDATA); switch (uMsg) { case WM_NCCREATE: return TRUE; case WM_CREATE: mWindow = (FcWindowGL_t*)((LPCREATESTRUCT)lParam)->lpCreateParams; SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)mWindow); //SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER); return DefWindowProc(hwnd, uMsg, wParam, lParam); case WM_SETCURSOR: if (LOWORD(lParam) == HTCLIENT) { if (mWindow->mWINAPI.mHideCursor) SetCursor(NULL); return TRUE; } case WM_MOUSEWHEEL: i = GET_WHEEL_DELTA_WPARAM(wParam); if (i >= WHEEL_DELTA) { mWindow->mWINAPI.mMouseStatus |= FCWINDOW_MOUSE_ScrollUp; for (; i >= WHEEL_DELTA; i -= WHEEL_DELTA) mWindow->mWINAPI.mCallbackMouse(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), mWindow->mWINAPI.mMouseStatus, mWindow->mWINAPI.mDataMouseCallback); mWindow->mWINAPI.mMouseStatus ^= FCWINDOW_MOUSE_ScrollUp; } if (i < 0) { mWindow->mWINAPI.mMouseStatus |= FCWINDOW_MOUSE_ScrollDown; for (; i < 0; i += WHEEL_DELTA) mWindow->mWINAPI.mCallbackMouse(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), mWindow->mWINAPI.mMouseStatus, mWindow->mWINAPI.mDataMouseCallback); mWindow->mWINAPI.mMouseStatus ^= FCWINDOW_MOUSE_ScrollDown; } break; case WM_MOUSEMOVE: mWindow->mWINAPI.mMouseStatus |= FCWINDOW_MOUSE_Motion; mMouseY = mWindow->mWINAPI.mHeightClient - HIWORD(lParam); mWindow->mWINAPI.mCallbackMouse(LOWORD(lParam), mMouseY, mWindow->mWINAPI.mMouseStatus, mWindow->mWINAPI.mDataMouseCallback); mWindow->mWINAPI.mMouseX = LOWORD(lParam); mWindow->mWINAPI.mMouseY = mMouseY; mWindow->mWINAPI.mMouseStatus ^= FCWINDOW_MOUSE_Motion; break; case WM_MBUTTONDOWN: mWindow->mWINAPI.mMouseStatus |= FCWINDOW_MOUSE_Middle_PRESS; mWindow->mWINAPI.mMouseStatus &= ~FCWINDOW_MOUSE_Middle_RELEASE; mMouseY = mWindow->mWINAPI.mHeightClient - HIWORD(lParam); mWindow->mWINAPI.mCallbackMouse(LOWORD(lParam), mMouseY, mWindow->mWINAPI.mMouseStatus, mWindow->mWINAPI.mDataMouseCallback); mWindow->mWINAPI.mMouseX = LOWORD(lParam); mWindow->mWINAPI.mMouseY = mMouseY; break; case WM_MBUTTONUP: mWindow->mWINAPI.mMouseStatus &= ~FCWINDOW_MOUSE_Middle_PRESS; mWindow->mWINAPI.mMouseStatus |= FCWINDOW_MOUSE_Middle_RELEASE; mMouseY = mWindow->mWINAPI.mHeightClient - HIWORD(lParam); mWindow->mWINAPI.mCallbackMouse(LOWORD(lParam), mMouseY, mWindow->mWINAPI.mMouseStatus, mWindow->mWINAPI.mDataMouseCallback); mWindow->mWINAPI.mMouseX = LOWORD(lParam); mWindow->mWINAPI.mMouseY = mMouseY; break; case WM_RBUTTONDBLCLK: mWindow->mWINAPI.mMouseStatus &= ~FCWINDOW_MOUSE_Right_PRESS; mWindow->mWINAPI.mMouseStatus &= ~FCWINDOW_MOUSE_Right_RELEASE; mWindow->mWINAPI.mMouseStatus |= FCWINDOW_MOUSE_Right_Double_PRESS; mMouseY = mWindow->mWINAPI.mHeightClient - HIWORD(lParam); mWindow->mWINAPI.mCallbackMouse(LOWORD(lParam), mMouseY, mWindow->mWINAPI.mMouseStatus, mWindow->mWINAPI.mDataMouseCallback); mWindow->mWINAPI.mMouseX = LOWORD(lParam); mWindow->mWINAPI.mMouseY = mMouseY; break; case WM_RBUTTONDOWN: mWindow->mWINAPI.mMouseStatus &= ~FCWINDOW_MOUSE_Right_Double_PRESS; mWindow->mWINAPI.mMouseStatus &= ~FCWINDOW_MOUSE_Right_RELEASE; mWindow->mWINAPI.mMouseStatus |= FCWINDOW_MOUSE_Right_PRESS; mMouseY = mWindow->mWINAPI.mHeightClient - HIWORD(lParam); mWindow->mWINAPI.mCallbackMouse(LOWORD(lParam), mMouseY, mWindow->mWINAPI.mMouseStatus, mWindow->mWINAPI.mDataMouseCallback); mWindow->mWINAPI.mMouseX = LOWORD(lParam); mWindow->mWINAPI.mMouseY = mMouseY; break; case WM_RBUTTONUP: mWindow->mWINAPI.mMouseStatus &= ~FCWINDOW_MOUSE_Right_Double_PRESS; mWindow->mWINAPI.mMouseStatus &= ~FCWINDOW_MOUSE_Right_PRESS; mWindow->mWINAPI.mMouseStatus |= FCWINDOW_MOUSE_Right_RELEASE; mMouseY = mWindow->mWINAPI.mHeightClient - HIWORD(lParam); mWindow->mWINAPI.mCallbackMouse(LOWORD(lParam), mMouseY, FCWINDOW_MOUSE_Right_RELEASE, mWindow->mWINAPI.mDataMouseCallback); mWindow->mWINAPI.mMouseX = LOWORD(lParam); mWindow->mWINAPI.mMouseY = mMouseY; break; case WM_LBUTTONDBLCLK: mWindow->mWINAPI.mMouseStatus &= ~FCWINDOW_MOUSE_Left_RELEASE; mWindow->mWINAPI.mMouseStatus &= ~FCWINDOW_MOUSE_Left_PRESS; mWindow->mWINAPI.mMouseStatus |= FCWINDOW_MOUSE_Left_Double_PRESS; mMouseY = mWindow->mWINAPI.mHeightClient - HIWORD(lParam); mWindow->mWINAPI.mCallbackMouse(LOWORD(lParam), mMouseY, FCWINDOW_MOUSE_Left_Double_PRESS, mWindow->mWINAPI.mDataMouseCallback); mWindow->mWINAPI.mMouseX = LOWORD(lParam); mWindow->mWINAPI.mMouseY = mMouseY; break; case WM_LBUTTONDOWN: mWindow->mWINAPI.mMouseStatus &= ~FCWINDOW_MOUSE_Left_RELEASE; mWindow->mWINAPI.mMouseStatus &= ~FCWINDOW_MOUSE_Left_Double_PRESS; mWindow->mWINAPI.mMouseStatus |= FCWINDOW_MOUSE_Left_PRESS; mMouseY = mWindow->mWINAPI.mHeightClient - HIWORD(lParam); mWindow->mWINAPI.mCallbackMouse(LOWORD(lParam), mMouseY, FCWINDOW_MOUSE_Left_PRESS, mWindow->mWINAPI.mDataMouseCallback); mWindow->mWINAPI.mMouseX = LOWORD(lParam); mWindow->mWINAPI.mMouseY = mMouseY; break; case WM_LBUTTONUP: mWindow->mWINAPI.mMouseStatus &= ~FCWINDOW_MOUSE_Left_PRESS; mWindow->mWINAPI.mMouseStatus &= ~FCWINDOW_MOUSE_Left_Double_PRESS; mWindow->mWINAPI.mMouseStatus |= FCWINDOW_MOUSE_Left_RELEASE; mMouseY = mWindow->mWINAPI.mHeightClient - HIWORD(lParam); mWindow->mWINAPI.mCallbackMouse(LOWORD(lParam), mMouseY, FCWINDOW_MOUSE_Left_RELEASE, mWindow->mWINAPI.mDataMouseCallback); mWindow->mWINAPI.mMouseX = LOWORD(lParam); mWindow->mWINAPI.mMouseY = mMouseY; break; case WM_GETDLGCODE: break; case WM_KEYDOWN: case WM_KEYUP: if (0 != GetKeyboardState(mData)) { i = ToUnicode(wParam, MapVirtualKey(wParam, MAPVK_VK_TO_VSC), mData, &mCode, 1, 0); if (i < 0) i = 0; mWindow->mWINAPI.mCallbackKeyboard((int)mCode, uMsg, mWindow->mWINAPI.mDataKeyboardCallback[0], mWindow->mWINAPI.mDataKeyboardCallback[1]); } break; case WM_SIZE: mWindow->mWINAPI.mWidth = LOWORD(lParam); mWindow->mWINAPI.mHeight = HIWORD(lParam); if (GetClientRect(hwnd, &mWindowRect)) { mWindow->mWINAPI.mHeightClient = mWindowRect.bottom - mWindowRect.top; mWindow->mWINAPI.mWidthClient = mWindowRect.right - mWindowRect.left; } mWindow->mWINAPI.mCallbackResizeWindow(mWindow->mWINAPI.mWidth, mWindow->mWINAPI.mHeight, mWindow->mWINAPI.mDataResizeCallback[0], mWindow->mWINAPI.mDataResizeCallback[1]); //InvalidateRect(hwnd, NULL, TRUE); break; case WM_SETFOCUS: break; case WM_KILLFOCUS: break; case WM_PAINT: mWindow->mWINAPI.mDraw(&mWindow->mWINAPI, mWindow->mWINAPI.mDrawData[0], mWindow->mWINAPI.mDrawData[1], mWindow->mWINAPI.mDrawData[2]); break; case FCWINDOWGL_ATOM_WM_GL_ERROR: if (InSendMessage()) ReplyMessage(TRUE); SendMessage(hwnd, WM_DESTROY, wParam, 0); break; case WM_TIMER: mWindow->mWINAPI.mCallbackTimer1Window(&mWindow->mWINAPI, mWindow->mWINAPI.mTimer1Data[0], mWindow->mWINAPI.mTimer1Data[1], mWindow->mWINAPI.mTimer1Data[2]); return 0; case WM_CLOSE: /*PostQuitMessage(0);*/ return 0; case WM_DESTROY: PostQuitMessage(wParam); return 0; case WM_ERASEBKGND: return TRUE; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return DefWindowProc(hwnd, uMsg, wParam, lParam); } #endif //WIN32