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/lib/websocket.js
CHANGED
|
@@ -273,16 +273,16 @@ class WebSocketImpl {
|
|
|
273
273
|
if (this._processingHandshake)
|
|
274
274
|
return;
|
|
275
275
|
if (resolved && state === 'open') {
|
|
276
|
-
if (event.lNetworkEvents & 1 /*
|
|
276
|
+
if (event.lNetworkEvents & 1 /* FdEvent.FD_READ */) {
|
|
277
277
|
this._onData();
|
|
278
278
|
}
|
|
279
|
-
if (event.lNetworkEvents & 32 /*
|
|
279
|
+
if (event.lNetworkEvents & 32 /* FdEvent.FD_CLOSE */) {
|
|
280
280
|
this._cleanup();
|
|
281
281
|
this._setState(State.CLOSED);
|
|
282
282
|
}
|
|
283
283
|
return;
|
|
284
284
|
}
|
|
285
|
-
if (event.lNetworkEvents & 16 /*
|
|
285
|
+
if (event.lNetworkEvents & 16 /* FdEvent.FD_CONNECT */) {
|
|
286
286
|
const errCode = event.iErrorCode[0];
|
|
287
287
|
if (errCode !== 0) {
|
|
288
288
|
doError(new Error('Connection failed: ' + errCode));
|
|
@@ -296,10 +296,10 @@ class WebSocketImpl {
|
|
|
296
296
|
return;
|
|
297
297
|
}
|
|
298
298
|
if (this._options.rejectUnauthorized === false) {
|
|
299
|
-
wolfssl.wolfSSL_CTX_set_verify(this._ctx, 0 /*
|
|
299
|
+
wolfssl.wolfSSL_CTX_set_verify(this._ctx, 0 /* VerifyMode.SSL_VERIFY_NONE */);
|
|
300
300
|
}
|
|
301
301
|
else {
|
|
302
|
-
wolfssl.wolfSSL_CTX_set_verify(this._ctx, 1 /*
|
|
302
|
+
wolfssl.wolfSSL_CTX_set_verify(this._ctx, 1 /* VerifyMode.SSL_VERIFY_PEER */);
|
|
303
303
|
wolfssl.loadTrustedCerts(this._ctx);
|
|
304
304
|
}
|
|
305
305
|
this._ssl = wolfssl.wolfSSL_new(this._ctx);
|
|
@@ -310,7 +310,7 @@ class WebSocketImpl {
|
|
|
310
310
|
wolfssl.wolfSSL_set_fd(this._ssl, sock.get_fd(fd));
|
|
311
311
|
const sniHost = host;
|
|
312
312
|
if (sniHost) {
|
|
313
|
-
wolfssl.wolfSSL_UseSNI(this._ssl, 0 /*
|
|
313
|
+
wolfssl.wolfSSL_UseSNI(this._ssl, 0 /* SniType.WOLFSSL_SNI_HOST_NAME */, sniHost);
|
|
314
314
|
if (this._options.rejectUnauthorized !== false) {
|
|
315
315
|
wolfssl.wolfSSL_check_domain_name(this._ssl, sniHost);
|
|
316
316
|
}
|
|
@@ -322,21 +322,21 @@ class WebSocketImpl {
|
|
|
322
322
|
state = 'request';
|
|
323
323
|
}
|
|
324
324
|
}
|
|
325
|
-
if ((event.lNetworkEvents & 1 /*
|
|
325
|
+
if ((event.lNetworkEvents & 1 /* FdEvent.FD_READ */) || (event.lNetworkEvents & 2 /* FdEvent.FD_WRITE */)) {
|
|
326
326
|
if (state === 'handshake') {
|
|
327
327
|
if (!this._ssl) {
|
|
328
328
|
doError(new Error('TLS not initialized'));
|
|
329
329
|
return;
|
|
330
330
|
}
|
|
331
331
|
const ret = wolfssl.wolfSSL_connect(this._ssl);
|
|
332
|
-
if (ret === 1 /*
|
|
332
|
+
if (ret === 1 /* ReturnCode.SSL_SUCCESS */) {
|
|
333
333
|
this._sendRawStr(request);
|
|
334
334
|
state = 'request';
|
|
335
335
|
}
|
|
336
336
|
else {
|
|
337
337
|
const err = wolfssl.wolfSSL_get_error(this._ssl, ret);
|
|
338
|
-
if (err !== 2 /*
|
|
339
|
-
err !== 3 /*
|
|
338
|
+
if (err !== 2 /* WolfsslErrorCode.WOLFSSL_ERROR_WANT_READ */ &&
|
|
339
|
+
err !== 3 /* WolfsslErrorCode.WOLFSSL_ERROR_WANT_WRITE */) {
|
|
340
340
|
doError(new Error('TLS handshake failed: ' + err));
|
|
341
341
|
}
|
|
342
342
|
}
|
|
@@ -352,10 +352,10 @@ class WebSocketImpl {
|
|
|
352
352
|
}
|
|
353
353
|
else {
|
|
354
354
|
const err = wolfssl.wolfSSL_get_error(this._ssl, n);
|
|
355
|
-
if (err === 2 /*
|
|
356
|
-
err === 3 /*
|
|
355
|
+
if (err === 2 /* WolfsslErrorCode.WOLFSSL_ERROR_WANT_READ */ ||
|
|
356
|
+
err === 3 /* WolfsslErrorCode.WOLFSSL_ERROR_WANT_WRITE */)
|
|
357
357
|
break;
|
|
358
|
-
if (n === 0 || err === 6 /*
|
|
358
|
+
if (n === 0 || err === 6 /* WolfsslErrorCode.WOLFSSL_ERROR_ZERO_RETURN */)
|
|
359
359
|
break;
|
|
360
360
|
doError(new Error('TLS read failed: ' + err));
|
|
361
361
|
return;
|
|
@@ -417,7 +417,7 @@ class WebSocketImpl {
|
|
|
417
417
|
}
|
|
418
418
|
}
|
|
419
419
|
}
|
|
420
|
-
if (event.lNetworkEvents & 32 /*
|
|
420
|
+
if (event.lNetworkEvents & 32 /* FdEvent.FD_CLOSE */) {
|
|
421
421
|
if (state !== 'open') {
|
|
422
422
|
doError(new Error('Connection closed'));
|
|
423
423
|
}
|
|
@@ -464,10 +464,10 @@ class WebSocketImpl {
|
|
|
464
464
|
}
|
|
465
465
|
else {
|
|
466
466
|
const err = wolfssl.wolfSSL_get_error(this._ssl, n);
|
|
467
|
-
if (err === 2 /*
|
|
468
|
-
err === 3 /*
|
|
467
|
+
if (err === 2 /* WolfsslErrorCode.WOLFSSL_ERROR_WANT_READ */ ||
|
|
468
|
+
err === 3 /* WolfsslErrorCode.WOLFSSL_ERROR_WANT_WRITE */)
|
|
469
469
|
break;
|
|
470
|
-
if (n === 0 || err === 6 /*
|
|
470
|
+
if (n === 0 || err === 6 /* WolfsslErrorCode.WOLFSSL_ERROR_ZERO_RETURN */)
|
|
471
471
|
break;
|
|
472
472
|
this._fireError(new Error('TLS read failed: ' + err));
|
|
473
473
|
if (this._state !== State.CLOSED)
|
package/lib/websocket.ts
CHANGED
|
@@ -2,6 +2,7 @@ import '../lib/polyfill.js'
|
|
|
2
2
|
import * as sock from 'sock'
|
|
3
3
|
import * as wolfssl from 'wolfssl'
|
|
4
4
|
import * as os from 'os'
|
|
5
|
+
import { FdEvent, ReturnCode, SniType, VerifyMode, WolfsslErrorCode } from '../constants'
|
|
5
6
|
|
|
6
7
|
// ── Constants ──
|
|
7
8
|
|
|
@@ -301,17 +302,17 @@ class WebSocketImpl {
|
|
|
301
302
|
sock.set_on_event(fd, async (event: { lNetworkEvents: number; iErrorCode: number[] }) => {
|
|
302
303
|
if (this._processingHandshake) return
|
|
303
304
|
if (resolved && state === 'open') {
|
|
304
|
-
if (event.lNetworkEvents &
|
|
305
|
+
if (event.lNetworkEvents & FdEvent.FD_READ) {
|
|
305
306
|
this._onData()
|
|
306
307
|
}
|
|
307
|
-
if (event.lNetworkEvents &
|
|
308
|
+
if (event.lNetworkEvents & FdEvent.FD_CLOSE) {
|
|
308
309
|
this._cleanup()
|
|
309
310
|
this._setState(State.CLOSED)
|
|
310
311
|
}
|
|
311
312
|
return
|
|
312
313
|
}
|
|
313
314
|
|
|
314
|
-
if (event.lNetworkEvents &
|
|
315
|
+
if (event.lNetworkEvents & FdEvent.FD_CONNECT) {
|
|
315
316
|
const errCode = event.iErrorCode[0]
|
|
316
317
|
if (errCode !== 0) {
|
|
317
318
|
doError(new Error('Connection failed: ' + errCode))
|
|
@@ -322,9 +323,9 @@ class WebSocketImpl {
|
|
|
322
323
|
this._ctx = wolfssl.wolfSSL_CTX_new(method)
|
|
323
324
|
if (!this._ctx) { doError(new Error('SSL_CTX_new failed')); return }
|
|
324
325
|
if (this._options.rejectUnauthorized === false) {
|
|
325
|
-
wolfssl.wolfSSL_CTX_set_verify(this._ctx,
|
|
326
|
+
wolfssl.wolfSSL_CTX_set_verify(this._ctx, VerifyMode.SSL_VERIFY_NONE)
|
|
326
327
|
} else {
|
|
327
|
-
wolfssl.wolfSSL_CTX_set_verify(this._ctx,
|
|
328
|
+
wolfssl.wolfSSL_CTX_set_verify(this._ctx, VerifyMode.SSL_VERIFY_PEER)
|
|
328
329
|
wolfssl.loadTrustedCerts(this._ctx)
|
|
329
330
|
}
|
|
330
331
|
this._ssl = wolfssl.wolfSSL_new(this._ctx)
|
|
@@ -332,7 +333,7 @@ class WebSocketImpl {
|
|
|
332
333
|
wolfssl.wolfSSL_set_fd(this._ssl, sock.get_fd(fd))
|
|
333
334
|
const sniHost = host
|
|
334
335
|
if (sniHost) {
|
|
335
|
-
wolfssl.wolfSSL_UseSNI(this._ssl,
|
|
336
|
+
wolfssl.wolfSSL_UseSNI(this._ssl, SniType.WOLFSSL_SNI_HOST_NAME, sniHost)
|
|
336
337
|
if (this._options.rejectUnauthorized !== false) {
|
|
337
338
|
wolfssl.wolfSSL_check_domain_name(this._ssl, sniHost)
|
|
338
339
|
}
|
|
@@ -344,17 +345,17 @@ class WebSocketImpl {
|
|
|
344
345
|
}
|
|
345
346
|
}
|
|
346
347
|
|
|
347
|
-
if ((event.lNetworkEvents &
|
|
348
|
+
if ((event.lNetworkEvents & FdEvent.FD_READ) || (event.lNetworkEvents & FdEvent.FD_WRITE)) {
|
|
348
349
|
if (state === 'handshake') {
|
|
349
350
|
if (!this._ssl) { doError(new Error('TLS not initialized')); return }
|
|
350
351
|
const ret = wolfssl.wolfSSL_connect(this._ssl)
|
|
351
|
-
if (ret ===
|
|
352
|
+
if (ret === ReturnCode.SSL_SUCCESS) {
|
|
352
353
|
this._sendRawStr(request)
|
|
353
354
|
state = 'request'
|
|
354
355
|
} else {
|
|
355
356
|
const err = wolfssl.wolfSSL_get_error(this._ssl, ret)
|
|
356
|
-
if (err !==
|
|
357
|
-
err !==
|
|
357
|
+
if (err !== WolfsslErrorCode.WOLFSSL_ERROR_WANT_READ &&
|
|
358
|
+
err !== WolfsslErrorCode.WOLFSSL_ERROR_WANT_WRITE) {
|
|
358
359
|
doError(new Error('TLS handshake failed: ' + err))
|
|
359
360
|
}
|
|
360
361
|
}
|
|
@@ -369,9 +370,9 @@ class WebSocketImpl {
|
|
|
369
370
|
data = buf.slice(0, n)
|
|
370
371
|
} else {
|
|
371
372
|
const err = wolfssl.wolfSSL_get_error(this._ssl, n)
|
|
372
|
-
if (err ===
|
|
373
|
-
err ===
|
|
374
|
-
if (n === 0 || err ===
|
|
373
|
+
if (err === WolfsslErrorCode.WOLFSSL_ERROR_WANT_READ ||
|
|
374
|
+
err === WolfsslErrorCode.WOLFSSL_ERROR_WANT_WRITE) break
|
|
375
|
+
if (n === 0 || err === WolfsslErrorCode.WOLFSSL_ERROR_ZERO_RETURN) break
|
|
375
376
|
doError(new Error('TLS read failed: ' + err))
|
|
376
377
|
return
|
|
377
378
|
}
|
|
@@ -431,7 +432,7 @@ class WebSocketImpl {
|
|
|
431
432
|
}
|
|
432
433
|
}
|
|
433
434
|
|
|
434
|
-
if (event.lNetworkEvents &
|
|
435
|
+
if (event.lNetworkEvents & FdEvent.FD_CLOSE) {
|
|
435
436
|
if (state !== 'open') {
|
|
436
437
|
doError(new Error('Connection closed'))
|
|
437
438
|
}
|
|
@@ -477,9 +478,9 @@ class WebSocketImpl {
|
|
|
477
478
|
data = buf.slice(0, n)
|
|
478
479
|
} else {
|
|
479
480
|
const err = wolfssl.wolfSSL_get_error(this._ssl, n)
|
|
480
|
-
if (err ===
|
|
481
|
-
err ===
|
|
482
|
-
if (n === 0 || err ===
|
|
481
|
+
if (err === WolfsslErrorCode.WOLFSSL_ERROR_WANT_READ ||
|
|
482
|
+
err === WolfsslErrorCode.WOLFSSL_ERROR_WANT_WRITE) break
|
|
483
|
+
if (n === 0 || err === WolfsslErrorCode.WOLFSSL_ERROR_ZERO_RETURN) break
|
|
483
484
|
this._fireError(new Error('TLS read failed: ' + err))
|
|
484
485
|
if (this._state !== State.CLOSED) this._setState(State.CLOSED)
|
|
485
486
|
return
|
package/lib/windows/advapi32.js
CHANGED
|
@@ -4,13 +4,13 @@ import { bind } from '../ffi/bind.js';
|
|
|
4
4
|
const b = (name, sig) => bind('advapi32.dll', name, sig);
|
|
5
5
|
/** 创建/打开子键(子键不存在则创建,含中间层级)
|
|
6
6
|
* @returns 0 = ERROR_SUCCESS
|
|
7
|
-
* @param args_0 hKey 父键:
|
|
7
|
+
* @param args_0 hKey 父键:HKey.CURRENT_USER / LOCAL_MACHINE 预定义键,或本族
|
|
8
8
|
* Open/Create 返回的真实句柄(此位双来源,不标 @HKey——裸位收两种)
|
|
9
9
|
* @param args_1 lpSubKey 子键路径('Software\\X\\Y',可 NULL = 打开 hKey 自身副本)
|
|
10
10
|
* @param args_2 Reserved 保留,恒 0
|
|
11
11
|
* @param args_3 lpClass 键类名(一般 NULL)
|
|
12
12
|
* @param args_4 dwOptions 保留属性(恒 0)
|
|
13
|
-
* @param args_5 samDesired 访问掩码
|
|
13
|
+
* @param args_5 samDesired 访问掩码 RegAccess.READ / SET_VALUE(标准组合常量按成员收录)
|
|
14
14
|
* @param args_6 lpSecurityAttributes 安全描述符(一般 NULL)
|
|
15
15
|
* @param args_7 phkResult 出参:键句柄(PtrArrayBuffer(8),readPtr 按架构读回)
|
|
16
16
|
* @param args_8 lpdwDisposition 出参:新建/已存在标记(可 NULL) */
|
|
@@ -20,7 +20,7 @@ export const RegCreateKeyEx = /*@__PURE__*/ b('RegCreateKeyExW', '<>ptr <WCHAR>p
|
|
|
20
20
|
* @param args_0 hKey 父键(同 RegCreateKeyEx 的双来源语义)
|
|
21
21
|
* @param args_1 lpSubKey 子键路径(NULL = 打开 hKey 自身副本)
|
|
22
22
|
* @param args_2 ulOptions 保留,恒 0
|
|
23
|
-
* @param args_3 samDesired 访问掩码
|
|
23
|
+
* @param args_3 samDesired 访问掩码 RegAccess.READ / SET_VALUE
|
|
24
24
|
* @param args_4 phkResult 出参:键句柄 */
|
|
25
25
|
export const RegOpenKeyEx = /*@__PURE__*/ b('RegOpenKeyExW', '<>ptr <WCHAR>ptr u32 u32@RegAccess <BYTE>ptr -> i32');
|
|
26
26
|
/** 关闭键句柄;只关 Open/Create 返回的真实句柄——预定义键(HKEY_CURRENT_USER 等)
|
|
@@ -29,16 +29,16 @@ export const RegOpenKeyEx = /*@__PURE__*/ b('RegOpenKeyExW', '<>ptr <WCHAR>ptr u
|
|
|
29
29
|
export const RegCloseKey = /*@__PURE__*/ b('RegCloseKey', '<>ptr -> i32');
|
|
30
30
|
/** 写键值
|
|
31
31
|
* @returns 0 = ERROR_SUCCESS
|
|
32
|
-
* @param args_0 hKey 键句柄(须 KEY_SET_VALUE 权限,含于
|
|
32
|
+
* @param args_0 hKey 键句柄(须 KEY_SET_VALUE 权限,含于 RegAccess.SET_VALUE)
|
|
33
33
|
* @param args_1 lpValueName 值名(NULL = 键的默认值)
|
|
34
34
|
* @param args_2 Reserved 保留,恒 0
|
|
35
|
-
* @param args_3 dwType 值类型
|
|
35
|
+
* @param args_3 dwType 值类型 RegType.SZ(UTF-16 字符串)
|
|
36
36
|
* @param args_4 lpData 数据缓冲(REG_SZ:UTF-16LE 含结尾 NUL)
|
|
37
37
|
* @param args_5 cbData 数据字节数(REG_SZ = (字符数+1)*2) */
|
|
38
38
|
export const RegSetValueEx = /*@__PURE__*/ b('RegSetValueExW', '<>ptr <WCHAR>ptr u32 u32@RegType <BYTE>ptr u32 -> i32');
|
|
39
39
|
/** 读键值(两跳模式:第一跳 lpData=NULL 取尺寸/类型,第二跳按尺寸带缓冲读数据)
|
|
40
40
|
* @returns 0 = ERROR_SUCCESS;2 = ERROR_FILE_NOT_FOUND(值不存在)
|
|
41
|
-
* @param args_0 hKey 键句柄(须 KEY_QUERY_VALUE 权限,含于
|
|
41
|
+
* @param args_0 hKey 键句柄(须 KEY_QUERY_VALUE 权限,含于 RegAccess.READ)
|
|
42
42
|
* @param args_1 lpValueName 值名(NULL = 键的默认值)
|
|
43
43
|
* @param args_2 lpReserved 保留,恒 NULL
|
|
44
44
|
* @param args_3 lpType 出参:值类型(可 NULL)
|
|
@@ -46,7 +46,7 @@ export const RegSetValueEx = /*@__PURE__*/ b('RegSetValueExW', '<>ptr <WCHAR>ptr
|
|
|
46
46
|
* @param args_5 lpcbData 双向:入 = lpData 缓冲字节数(须预写)、出 = 实际字节数 */
|
|
47
47
|
export const RegQueryValueEx = /*@__PURE__*/ b('RegQueryValueExW', '<>ptr <WCHAR>ptr <>ptr <BYTE>ptr <BYTE>ptr <BYTE>ptr -> i32');
|
|
48
48
|
/** 删除子键(连值一起删);须父键 KEY_CREATE_SUB_KEY 权限——自己的 HKCU 直接传
|
|
49
|
-
*
|
|
49
|
+
* HKey.CURRENT_USER 即可
|
|
50
50
|
* @returns 0 = ERROR_SUCCESS;2 = 子键不存在
|
|
51
51
|
* @param args_0 hKey 父键
|
|
52
52
|
* @param args_1 lpSubKey 要删的子键路径(不可 NULL) */
|
package/lib/windows/advapi32.ts
CHANGED
|
@@ -6,13 +6,13 @@ const b = <const S extends string>(name: string, sig: S) => bind('advapi32.dll',
|
|
|
6
6
|
|
|
7
7
|
/** 创建/打开子键(子键不存在则创建,含中间层级)
|
|
8
8
|
* @returns 0 = ERROR_SUCCESS
|
|
9
|
-
* @param args_0 hKey 父键:
|
|
9
|
+
* @param args_0 hKey 父键:HKey.CURRENT_USER / LOCAL_MACHINE 预定义键,或本族
|
|
10
10
|
* Open/Create 返回的真实句柄(此位双来源,不标 @HKey——裸位收两种)
|
|
11
11
|
* @param args_1 lpSubKey 子键路径('Software\\X\\Y',可 NULL = 打开 hKey 自身副本)
|
|
12
12
|
* @param args_2 Reserved 保留,恒 0
|
|
13
13
|
* @param args_3 lpClass 键类名(一般 NULL)
|
|
14
14
|
* @param args_4 dwOptions 保留属性(恒 0)
|
|
15
|
-
* @param args_5 samDesired 访问掩码
|
|
15
|
+
* @param args_5 samDesired 访问掩码 RegAccess.READ / SET_VALUE(标准组合常量按成员收录)
|
|
16
16
|
* @param args_6 lpSecurityAttributes 安全描述符(一般 NULL)
|
|
17
17
|
* @param args_7 phkResult 出参:键句柄(PtrArrayBuffer(8),readPtr 按架构读回)
|
|
18
18
|
* @param args_8 lpdwDisposition 出参:新建/已存在标记(可 NULL) */
|
|
@@ -24,7 +24,7 @@ export const RegCreateKeyEx = /*@__PURE__*/ b('RegCreateKeyExW',
|
|
|
24
24
|
* @param args_0 hKey 父键(同 RegCreateKeyEx 的双来源语义)
|
|
25
25
|
* @param args_1 lpSubKey 子键路径(NULL = 打开 hKey 自身副本)
|
|
26
26
|
* @param args_2 ulOptions 保留,恒 0
|
|
27
|
-
* @param args_3 samDesired 访问掩码
|
|
27
|
+
* @param args_3 samDesired 访问掩码 RegAccess.READ / SET_VALUE
|
|
28
28
|
* @param args_4 phkResult 出参:键句柄 */
|
|
29
29
|
export const RegOpenKeyEx = /*@__PURE__*/ b('RegOpenKeyExW',
|
|
30
30
|
'<>ptr <WCHAR>ptr u32 u32@RegAccess <BYTE>ptr -> i32')
|
|
@@ -36,10 +36,10 @@ export const RegCloseKey = /*@__PURE__*/ b('RegCloseKey', '<>ptr -> i32')
|
|
|
36
36
|
|
|
37
37
|
/** 写键值
|
|
38
38
|
* @returns 0 = ERROR_SUCCESS
|
|
39
|
-
* @param args_0 hKey 键句柄(须 KEY_SET_VALUE 权限,含于
|
|
39
|
+
* @param args_0 hKey 键句柄(须 KEY_SET_VALUE 权限,含于 RegAccess.SET_VALUE)
|
|
40
40
|
* @param args_1 lpValueName 值名(NULL = 键的默认值)
|
|
41
41
|
* @param args_2 Reserved 保留,恒 0
|
|
42
|
-
* @param args_3 dwType 值类型
|
|
42
|
+
* @param args_3 dwType 值类型 RegType.SZ(UTF-16 字符串)
|
|
43
43
|
* @param args_4 lpData 数据缓冲(REG_SZ:UTF-16LE 含结尾 NUL)
|
|
44
44
|
* @param args_5 cbData 数据字节数(REG_SZ = (字符数+1)*2) */
|
|
45
45
|
export const RegSetValueEx = /*@__PURE__*/ b('RegSetValueExW',
|
|
@@ -47,7 +47,7 @@ export const RegSetValueEx = /*@__PURE__*/ b('RegSetValueExW',
|
|
|
47
47
|
|
|
48
48
|
/** 读键值(两跳模式:第一跳 lpData=NULL 取尺寸/类型,第二跳按尺寸带缓冲读数据)
|
|
49
49
|
* @returns 0 = ERROR_SUCCESS;2 = ERROR_FILE_NOT_FOUND(值不存在)
|
|
50
|
-
* @param args_0 hKey 键句柄(须 KEY_QUERY_VALUE 权限,含于
|
|
50
|
+
* @param args_0 hKey 键句柄(须 KEY_QUERY_VALUE 权限,含于 RegAccess.READ)
|
|
51
51
|
* @param args_1 lpValueName 值名(NULL = 键的默认值)
|
|
52
52
|
* @param args_2 lpReserved 保留,恒 NULL
|
|
53
53
|
* @param args_3 lpType 出参:值类型(可 NULL)
|
|
@@ -57,7 +57,7 @@ export const RegQueryValueEx = /*@__PURE__*/ b('RegQueryValueExW',
|
|
|
57
57
|
'<>ptr <WCHAR>ptr <>ptr <BYTE>ptr <BYTE>ptr <BYTE>ptr -> i32')
|
|
58
58
|
|
|
59
59
|
/** 删除子键(连值一起删);须父键 KEY_CREATE_SUB_KEY 权限——自己的 HKCU 直接传
|
|
60
|
-
*
|
|
60
|
+
* HKey.CURRENT_USER 即可
|
|
61
61
|
* @returns 0 = ERROR_SUCCESS;2 = 子键不存在
|
|
62
62
|
* @param args_0 hKey 父键
|
|
63
63
|
* @param args_1 lpSubKey 要删的子键路径(不可 NULL) */
|
package/lib/windows/gdi32.js
CHANGED
|
@@ -12,7 +12,7 @@ import { LOGFONTW, POINT, RECT } from './structs.js';
|
|
|
12
12
|
const b = (name, sig, encoders) => bind('gdi32.dll', name, sig, encoders);
|
|
13
13
|
// 点数组编解码对(Polyline/Polygon/PlgBlt 共享):注册后 <POINT>ptr 位收元素数组
|
|
14
14
|
// (值域由 encoder 推导),C 侧 NULL 位传 NULL(number 直通),[]/单对象 fail-loud
|
|
15
|
-
const POINTArr = structArray(POINT);
|
|
15
|
+
const POINTArr = /*@__PURE__*/ structArray(POINT);
|
|
16
16
|
/** 创建实心画刷;配对 DeleteObject
|
|
17
17
|
* @returns 失败 → 0
|
|
18
18
|
* @param args_0 crColor 画刷颜色 0x00BBGGRR */
|
|
@@ -68,7 +68,7 @@ export const SelectObject = /*@__PURE__*/ b('SelectObject', '<HDC>ptr! <HGDIOBJ>
|
|
|
68
68
|
* @param args_5 hdcSrc 源 DC
|
|
69
69
|
* @param args_6 x1 源起始 x
|
|
70
70
|
* @param args_7 y1 源起始 y
|
|
71
|
-
* @param args_8 dwRop
|
|
71
|
+
* @param args_8 dwRop RasterOp.SRCCOPY 等互斥单选光栅操作码(标 @ 枚举拦手误值) */
|
|
72
72
|
// hdcDest 非空(!);hdcSrc 在 PATCOPY 等特定 rop 下 C 允许 NULL,保持可空档。
|
|
73
73
|
export const BitBlt = /*@__PURE__*/ b('BitBlt', '<HDC>ptr! i32 i32 i32 i32 <HDC>ptr i32 i32 u32@RasterOp -> i32');
|
|
74
74
|
/** 取位图像素到 lpvBits(lpbmi 为 BITMAPINFO,32bpp BI_RGB 无颜色表时头部即全部:
|
|
@@ -99,7 +99,7 @@ export const DeleteDC = /*@__PURE__*/ b('DeleteDC', '<HDC>ptr! -> i32');
|
|
|
99
99
|
* @param args_2 y 左上角 y
|
|
100
100
|
* @param args_3 w 宽度
|
|
101
101
|
* @param args_4 h 高度
|
|
102
|
-
* @param args_5 rop
|
|
102
|
+
* @param args_5 rop RasterOp.PATCOPY / WHITENESS 等互斥单选光栅操作码 */
|
|
103
103
|
export const PatBlt = /*@__PURE__*/ b('PatBlt', '<HDC>ptr! i32 i32 i32 i32 u32@RasterOp -> i32');
|
|
104
104
|
/** 拉伸位图传送(源区 wSrc×hSrc 放/缩到目标 wDest×hDest)
|
|
105
105
|
* @returns 成功 → 非 0
|
|
@@ -113,15 +113,15 @@ export const PatBlt = /*@__PURE__*/ b('PatBlt', '<HDC>ptr! i32 i32 i32 i32 u32@R
|
|
|
113
113
|
* @param args_7 ySrc 源区左上 y
|
|
114
114
|
* @param args_8 wSrc 源区宽
|
|
115
115
|
* @param args_9 hSrc 源区高
|
|
116
|
-
* @param args_10 dwRop
|
|
116
|
+
* @param args_10 dwRop RasterOp.SRCCOPY 等互斥单选光栅操作码 */
|
|
117
117
|
export const StretchBlt = /*@__PURE__*/ b('StretchBlt', '<HDC>ptr! i32 i32 i32 i32 <HDC>ptr i32 i32 i32 i32 u32@RasterOp -> i32');
|
|
118
118
|
/** 设置拉伸取色模式;放大时各模式像素同为源色,缩小时降采样策略不同
|
|
119
119
|
* (DELETESCANS 丢行 / HALFTONE 平均取色最保真)
|
|
120
120
|
* @returns 旧值
|
|
121
121
|
* @param args_0 hdc 目标 DC
|
|
122
|
-
* @param args_1 iMode
|
|
122
|
+
* @param args_1 iMode StretchBltMode.ANDSCANS(1) / ORSCANS(2) / DELETESCANS(3) / HALFTONE(4) */
|
|
123
123
|
export const SetStretchBltMode = /*@__PURE__*/ b('SetStretchBltMode', '<HDC>ptr! i32@StretchBltMode -> i32');
|
|
124
|
-
/** 读拉伸取色模式(值域 =
|
|
124
|
+
/** 读拉伸取色模式(值域 = StretchBltMode 成员);回传
|
|
125
125
|
* SetStretchBltMode 前需按成员值使用(裸 number 进不了枚举位)
|
|
126
126
|
* @returns number */
|
|
127
127
|
export const GetStretchBltMode = /*@__PURE__*/ b('GetStretchBltMode', '<HDC>ptr! -> i32');
|
|
@@ -187,18 +187,18 @@ export const SetDIBitsToDevice = /*@__PURE__*/ b('SetDIBitsToDevice', '<HDC>ptr!
|
|
|
187
187
|
* @param args_9 lpvBits 像素缓冲(ArrayBuffer)
|
|
188
188
|
* @param args_10 lpbmi BITMAPINFO 缓冲(BITMAPINFOHEADER.encode({...}).ptr)
|
|
189
189
|
* @param args_11 iUsage DIB_RGB_COLORS(0)
|
|
190
|
-
* @param args_12 rop
|
|
190
|
+
* @param args_12 rop RasterOp.SRCCOPY 等互斥单选光栅操作码 */
|
|
191
191
|
export const StretchDIBits = /*@__PURE__*/ b('StretchDIBits', '<HDC>ptr! i32 i32 i32 i32 i32 i32 i32 i32 <BYTE>ptr <BYTE>ptr u32 u32@RasterOp -> i32');
|
|
192
192
|
// ============ 画图原语(笔 / 线 / 形状 / 文字) ============
|
|
193
193
|
/** 取系统共享对象(笔/刷/字体/调色板);共享句柄不要 DeleteObject——
|
|
194
194
|
* SelectObject 选入 hdc 生效(如 NULL_BRUSH 让形状只描边不填充)
|
|
195
195
|
* @returns 失败 → 0
|
|
196
|
-
* @param args_0 iObject
|
|
196
|
+
* @param args_0 iObject StockObject.NULL_BRUSH / BLACK_PEN / DEFAULT_GUI_FONT 等 */
|
|
197
197
|
export const GetStockObject = /*@__PURE__*/ b('GetStockObject', 'i32@StockObject -> <HGDIOBJ>ptr');
|
|
198
198
|
/** 创建网格纹理画刷(线色 = crColor,间隙 = 背景:SetBkMode=TRANSPARENT 透底、OPAQUE
|
|
199
199
|
* 用 SetBkColor);配对 DeleteObject
|
|
200
200
|
* @returns 失败 → 0
|
|
201
|
-
* @param args_0 iHatch
|
|
201
|
+
* @param args_0 iHatch HatchStyle.HORIZONTAL(横线)/ VERTICAL / FDIAGONAL /
|
|
202
202
|
* BDIAGONAL / CROSS / DIAGCROSS
|
|
203
203
|
* @param args_1 crColor 纹理线颜色 0x00BBGGRR */
|
|
204
204
|
export const CreateHatchBrush = /*@__PURE__*/ b('CreateHatchBrush', 'i32@HatchStyle u32 -> <HGDIOBJ>ptr');
|
|
@@ -209,14 +209,14 @@ export const CreateHatchBrush = /*@__PURE__*/ b('CreateHatchBrush', 'i32@HatchSt
|
|
|
209
209
|
export const CreatePatternBrush = /*@__PURE__*/ b('CreatePatternBrush', '<HGDIOBJ>ptr -> <HGDIOBJ>ptr');
|
|
210
210
|
/** 创建画笔(选入 hdc 生效,SelectObject 选回旧对象后 DeleteObject 配对)
|
|
211
211
|
* @returns 失败 → 0
|
|
212
|
-
* @param args_0 iStyle 笔型(
|
|
212
|
+
* @param args_0 iStyle 笔型(PenStyle.SOLID / DASH / NULL 等)
|
|
213
213
|
* @param args_1 cWidth 笔宽(像素;>1 的几何宽设备相关,虚线样式可能被拉伸)
|
|
214
214
|
* @param args_2 crColor 笔色 0x00BBGGRR */
|
|
215
215
|
export const CreatePen = /*@__PURE__*/ b('CreatePen', 'i32@PenStyle i32 u32 -> <HGDIOBJ>ptr');
|
|
216
216
|
/** 设置文字/阴影背景填充模式
|
|
217
217
|
* @returns 旧模式(新建 DC 默认 OPAQUE)
|
|
218
218
|
* @param args_0 hdc 目标 DC
|
|
219
|
-
* @param args_1 iBkMode
|
|
219
|
+
* @param args_1 iBkMode BackgroundMode.OPAQUE(衬底填充)/ TRANSPARENT(透明) */
|
|
220
220
|
export const SetBkMode = /*@__PURE__*/ b('SetBkMode', '<HDC>ptr! i32@BackgroundMode -> i32');
|
|
221
221
|
/** 设置文字颜色
|
|
222
222
|
* @returns 旧 COLORREF(0x00BBGGRR)
|
|
@@ -241,19 +241,19 @@ export const RestoreDC = /*@__PURE__*/ b('RestoreDC', '<HDC>ptr! i32 -> i32');
|
|
|
241
241
|
/** 设置多边形填充规则
|
|
242
242
|
* @returns 旧值(新建 DC 默认 ALTERNATE = 奇偶规则)
|
|
243
243
|
* @param args_0 hdc 目标 DC
|
|
244
|
-
* @param args_1 iMode
|
|
244
|
+
* @param args_1 iMode PolyFillMode.ALTERNATE(自相交区域交替镂空)/
|
|
245
245
|
* WINDING(非零环绕,自相交区域整体实心) */
|
|
246
246
|
export const SetPolyFillMode = /*@__PURE__*/ b('SetPolyFillMode', '<HDC>ptr! i32@PolyFillMode -> i32');
|
|
247
247
|
/** 设置前景画笔与目的像素的混合方式(二元光栅模式);
|
|
248
248
|
* R2_XORPEN 可逆(同路径画两次抵消原样),适合橡皮筋交互
|
|
249
249
|
* @returns 旧值(默认 R2_COPYPEN = 直接画)
|
|
250
250
|
* @param args_0 hdc 目标 DC
|
|
251
|
-
* @param args_1 iMode
|
|
251
|
+
* @param args_1 iMode RasterMode.R2_COPYPEN / R2_XORPEN / R2_NOT 等(单选,标 @ 枚举) */
|
|
252
252
|
export const SetROP2 = /*@__PURE__*/ b('SetROP2', '<HDC>ptr! i32@RasterMode -> i32');
|
|
253
253
|
/** 设置弧/弦/扇形的扫过方向
|
|
254
254
|
* @returns 旧值(新 DC 默认逆时针)
|
|
255
255
|
* @param args_0 hdc 目标 DC
|
|
256
|
-
* @param args_1 iDir
|
|
256
|
+
* @param args_1 iDir ArcDirection.COUNTERCLOCKWISE(默认)/ CLOCKWISE */
|
|
257
257
|
export const SetArcDirection = /*@__PURE__*/ b('SetArcDirection', '<HDC>ptr! i32@ArcDirection -> i32');
|
|
258
258
|
/** 读弧扫过方向
|
|
259
259
|
* @returns AD_COUNTERCLOCKWISE=1 / AD_CLOCKWISE=2;失败 → 0 */
|
|
@@ -358,10 +358,10 @@ export const Pie = /*@__PURE__*/ b('Pie', '<HDC>ptr! i32 i32 i32 i32 i32 i32 i32
|
|
|
358
358
|
* @param args_4 c 字符数(= str.length;C 要字符数不是字节数,不含 NUL) */
|
|
359
359
|
export const TextOut = /*@__PURE__*/ b('TextOutW', '<HDC>ptr! i32 i32 <WCHAR>ptr i32 -> i32');
|
|
360
360
|
/** 设置 TextOut/ExtTextOut 的对齐与当前位置更新方式;TA_* 按位组合
|
|
361
|
-
* (如
|
|
361
|
+
* (如 TextAlign.TA_CENTER | TextAlign.TA_UPDATECP),故签名保持 u32 不标枚举
|
|
362
362
|
* @returns 旧 flags(新 DC 默认 TA_LEFT|TA_TOP|TA_NOUPDATECP = 0)
|
|
363
363
|
* @param args_0 hdc 目标 DC
|
|
364
|
-
* @param args_1 fMode
|
|
364
|
+
* @param args_1 fMode TextAlign 成员按位或 */
|
|
365
365
|
export const SetTextAlign = /*@__PURE__*/ b('SetTextAlign', '<HDC>ptr! u32 -> u32');
|
|
366
366
|
/** 按当前字体量字符串宽高(不含衬底与额外间距)
|
|
367
367
|
* @returns 成功 → 非 0
|
|
@@ -382,7 +382,7 @@ export const GetTextMetrics = /*@__PURE__*/ b('GetTextMetricsW', '<HDC>ptr! <TEX
|
|
|
382
382
|
* @param args_0 hdc 目标 DC
|
|
383
383
|
* @param args_1 x 起点 x
|
|
384
384
|
* @param args_2 y 起点 y
|
|
385
|
-
* @param args_3 fOptions
|
|
385
|
+
* @param args_3 fOptions TextOutOptions.ETO_OPAQUE(矩形填衬底)|
|
|
386
386
|
* ETO_CLIPPED(矩形裁剪字形)按位或(可 0 = 都不用)
|
|
387
387
|
* @param args_4 lprc ETO_OPAQUE/ETO_CLIPPED 的作用矩形:DeepPartial 对象直传 /
|
|
388
388
|
* RECT.alloc().ptr / NULL = 整个当前可裁剪区(有 encoder 的纯入参位三形态)
|
package/lib/windows/gdi32.ts
CHANGED
|
@@ -15,7 +15,7 @@ const b = <const S extends string, const LE extends CodecMap = {}>(name: string,
|
|
|
15
15
|
|
|
16
16
|
// 点数组编解码对(Polyline/Polygon/PlgBlt 共享):注册后 <POINT>ptr 位收元素数组
|
|
17
17
|
// (值域由 encoder 推导),C 侧 NULL 位传 NULL(number 直通),[]/单对象 fail-loud
|
|
18
|
-
const POINTArr = structArray(POINT)
|
|
18
|
+
const POINTArr = /*@__PURE__*/ structArray(POINT)
|
|
19
19
|
|
|
20
20
|
/** 创建实心画刷;配对 DeleteObject
|
|
21
21
|
* @returns 失败 → 0
|
|
@@ -77,7 +77,7 @@ export const SelectObject = /*@__PURE__*/ b('SelectObject', '<HDC>ptr! <HGDIOBJ>
|
|
|
77
77
|
* @param args_5 hdcSrc 源 DC
|
|
78
78
|
* @param args_6 x1 源起始 x
|
|
79
79
|
* @param args_7 y1 源起始 y
|
|
80
|
-
* @param args_8 dwRop
|
|
80
|
+
* @param args_8 dwRop RasterOp.SRCCOPY 等互斥单选光栅操作码(标 @ 枚举拦手误值) */
|
|
81
81
|
// hdcDest 非空(!);hdcSrc 在 PATCOPY 等特定 rop 下 C 允许 NULL,保持可空档。
|
|
82
82
|
export const BitBlt = /*@__PURE__*/ b('BitBlt', '<HDC>ptr! i32 i32 i32 i32 <HDC>ptr i32 i32 u32@RasterOp -> i32')
|
|
83
83
|
/** 取位图像素到 lpvBits(lpbmi 为 BITMAPINFO,32bpp BI_RGB 无颜色表时头部即全部:
|
|
@@ -109,7 +109,7 @@ export const DeleteDC = /*@__PURE__*/ b('DeleteDC', '<HDC>ptr! -> i32')
|
|
|
109
109
|
* @param args_2 y 左上角 y
|
|
110
110
|
* @param args_3 w 宽度
|
|
111
111
|
* @param args_4 h 高度
|
|
112
|
-
* @param args_5 rop
|
|
112
|
+
* @param args_5 rop RasterOp.PATCOPY / WHITENESS 等互斥单选光栅操作码 */
|
|
113
113
|
export const PatBlt = /*@__PURE__*/ b('PatBlt', '<HDC>ptr! i32 i32 i32 i32 u32@RasterOp -> i32')
|
|
114
114
|
/** 拉伸位图传送(源区 wSrc×hSrc 放/缩到目标 wDest×hDest)
|
|
115
115
|
* @returns 成功 → 非 0
|
|
@@ -123,16 +123,16 @@ export const PatBlt = /*@__PURE__*/ b('PatBlt', '<HDC>ptr! i32 i32 i32 i32 u32@R
|
|
|
123
123
|
* @param args_7 ySrc 源区左上 y
|
|
124
124
|
* @param args_8 wSrc 源区宽
|
|
125
125
|
* @param args_9 hSrc 源区高
|
|
126
|
-
* @param args_10 dwRop
|
|
126
|
+
* @param args_10 dwRop RasterOp.SRCCOPY 等互斥单选光栅操作码 */
|
|
127
127
|
export const StretchBlt = /*@__PURE__*/ b('StretchBlt',
|
|
128
128
|
'<HDC>ptr! i32 i32 i32 i32 <HDC>ptr i32 i32 i32 i32 u32@RasterOp -> i32')
|
|
129
129
|
/** 设置拉伸取色模式;放大时各模式像素同为源色,缩小时降采样策略不同
|
|
130
130
|
* (DELETESCANS 丢行 / HALFTONE 平均取色最保真)
|
|
131
131
|
* @returns 旧值
|
|
132
132
|
* @param args_0 hdc 目标 DC
|
|
133
|
-
* @param args_1 iMode
|
|
133
|
+
* @param args_1 iMode StretchBltMode.ANDSCANS(1) / ORSCANS(2) / DELETESCANS(3) / HALFTONE(4) */
|
|
134
134
|
export const SetStretchBltMode = /*@__PURE__*/ b('SetStretchBltMode', '<HDC>ptr! i32@StretchBltMode -> i32')
|
|
135
|
-
/** 读拉伸取色模式(值域 =
|
|
135
|
+
/** 读拉伸取色模式(值域 = StretchBltMode 成员);回传
|
|
136
136
|
* SetStretchBltMode 前需按成员值使用(裸 number 进不了枚举位)
|
|
137
137
|
* @returns number */
|
|
138
138
|
export const GetStretchBltMode = /*@__PURE__*/ b('GetStretchBltMode', '<HDC>ptr! -> i32')
|
|
@@ -202,7 +202,7 @@ export const SetDIBitsToDevice = /*@__PURE__*/ b('SetDIBitsToDevice',
|
|
|
202
202
|
* @param args_9 lpvBits 像素缓冲(ArrayBuffer)
|
|
203
203
|
* @param args_10 lpbmi BITMAPINFO 缓冲(BITMAPINFOHEADER.encode({...}).ptr)
|
|
204
204
|
* @param args_11 iUsage DIB_RGB_COLORS(0)
|
|
205
|
-
* @param args_12 rop
|
|
205
|
+
* @param args_12 rop RasterOp.SRCCOPY 等互斥单选光栅操作码 */
|
|
206
206
|
export const StretchDIBits = /*@__PURE__*/ b('StretchDIBits',
|
|
207
207
|
'<HDC>ptr! i32 i32 i32 i32 i32 i32 i32 i32 <BYTE>ptr <BYTE>ptr u32 u32@RasterOp -> i32')
|
|
208
208
|
|
|
@@ -211,13 +211,13 @@ export const StretchDIBits = /*@__PURE__*/ b('StretchDIBits',
|
|
|
211
211
|
/** 取系统共享对象(笔/刷/字体/调色板);共享句柄不要 DeleteObject——
|
|
212
212
|
* SelectObject 选入 hdc 生效(如 NULL_BRUSH 让形状只描边不填充)
|
|
213
213
|
* @returns 失败 → 0
|
|
214
|
-
* @param args_0 iObject
|
|
214
|
+
* @param args_0 iObject StockObject.NULL_BRUSH / BLACK_PEN / DEFAULT_GUI_FONT 等 */
|
|
215
215
|
export const GetStockObject = /*@__PURE__*/ b('GetStockObject', 'i32@StockObject -> <HGDIOBJ>ptr')
|
|
216
216
|
|
|
217
217
|
/** 创建网格纹理画刷(线色 = crColor,间隙 = 背景:SetBkMode=TRANSPARENT 透底、OPAQUE
|
|
218
218
|
* 用 SetBkColor);配对 DeleteObject
|
|
219
219
|
* @returns 失败 → 0
|
|
220
|
-
* @param args_0 iHatch
|
|
220
|
+
* @param args_0 iHatch HatchStyle.HORIZONTAL(横线)/ VERTICAL / FDIAGONAL /
|
|
221
221
|
* BDIAGONAL / CROSS / DIAGCROSS
|
|
222
222
|
* @param args_1 crColor 纹理线颜色 0x00BBGGRR */
|
|
223
223
|
export const CreateHatchBrush = /*@__PURE__*/ b('CreateHatchBrush', 'i32@HatchStyle u32 -> <HGDIOBJ>ptr')
|
|
@@ -230,14 +230,14 @@ export const CreatePatternBrush = /*@__PURE__*/ b('CreatePatternBrush', '<HGDIOB
|
|
|
230
230
|
|
|
231
231
|
/** 创建画笔(选入 hdc 生效,SelectObject 选回旧对象后 DeleteObject 配对)
|
|
232
232
|
* @returns 失败 → 0
|
|
233
|
-
* @param args_0 iStyle 笔型(
|
|
233
|
+
* @param args_0 iStyle 笔型(PenStyle.SOLID / DASH / NULL 等)
|
|
234
234
|
* @param args_1 cWidth 笔宽(像素;>1 的几何宽设备相关,虚线样式可能被拉伸)
|
|
235
235
|
* @param args_2 crColor 笔色 0x00BBGGRR */
|
|
236
236
|
export const CreatePen = /*@__PURE__*/ b('CreatePen', 'i32@PenStyle i32 u32 -> <HGDIOBJ>ptr')
|
|
237
237
|
/** 设置文字/阴影背景填充模式
|
|
238
238
|
* @returns 旧模式(新建 DC 默认 OPAQUE)
|
|
239
239
|
* @param args_0 hdc 目标 DC
|
|
240
|
-
* @param args_1 iBkMode
|
|
240
|
+
* @param args_1 iBkMode BackgroundMode.OPAQUE(衬底填充)/ TRANSPARENT(透明) */
|
|
241
241
|
export const SetBkMode = /*@__PURE__*/ b('SetBkMode', '<HDC>ptr! i32@BackgroundMode -> i32')
|
|
242
242
|
/** 设置文字颜色
|
|
243
243
|
* @returns 旧 COLORREF(0x00BBGGRR)
|
|
@@ -262,19 +262,19 @@ export const RestoreDC = /*@__PURE__*/ b('RestoreDC', '<HDC>ptr! i32 -> i32')
|
|
|
262
262
|
/** 设置多边形填充规则
|
|
263
263
|
* @returns 旧值(新建 DC 默认 ALTERNATE = 奇偶规则)
|
|
264
264
|
* @param args_0 hdc 目标 DC
|
|
265
|
-
* @param args_1 iMode
|
|
265
|
+
* @param args_1 iMode PolyFillMode.ALTERNATE(自相交区域交替镂空)/
|
|
266
266
|
* WINDING(非零环绕,自相交区域整体实心) */
|
|
267
267
|
export const SetPolyFillMode = /*@__PURE__*/ b('SetPolyFillMode', '<HDC>ptr! i32@PolyFillMode -> i32')
|
|
268
268
|
/** 设置前景画笔与目的像素的混合方式(二元光栅模式);
|
|
269
269
|
* R2_XORPEN 可逆(同路径画两次抵消原样),适合橡皮筋交互
|
|
270
270
|
* @returns 旧值(默认 R2_COPYPEN = 直接画)
|
|
271
271
|
* @param args_0 hdc 目标 DC
|
|
272
|
-
* @param args_1 iMode
|
|
272
|
+
* @param args_1 iMode RasterMode.R2_COPYPEN / R2_XORPEN / R2_NOT 等(单选,标 @ 枚举) */
|
|
273
273
|
export const SetROP2 = /*@__PURE__*/ b('SetROP2', '<HDC>ptr! i32@RasterMode -> i32')
|
|
274
274
|
/** 设置弧/弦/扇形的扫过方向
|
|
275
275
|
* @returns 旧值(新 DC 默认逆时针)
|
|
276
276
|
* @param args_0 hdc 目标 DC
|
|
277
|
-
* @param args_1 iDir
|
|
277
|
+
* @param args_1 iDir ArcDirection.COUNTERCLOCKWISE(默认)/ CLOCKWISE */
|
|
278
278
|
export const SetArcDirection = /*@__PURE__*/ b('SetArcDirection', '<HDC>ptr! i32@ArcDirection -> i32')
|
|
279
279
|
/** 读弧扫过方向
|
|
280
280
|
* @returns AD_COUNTERCLOCKWISE=1 / AD_CLOCKWISE=2;失败 → 0 */
|
|
@@ -383,10 +383,10 @@ export const Pie = /*@__PURE__*/ b('Pie', '<HDC>ptr! i32 i32 i32 i32 i32 i32 i32
|
|
|
383
383
|
* @param args_4 c 字符数(= str.length;C 要字符数不是字节数,不含 NUL) */
|
|
384
384
|
export const TextOut = /*@__PURE__*/ b('TextOutW', '<HDC>ptr! i32 i32 <WCHAR>ptr i32 -> i32')
|
|
385
385
|
/** 设置 TextOut/ExtTextOut 的对齐与当前位置更新方式;TA_* 按位组合
|
|
386
|
-
* (如
|
|
386
|
+
* (如 TextAlign.TA_CENTER | TextAlign.TA_UPDATECP),故签名保持 u32 不标枚举
|
|
387
387
|
* @returns 旧 flags(新 DC 默认 TA_LEFT|TA_TOP|TA_NOUPDATECP = 0)
|
|
388
388
|
* @param args_0 hdc 目标 DC
|
|
389
|
-
* @param args_1 fMode
|
|
389
|
+
* @param args_1 fMode TextAlign 成员按位或 */
|
|
390
390
|
export const SetTextAlign = /*@__PURE__*/ b('SetTextAlign', '<HDC>ptr! u32 -> u32')
|
|
391
391
|
/** 按当前字体量字符串宽高(不含衬底与额外间距)
|
|
392
392
|
* @returns 成功 → 非 0
|
|
@@ -409,7 +409,7 @@ export const GetTextMetrics = /*@__PURE__*/ b('GetTextMetricsW',
|
|
|
409
409
|
* @param args_0 hdc 目标 DC
|
|
410
410
|
* @param args_1 x 起点 x
|
|
411
411
|
* @param args_2 y 起点 y
|
|
412
|
-
* @param args_3 fOptions
|
|
412
|
+
* @param args_3 fOptions TextOutOptions.ETO_OPAQUE(矩形填衬底)|
|
|
413
413
|
* ETO_CLIPPED(矩形裁剪字形)按位或(可 0 = 都不用)
|
|
414
414
|
* @param args_4 lprc ETO_OPAQUE/ETO_CLIPPED 的作用矩形:DeepPartial 对象直传 /
|
|
415
415
|
* RECT.alloc().ptr / NULL = 整个当前可裁剪区(有 encoder 的纯入参位三形态)
|