61 fHInstance = hInstance ? hInstance : GetModuleHandle(
nullptr);
64 static const TCHAR gSZWindowClass[] = _T(
"SkiaApp");
66 static WNDCLASSEX wcex;
67 static bool wcexInit =
false;
69 wcex.cbSize =
sizeof(WNDCLASSEX);
71 wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
75 wcex.hInstance = fHInstance;
76 wcex.hIcon =
LoadIcon(fHInstance, (LPCTSTR)IDI_WINLOGO);
77 wcex.hCursor = LoadCursor(
nullptr, IDC_ARROW);
78 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
79 wcex.lpszMenuName =
nullptr;
80 wcex.lpszClassName = gSZWindowClass;
81 wcex.hIconSm =
LoadIcon(fHInstance, (LPCTSTR)IDI_WINLOGO);
83 if (!RegisterClassEx(&wcex)) {
110 fHWnd = CreateWindow(gSZWindowClass,
nullptr, WS_OVERLAPPEDWINDOW,
112 nullptr,
nullptr, fHInstance,
nullptr);
118 SetWindowLongPtr(fHWnd, GWLP_USERDATA, (
LONG_PTR)
this);
119 RegisterTouchWindow(fHWnd, 0);
125 static const struct {
129 { VK_BACK, skui::Key::kBack },
130 { VK_CLEAR, skui::Key::kBack },
131 { VK_RETURN, skui::Key::kOK },
132 { VK_UP, skui::Key::kUp },
133 { VK_DOWN, skui::Key::kDown },
134 { VK_LEFT, skui::Key::kLeft },
135 { VK_RIGHT, skui::Key::kRight },
136 { VK_TAB, skui::Key::kTab },
137 { VK_PRIOR, skui::Key::kPageUp },
138 { VK_NEXT, skui::Key::kPageDown },
139 { VK_HOME, skui::Key::kHome },
140 { VK_END, skui::Key::kEnd },
141 { VK_DELETE, skui::Key::kDelete },
142 { VK_ESCAPE, skui::Key::kEscape },
143 { VK_SHIFT, skui::Key::kShift },
144 { VK_CONTROL, skui::Key::kCtrl },
145 { VK_MENU, skui::Key::kOption },
146 {
'A', skui::Key::kA },
147 {
'C', skui::Key::kC },
148 {
'V', skui::Key::kV },
149 {
'X', skui::Key::kX },
150 {
'Y', skui::Key::kY },
151 {
'Z', skui::Key::kZ },
153 for (
size_t i = 0; i < std::size(gPair); i++) {
154 if (gPair[i].fVK == vk) {
155 return gPair[i].fKey;
158 return skui::Key::kNONE;
214 bool eventHandled =
false;
218 BeginPaint(hWnd, &ps);
234 window->onResize(LOWORD(lParam), HIWORD(lParam));
244 const uint16_t* cPtr =
reinterpret_cast<uint16_t*
>(&wParam);
263 int xPos = GET_X_LPARAM(lParam);
264 int yPos = GET_Y_LPARAM(lParam);
277 eventHandled =
window->onMouse(xPos, yPos, istate,
282 int xPos = GET_X_LPARAM(lParam);
283 int yPos = GET_Y_LPARAM(lParam);
297 case WM_MOUSEWHEEL: {
298 int xPos = GET_X_LPARAM(lParam);
299 int yPos = GET_Y_LPARAM(lParam);
300 eventHandled =
window->onMouseWheel(GET_WHEEL_DELTA_WPARAM(wParam) > 0 ? +1.0f : -1.0f,
307 uint16_t numInputs = LOWORD(wParam);
308 std::unique_ptr<TOUCHINPUT[]> inputs(
new TOUCHINPUT[numInputs]);
309 if (GetTouchInputInfo((HTOUCHINPUT)lParam, numInputs, inputs.get(),
310 sizeof(TOUCHINPUT))) {
311 POINT topLeft = {0, 0};
312 ClientToScreen(hWnd, &topLeft);
313 for (uint16_t i = 0; i < numInputs; ++i) {
314 TOUCHINPUT ti = inputs[i];
316 if (ti.dwFlags & TOUCHEVENTF_DOWN) {
318 }
else if (ti.dwFlags & TOUCHEVENTF_MOVE) {
320 }
else if (ti.dwFlags & TOUCHEVENTF_UP) {
327 LONG tx = (ti.x / 100) - topLeft.x;
328 LONG ty = (ti.y / 100) - topLeft.y;
329 eventHandled =
window->onTouch(ti.dwID,
state, tx, ty) || eventHandled;
335 return DefWindowProc(hWnd,
message, wParam, lParam);
338 return eventHandled ? 0 : 1;