quickwin 2.1.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +9 -9
- package/README.md +9 -9
- package/constants.ts +1063 -0
- package/enum_map.d.ts +129 -0
- package/examples/PdfCanvas.js +2 -2
- package/examples/PdfCanvas.tsx +3 -2
- package/examples/{exec_server.js → execd/main.js} +1114 -287
- package/examples/execd/tray.js +192 -0
- package/examples/execd/worker.js +122 -0
- package/examples/pdf_preview2.js +46 -46
- package/examples/pdf_preview2.ts +55 -54
- package/examples/pdf_viewer.js +134 -130
- package/examples/pdf_viewer.tsx +6 -5
- package/examples/test_gallery.js +135 -131
- package/examples/test_gallery.tsx +9 -8
- package/examples/test_react_lazy.js +130 -128
- package/examples/test_react_lazy.tsx +7 -6
- package/examples/test_react_listbox.js +130 -128
- package/examples/test_react_listbox.tsx +8 -7
- package/examples/test_root_window.js +130 -128
- package/examples/test_root_window.tsx +5 -5
- package/examples/test_tab.js +130 -128
- package/examples/test_tab.tsx +7 -6
- package/examples/tray_demo.js +8 -8
- package/examples/tray_demo.tsx +9 -8
- package/lib/dumpRects.js +2 -2
- package/lib/dumpRects.ts +3 -2
- package/lib/fetch.js +15 -15
- package/lib/fetch.ts +16 -15
- package/lib/ffi/bind.js +3 -3
- package/lib/ffi/bind.ts +3 -3
- package/lib/ffi/ctype.ts +3 -1
- package/lib/ffi/struct.js +23 -7
- package/lib/ffi/struct.ts +50 -23
- package/lib/http-server.js +5 -5
- package/lib/http-server.ts +6 -5
- package/lib/react-qw/components/Button.js +2 -2
- package/lib/react-qw/components/CheckBox.js +4 -4
- package/lib/react-qw/components/ComboBox.js +10 -10
- package/lib/react-qw/components/DateTimePicker.js +12 -12
- package/lib/react-qw/components/Input.js +7 -7
- package/lib/react-qw/components/Link.js +4 -4
- package/lib/react-qw/components/ListBox.js +12 -12
- package/lib/react-qw/components/ListView.js +35 -35
- package/lib/react-qw/components/PathPicker.js +3 -3
- package/lib/react-qw/components/ProgressBar.js +4 -4
- package/lib/react-qw/components/RadioButton.js +4 -4
- package/lib/react-qw/components/ScrollView.js +28 -28
- package/lib/react-qw/components/Slider.js +11 -11
- package/lib/react-qw/components/Tab.js +10 -10
- package/lib/react-qw/components/Tooltip.js +8 -8
- package/lib/react-qw/components/TreeView.js +20 -20
- package/lib/react-qw/index.js +5 -5
- package/lib/react-qw/index.ts +6 -5
- package/lib/react-qw/props.js +4 -4
- package/lib/react-qw/props.ts +5 -4
- package/lib/react-qw/reconciler.js +10 -10
- package/lib/react-qw/reconciler.ts +11 -10
- package/lib/text-measure.js +3 -3
- package/lib/text-measure.ts +4 -3
- package/lib/websocket.js +17 -17
- package/lib/websocket.ts +18 -17
- package/lib/windows/advapi32.js +7 -7
- package/lib/windows/advapi32.ts +7 -7
- package/lib/windows/gdi32.js +17 -17
- package/lib/windows/gdi32.ts +17 -17
- package/lib/windows/kernel32.js +41 -2
- package/lib/windows/kernel32.ts +45 -2
- package/lib/windows/shell32.js +24 -3
- package/lib/windows/shell32.ts +27 -4
- package/lib/windows/structs.js +230 -92
- package/lib/windows/structs.ts +278 -92
- package/lib/windows/user32.js +18 -6
- package/lib/windows/user32.ts +18 -6
- package/lib/windows/winspool.js +3 -3
- package/lib/windows/winspool.ts +3 -3
- package/package.json +4 -3
- package/quickwin.d.ts +32 -10
- package/qwin-nowasm-x86.exe +0 -0
- package/qwin-nowasm.exe +0 -0
- package/qwin-x86.exe +0 -0
- package/qwin.exe +0 -0
- package/test/test_ffi_bind.js +12 -10
- package/test/test_ffi_bind.ts +14 -12
- package/test/test_ffi_struct.js +60 -26
- package/test/test_ffi_struct.ts +58 -28
- package/test/test_ffi_windows.js +1 -1
- package/test/test_ffi_windows.ts +1 -1
- package/test/test_files.js +7 -7
- package/test/test_files.ts +8 -8
- package/test/test_gdi_draw.js +51 -51
- package/test/test_gdi_draw.ts +57 -57
- package/test/test_http_server.js +3 -3
- package/test/test_http_server.ts +4 -3
- package/test/test_ipv6.js +3 -3
- package/test/test_ipv6.ts +4 -3
- package/test/test_net_event.js +3 -3
- package/test/test_net_event.ts +4 -3
- package/test/test_printer.js +4 -4
- package/test/test_printer.ts +5 -5
- package/test/test_react_complex.js +132 -130
- package/test/test_react_counter.js +130 -128
- package/test/test_react_flex.js +132 -130
- package/test/test_react_hidden.js +130 -128
- package/test/test_react_listview_link.js +131 -129
- package/test/test_react_notify.js +148 -146
- package/test/test_react_render.js +130 -128
- package/test/test_registry.js +6 -6
- package/test/test_registry.ts +8 -8
- package/test/test_wolfssl_read.js +8 -8
- package/test/test_wolfssl_read.ts +9 -8
- package/examples/exec_server.tsx +0 -488
- package/examples/exec_server_worker.js +0 -395
- package/examples/exec_server_worker.ts +0 -417
- package/examples/setres.js +0 -79
- package/examples/setres.ts +0 -86
- package/quickwin_const.d.ts +0 -1037
package/examples/pdf_preview2.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { BITMAPINFOHEADER, OPENFILENAMEW } from '../lib/windows/structs.js'
|
|
|
9
9
|
import { GetOpenFileName } from '../lib/windows/comdlg32.js'
|
|
10
10
|
import { GetDC, ReleaseDC } from '../lib/windows/user32.js'
|
|
11
11
|
import { PatBlt, SetDIBitsToDevice } from '../lib/windows/gdi32.js'
|
|
12
|
+
import { Gwlp, MouseKeyFlag, ScrollBar, ScrollCmd, SetWindowPosFlag, SetWindowPosHwnd, WindowStyle, WmMsg } from '../constants'
|
|
12
13
|
|
|
13
14
|
type MuPdf = typeof import('../vendor/mupdf-wasm/mupdf.js')
|
|
14
15
|
|
|
@@ -120,32 +121,32 @@ function updateScrollRange(): void {
|
|
|
120
121
|
scrollX = Math.min(scrollX, maxX)
|
|
121
122
|
scrollY = Math.min(scrollY, maxY)
|
|
122
123
|
if (currentPixmap.w > cw) {
|
|
123
|
-
const style = gui.GetWindowLongPtr(hwndCanvas,
|
|
124
|
-
if (!(style &
|
|
125
|
-
gui.SetWindowLongPtr(hwndCanvas,
|
|
126
|
-
gui.SetWindowPos(hwndCanvas,
|
|
127
|
-
|
|
128
|
-
|
|
124
|
+
const style = gui.GetWindowLongPtr(hwndCanvas, Gwlp.STYLE) | 0
|
|
125
|
+
if (!(style & WindowStyle.HSCROLL)) {
|
|
126
|
+
gui.SetWindowLongPtr(hwndCanvas, Gwlp.STYLE, style | WindowStyle.HSCROLL)
|
|
127
|
+
gui.SetWindowPos(hwndCanvas, SetWindowPosHwnd.TOP, 0, 0, 0, 0,
|
|
128
|
+
SetWindowPosFlag.SWP_NOMOVE | SetWindowPosFlag.SWP_NOSIZE |
|
|
129
|
+
SetWindowPosFlag.SWP_NOZORDER | SetWindowPosFlag.SWP_FRAMECHANGED)
|
|
129
130
|
}
|
|
130
|
-
gui.SetScrollInfo(hwndCanvas,
|
|
131
|
-
gui.ShowScrollBar(hwndCanvas,
|
|
131
|
+
gui.SetScrollInfo(hwndCanvas, ScrollBar.HORZ, { min: 0, max: currentPixmap.w - 1, page: cw, pos: scrollX }, true)
|
|
132
|
+
gui.ShowScrollBar(hwndCanvas, ScrollBar.HORZ, true)
|
|
132
133
|
} else {
|
|
133
134
|
scrollX = 0
|
|
134
|
-
const style = gui.GetWindowLongPtr(hwndCanvas,
|
|
135
|
-
if (style &
|
|
136
|
-
gui.SetWindowLongPtr(hwndCanvas,
|
|
137
|
-
gui.SetWindowPos(hwndCanvas,
|
|
138
|
-
|
|
139
|
-
|
|
135
|
+
const style = gui.GetWindowLongPtr(hwndCanvas, Gwlp.STYLE) | 0
|
|
136
|
+
if (style & WindowStyle.HSCROLL) {
|
|
137
|
+
gui.SetWindowLongPtr(hwndCanvas, Gwlp.STYLE, style & ~WindowStyle.HSCROLL)
|
|
138
|
+
gui.SetWindowPos(hwndCanvas, SetWindowPosHwnd.TOP, 0, 0, 0, 0,
|
|
139
|
+
SetWindowPosFlag.SWP_NOMOVE | SetWindowPosFlag.SWP_NOSIZE |
|
|
140
|
+
SetWindowPosFlag.SWP_NOZORDER | SetWindowPosFlag.SWP_FRAMECHANGED)
|
|
140
141
|
}
|
|
141
|
-
gui.ShowScrollBar(hwndCanvas,
|
|
142
|
+
gui.ShowScrollBar(hwndCanvas, ScrollBar.HORZ, false)
|
|
142
143
|
}
|
|
143
144
|
if (currentPixmap.h > ch) {
|
|
144
|
-
gui.SetScrollInfo(hwndCanvas,
|
|
145
|
-
gui.ShowScrollBar(hwndCanvas,
|
|
146
|
-
} else { scrollY = 0; gui.ShowScrollBar(hwndCanvas,
|
|
147
|
-
gui.SetWindowPos(hwndContent,
|
|
148
|
-
|
|
145
|
+
gui.SetScrollInfo(hwndCanvas, ScrollBar.VERT, { min: 0, max: currentPixmap.h - 1, page: ch, pos: scrollY }, true)
|
|
146
|
+
gui.ShowScrollBar(hwndCanvas, ScrollBar.VERT, true)
|
|
147
|
+
} else { scrollY = 0; gui.ShowScrollBar(hwndCanvas, ScrollBar.VERT, false) }
|
|
148
|
+
gui.SetWindowPos(hwndContent, SetWindowPosHwnd.TOP, -scrollX, -scrollY, 0, 0,
|
|
149
|
+
SetWindowPosFlag.SWP_NOSIZE | SetWindowPosFlag.SWP_NOZORDER)
|
|
149
150
|
}
|
|
150
151
|
|
|
151
152
|
function showPdf(mupdf: MuPdf, path: string, pageIdx: number): void {
|
|
@@ -155,8 +156,8 @@ function showPdf(mupdf: MuPdf, path: string, pageIdx: number): void {
|
|
|
155
156
|
currentPixmap = pix; currentPage = pageIdx; totalPages = pix.totalPages
|
|
156
157
|
gui.SetWindowText(hwndMain, 'PDF 预览 - 第 ' + (pageIdx + 1) + '/' + totalPages + ' 页')
|
|
157
158
|
scrollX = 0; scrollY = 0
|
|
158
|
-
gui.SetWindowPos(hwndContent,
|
|
159
|
-
|
|
159
|
+
gui.SetWindowPos(hwndContent, SetWindowPosHwnd.TOP, 0, 0, pix.w, pix.h,
|
|
160
|
+
SetWindowPosFlag.SWP_NOZORDER | SetWindowPosFlag.SWP_NOMOVE)
|
|
160
161
|
updateScrollRange()
|
|
161
162
|
gui.InvalidateRect(hwndContent, null, true)
|
|
162
163
|
}
|
|
@@ -170,19 +171,19 @@ function doScroll(dx: number, dy: number): void {
|
|
|
170
171
|
const maxY = Math.max(0, currentPixmap.h - ch)
|
|
171
172
|
scrollX = Math.max(0, Math.min(maxX, scrollX + dx))
|
|
172
173
|
scrollY = Math.max(0, Math.min(maxY, scrollY + dy))
|
|
173
|
-
gui.SetWindowPos(hwndContent,
|
|
174
|
-
|
|
175
|
-
gui.SetScrollInfo(hwndCanvas,
|
|
176
|
-
gui.SetScrollInfo(hwndCanvas,
|
|
174
|
+
gui.SetWindowPos(hwndContent, SetWindowPosHwnd.TOP, -scrollX, -scrollY, 0, 0,
|
|
175
|
+
SetWindowPosFlag.SWP_NOSIZE | SetWindowPosFlag.SWP_NOZORDER)
|
|
176
|
+
gui.SetScrollInfo(hwndCanvas, ScrollBar.HORZ, { pos: scrollX }, true)
|
|
177
|
+
gui.SetScrollInfo(hwndCanvas, ScrollBar.VERT, { pos: scrollY }, true)
|
|
177
178
|
}
|
|
178
179
|
|
|
179
180
|
async function main(): Promise<void> {
|
|
180
181
|
const mupdf = await loadMupdf()
|
|
181
182
|
if (!mupdf) { gui.MessageBox('加载 mupdf WASM 失败'); return }
|
|
182
183
|
|
|
183
|
-
const WS_CHILD =
|
|
184
|
-
const WS_VIS =
|
|
185
|
-
const WS_BORDER =
|
|
184
|
+
const WS_CHILD = WindowStyle.CHILD
|
|
185
|
+
const WS_VIS = WindowStyle.VISIBLE
|
|
186
|
+
const WS_BORDER = WindowStyle.BORDER
|
|
186
187
|
const ctrlY = 12, ctrlH = 26, gap = 4, btnW = 80, btnPageW = 72
|
|
187
188
|
|
|
188
189
|
let hwndBtnOpen: gui.HWND | null = null
|
|
@@ -191,18 +192,18 @@ let hwndBtnNext: gui.HWND | null = null
|
|
|
191
192
|
|
|
192
193
|
gui.RegisterClass('PdfViewer2', (hwnd, msg, wParam, lParam) => {
|
|
193
194
|
assertNonNullable(hwndCanvas); assertNonNullable(hwndEdit); assertNonNullable(hwndBtnOpen); assertNonNullable(hwndBtnPrev); assertNonNullable(hwndBtnNext)
|
|
194
|
-
if (msg ===
|
|
195
|
-
if (msg ===
|
|
195
|
+
if (msg === WmMsg.DESTROY) { gui.PostQuitMessage(0); return 0 }
|
|
196
|
+
if (msg === WmMsg.SIZE) {
|
|
196
197
|
const cr = gui.GetClientRect(hwnd)
|
|
197
198
|
if (cr) {
|
|
198
199
|
const cw = cr.right - cr.left, ch = cr.bottom - cr.top
|
|
199
|
-
gui.SetWindowPos(hwndCanvas,
|
|
200
|
-
gui.SetWindowPos(hwndEdit,
|
|
201
|
-
|
|
200
|
+
gui.SetWindowPos(hwndCanvas, SetWindowPosHwnd.TOP, 0, 50, cw, Math.max(1, ch - 50), SetWindowPosFlag.SWP_NOZORDER)
|
|
201
|
+
gui.SetWindowPos(hwndEdit, SetWindowPosHwnd.TOP, 0, 0, Math.max(100, cw - 320), 0,
|
|
202
|
+
SetWindowPosFlag.SWP_NOMOVE | SetWindowPosFlag.SWP_NOZORDER)
|
|
202
203
|
}
|
|
203
204
|
return gui.DefWindowProc(hwnd, msg, wParam, lParam)
|
|
204
205
|
}
|
|
205
|
-
if (msg ===
|
|
206
|
+
if (msg === WmMsg.COMMAND) {
|
|
206
207
|
const hCtrl = lParam
|
|
207
208
|
if (hCtrl === hwndBtnOpen) {
|
|
208
209
|
const path = openPdfFileDialog()
|
|
@@ -219,7 +220,7 @@ let hwndBtnNext: gui.HWND | null = null
|
|
|
219
220
|
return gui.DefWindowProc(hwnd, msg, wParam, lParam)
|
|
220
221
|
})
|
|
221
222
|
hwndMain = gui.CreateWindow('PdfViewer2', 'PDF 预览 2',
|
|
222
|
-
|
|
223
|
+
WindowStyle.OVERLAPPEDWINDOW | WindowStyle.CLIPCHILDREN,
|
|
223
224
|
100, 100, 1100, 800, null, null)!
|
|
224
225
|
if (!hwndMain) { gui.MessageBox('创建主窗口失败'); return }
|
|
225
226
|
|
|
@@ -239,7 +240,7 @@ let hwndBtnNext: gui.HWND | null = null
|
|
|
239
240
|
|
|
240
241
|
// 画布(带滚动条)
|
|
241
242
|
hwndCanvas = gui.CreateWindow('STATIC', '',
|
|
242
|
-
WS_CHILD | WS_VIS |
|
|
243
|
+
WS_CHILD | WS_VIS | WindowStyle.CLIPCHILDREN | WindowStyle.VSCROLL | WindowStyle.HSCROLL,
|
|
243
244
|
0, 50, 1100, 750, hwndMain, null)!
|
|
244
245
|
|
|
245
246
|
// 内容窗口(画 pixmap)
|
|
@@ -256,8 +257,8 @@ let hwndBtnNext: gui.HWND | null = null
|
|
|
256
257
|
|
|
257
258
|
// 内容窗口 PAINT
|
|
258
259
|
gui.SetWindowProc(hwndContent, (hwnd: gui.HWND, msg: number, wParam: number, lParam: number): number => {
|
|
259
|
-
if (msg ===
|
|
260
|
-
if (msg ===
|
|
260
|
+
if (msg === WmMsg.ERASEBKGND) return 1
|
|
261
|
+
if (msg === WmMsg.PAINT) {
|
|
261
262
|
gui.DefWindowProc(hwnd, msg, wParam, lParam)
|
|
262
263
|
const pm = currentPixmap
|
|
263
264
|
if (!pm) return 0
|
|
@@ -274,8 +275,8 @@ let hwndBtnNext: gui.HWND | null = null
|
|
|
274
275
|
|
|
275
276
|
// 画布消息处理(PAINT 填白、滚动条、滚轮)
|
|
276
277
|
gui.SetWindowProc(hwndCanvas, (hwnd: gui.HWND, msg: number, wParam: number, lParam: number): number => {
|
|
277
|
-
if (msg ===
|
|
278
|
-
if (msg ===
|
|
278
|
+
if (msg === WmMsg.ERASEBKGND) return 1
|
|
279
|
+
if (msg === WmMsg.PAINT) {
|
|
279
280
|
const cr = gui.GetClientRect(hwnd)
|
|
280
281
|
if (cr) {
|
|
281
282
|
const cw = cr.right - cr.left, ch = cr.bottom - cr.top
|
|
@@ -288,29 +289,29 @@ let hwndBtnNext: gui.HWND | null = null
|
|
|
288
289
|
gui.DefWindowProc(hwnd, msg, wParam, lParam)
|
|
289
290
|
return 0
|
|
290
291
|
}
|
|
291
|
-
if (msg ===
|
|
292
|
-
const bar = msg ===
|
|
292
|
+
if (msg === WmMsg.VSCROLL || msg === WmMsg.HSCROLL) {
|
|
293
|
+
const bar = msg === WmMsg.VSCROLL ? ScrollBar.VERT : ScrollBar.HORZ
|
|
293
294
|
const info = gui.GetScrollInfo(hwnd, bar)
|
|
294
295
|
const maxPos = info.max - info.page + 1
|
|
295
296
|
const code = wParam & 0xFFFF
|
|
296
|
-
let newPos = bar ===
|
|
297
|
-
if (code ===
|
|
297
|
+
let newPos = bar === ScrollBar.VERT ? scrollY : scrollX
|
|
298
|
+
if (code === ScrollCmd.THUMBTRACK || code === ScrollCmd.THUMBPOSITION)
|
|
298
299
|
newPos = Math.max(0, Math.min(maxPos, (wParam >> 16) & 0xFFFF))
|
|
299
|
-
else if (code ===
|
|
300
|
-
else if (code ===
|
|
301
|
-
else if (code ===
|
|
302
|
-
else if (code ===
|
|
300
|
+
else if (code === ScrollCmd.LINEUP) newPos -= 20
|
|
301
|
+
else if (code === ScrollCmd.LINEDOWN) newPos += 20
|
|
302
|
+
else if (code === ScrollCmd.PAGEUP) newPos -= info.page
|
|
303
|
+
else if (code === ScrollCmd.PAGEDOWN) newPos += info.page
|
|
303
304
|
else return 0
|
|
304
305
|
newPos = Math.max(0, Math.min(maxPos, newPos))
|
|
305
|
-
if (bar ===
|
|
306
|
+
if (bar === ScrollBar.VERT) doScroll(0, newPos - scrollY)
|
|
306
307
|
else doScroll(newPos - scrollX, 0)
|
|
307
308
|
return 0
|
|
308
309
|
}
|
|
309
|
-
if (msg ===
|
|
310
|
+
if (msg === WmMsg.MOUSEWHEEL) {
|
|
310
311
|
const raw = (wParam >>> 16) & 0xFFFF
|
|
311
312
|
const wheel = raw >= 0x8000 ? raw - 0x10000 : raw
|
|
312
|
-
const isHorz = (wParam &
|
|
313
|
-
const bar = isHorz ?
|
|
313
|
+
const isHorz = (wParam & MouseKeyFlag.MK_SHIFT) !== 0
|
|
314
|
+
const bar = isHorz ? ScrollBar.HORZ : ScrollBar.VERT
|
|
314
315
|
const info = gui.GetScrollInfo(hwnd, bar)
|
|
315
316
|
const maxPos = info.max - info.page + 1
|
|
316
317
|
let newPos = (isHorz ? scrollX : scrollY) - Math.round(wheel * 40 / 120)
|
|
@@ -319,7 +320,7 @@ let hwndBtnNext: gui.HWND | null = null
|
|
|
319
320
|
else doScroll(0, newPos - scrollY)
|
|
320
321
|
return 0
|
|
321
322
|
}
|
|
322
|
-
if (msg ===
|
|
323
|
+
if (msg === WmMsg.SIZE) { updateScrollRange(); return gui.DefWindowProc(hwnd, msg, wParam, lParam) }
|
|
323
324
|
return gui.DefWindowProc(hwnd, msg, wParam, lParam)
|
|
324
325
|
})
|
|
325
326
|
|