📄 scrollbar.txt
字号:
ENDP
AREA ||i.SCROLLBAR_SetState||, CODE, READONLY, ALIGN=1
SCROLLBAR_SetState PROC
;;;598 */
;;;599 void SCROLLBAR_SetState (SCROLLBAR_Handle hObj, const WM_SCROLL_STATE* pState) {
000000 b570 PUSH {r4-r6,lr}
000002 0005 MOVS r5,r0
000004 460c MOV r4,r1
;;;600 if (hObj) {
000006 d00d BEQ |L7.36|
;;;601 SCROLLBAR_SetPageSize(hObj, pState->PageSize);
000008 4628 MOV r0,r5
00000a 68a1 LDR r1,[r4,#8]
00000c f7fffffe BL SCROLLBAR_SetPageSize
;;;602 SCROLLBAR_SetNumItems(hObj, pState->NumItems);
000010 4628 MOV r0,r5
000012 6821 LDR r1,[r4,#0]
000014 f7fffffe BL SCROLLBAR_SetNumItems
;;;603 SCROLLBAR_SetValue (hObj, pState->v);
000018 4628 MOV r0,r5
00001a 6861 LDR r1,[r4,#4]
00001c e8bd4070 POP {r4-r6,lr}
000020 f7ffbffe B.W SCROLLBAR_SetValue
|L7.36|
;;;604 }
;;;605 }
000024 bd70 POP {r4-r6,pc}
;;;606
ENDP
AREA ||i.SCROLLBAR_SetValue||, CODE, READONLY, ALIGN=1
SCROLLBAR_SetValue PROC
;;;535 */
;;;536 void SCROLLBAR_SetValue(SCROLLBAR_Handle hObj, int v) {
000000 b570 PUSH {r4-r6,lr}
000002 0005 MOVS r5,r0
000004 460c MOV r4,r1
;;;537 SCROLLBAR_Obj* pObj;
;;;538 int Max;
;;;539 if (hObj) {
000006 d01a BEQ |L8.62|
;;;540 WM_LOCK();
;;;541 pObj = SCROLLBAR_H2P(hObj);
000008 4628 MOV r0,r5
00000a f7fffffe BL GUI_ALLOC_h2p
;;;542 Max = pObj->NumItems - pObj->PageSize;
00000e 6c02 LDR r2,[r0,#0x40]
000010 6b81 LDR r1,[r0,#0x38]
000012 1a89 SUBS r1,r1,r2
;;;543 if (Max < 0)
000014 d500 BPL |L8.24|
;;;544 Max =0;
000016 2100 MOVS r1,#0
|L8.24|
;;;545 /* Put in min/max range */
;;;546 if (v < 0) {
000018 2c00 CMP r4,#0
00001a da00 BGE |L8.30|
;;;547 v = 0;
00001c 2400 MOVS r4,#0
|L8.30|
;;;548 }
;;;549 if (v > Max) {
00001e 428c CMP r4,r1
000020 dd00 BLE |L8.36|
;;;550 v = Max;
000022 460c MOV r4,r1
|L8.36|
;;;551 }
;;;552 if (pObj->v != v) {
000024 6bc1 LDR r1,[r0,#0x3c]
000026 42a1 CMP r1,r4
000028 d009 BEQ |L8.62|
;;;553 pObj->v = v;
;;;554 WM_InvalidateWindow(hObj);
00002a 63c4 STR r4,[r0,#0x3c]
00002c 4628 MOV r0,r5
00002e f7fffffe BL WM_InvalidateWindow
;;;555 WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
000032 4628 MOV r0,r5
000034 e8bd4070 POP {r4-r6,lr}
000038 2105 MOVS r1,#5
00003a f7ffbffe B.W WM_NotifyParent
|L8.62|
;;;556 }
;;;557 WM_UNLOCK();
;;;558 }
;;;559 }
00003e bd70 POP {r4-r6,pc}
;;;560
ENDP
AREA ||i.SCROLLBAR__InvalidatePartner||, CODE, READONLY, ALIGN=1
SCROLLBAR__InvalidatePartner PROC
;;;380 */
;;;381 void SCROLLBAR__InvalidatePartner(SCROLLBAR_Handle hObj) { /* Invalidate the partner, since it is also affected */
000000 b510 PUSH {r4,lr}
000002 4604 MOV r4,r0
;;;382 WM_InvalidateWindow(WM_GetScrollPartner(hObj));
000004 f7fffffe BL WM_GetScrollPartner
000008 f7fffffe BL WM_InvalidateWindow
;;;383 WM_SendMessageNoPara(WM_GetParent(hObj), WM_NOTIFY_CLIENTCHANGE); /* Client area may have changed */
00000c 4620 MOV r0,r4
00000e f7fffffe BL WM_GetParent
000012 e8bd4010 POP {r4,lr}
000016 2125 MOVS r1,#0x25
000018 f7ffbffe B.W WM_SendMessageNoPara
;;;384 }
;;;385
ENDP
AREA ||i._CalcPositions||, CODE, READONLY, ALIGN=1
_CalcPositions PROC
;;;124 */
;;;125 static void _CalcPositions(SCROLLBAR_Obj* pObj, SCROLLBAR_POSITIONS* pPos) {
000000 e92d47ff PUSH {r0-r10,lr}
000004 4604 MOV r4,r0
000006 460d MOV r5,r1
;;;126 int xSizeArrow, xSize, xSizeMoveable, ThumbSize, NumItems, xSizeThumbArea;
;;;127 WM_HWIN hWin;
;;;128 GUI_RECT r, rSub;
;;;129 int x0, y0;
;;;130 r = pObj->Widget.Win.Rect;
000008 6861 LDR r1,[r4,#4]
00000a 6800 LDR r0,[r0,#0]
;;;131 x0 = r.x0;
00000c e9cd0102 STRD r0,r1,[sp,#8]
;;;132 y0 = r.y0;
;;;133 pPos->x1 = (pObj->Widget.State & WIDGET_STATE_VERTICAL) ? r.y1 : r.x1;
000010 8ce1 LDRH r1,[r4,#0x26]
000012 f9bd6008 LDRSH r6,[sp,#8] ;131
000016 f9bd700a LDRSH r7,[sp,#0xa] ;132
00001a f9bd000e LDRSH r0,[sp,#0xe]
00001e 0709 LSLS r1,r1,#28
000020 d401 BMI |L10.38|
000022 f9bd000c LDRSH r0,[sp,#0xc]
|L10.38|
;;;134 /* Subtract the rectangle of the other scrollbar (if existing and visible) */
;;;135 if (pObj->Widget.Id == GUI_ID_HSCROLL) {
000026 61a8 STR r0,[r5,#0x18]
000028 8ca0 LDRH r0,[r4,#0x24]
00002a 28ff CMP r0,#0xff
00002c d112 BNE |L10.84|
;;;136 hWin = WM_GetScrollbarV(pObj->Widget.Win.hParent);
00002e f9b40016 LDRSH r0,[r4,#0x16]
000032 f7fffffe BL WM_GetScrollbarV
;;;137 if (hWin) {
000036 b168 CBZ r0,|L10.84|
;;;138 WM_GetWindowRectEx(hWin, &rSub);
000038 4669 MOV r1,sp
00003a f7fffffe BL WM_GetWindowRectEx
;;;139 if (r.x1 == rSub.x1) {
00003e f9bd000c LDRSH r0,[sp,#0xc]
000042 f9bd1004 LDRSH r1,[sp,#4]
000046 4288 CMP r0,r1
000048 d104 BNE |L10.84|
;;;140 r.x1 = rSub.x0 -1;
00004a f8bd0000 LDRH r0,[sp,#0]
00004e 1e40 SUBS r0,r0,#1
000050 f8ad000c STRH r0,[sp,#0xc]
|L10.84|
;;;141 }
;;;142 }
;;;143 }
;;;144 if (pObj->Widget.Id == GUI_ID_VSCROLL) {
000054 8ca0 LDRH r0,[r4,#0x24]
000056 28fe CMP r0,#0xfe
000058 d112 BNE |L10.128|
;;;145 hWin = WM_GetScrollbarH(pObj->Widget.Win.hParent);
00005a f9b40016 LDRSH r0,[r4,#0x16]
00005e f7fffffe BL WM_GetScrollbarH
;;;146 if (hWin) {
000062 b168 CBZ r0,|L10.128|
;;;147 WM_GetWindowRectEx(hWin, &rSub);
000064 4669 MOV r1,sp
000066 f7fffffe BL WM_GetWindowRectEx
;;;148 if (r.y1 == rSub.y1) {
00006a f9bd000e LDRSH r0,[sp,#0xe]
00006e f9bd1006 LDRSH r1,[sp,#6]
000072 4288 CMP r0,r1
000074 d104 BNE |L10.128|
;;;149 r.y1 = rSub.y0 -1;
000076 f8bd0002 LDRH r0,[sp,#2]
00007a 1e40 SUBS r0,r0,#1
00007c f8ad000e STRH r0,[sp,#0xe]
|L10.128|
;;;150 }
;;;151 }
;;;152 }
;;;153 /* Convert coordinates of this window */
;;;154 GUI_MoveRect(&r, -x0, -y0);
000080 427a RSBS r2,r7,#0
000082 4271 RSBS r1,r6,#0
000084 a802 ADD r0,sp,#8
000086 f7fffffe BL GUI_MoveRect
00008a 8ce0 LDRH r0,[r4,#0x26]
00008c 0700 LSLS r0,r0,#28
00008e d517 BPL |L10.192|
000090 88a0 LDRH r0,[r4,#4]
000092 8823 LDRH r3,[r4,#0]
000094 f8bd1008 LDRH r1,[sp,#8]
000098 1ac0 SUBS r0,r0,r3
00009a 1c40 ADDS r0,r0,#1
00009c f8bd200c LDRH r2,[sp,#0xc]
0000a0 f8bd300a LDRH r3,[sp,#0xa]
0000a4 1a41 SUBS r1,r0,r1
0000a6 f8ad3008 STRH r3,[sp,#8]
0000aa 1e49 SUBS r1,r1,#1
0000ac f8bd300e LDRH r3,[sp,#0xe]
0000b0 1a80 SUBS r0,r0,r2
0000b2 f8ad300c STRH r3,[sp,#0xc]
0000b6 1e40 SUBS r0,r0,#1
0000b8 f8ad100e STRH r1,[sp,#0xe]
0000bc f8ad000a STRH r0,[sp,#0xa]
|L10.192|
;;;155 /* Convert real into virtual coordinates */
;;;156 _WIDGET__RECT2VRECT(&pObj->Widget, &r);
;;;157 NumItems = pObj->NumItems;
;;;158 xSize = r.x1 - r.x0 + 1;
0000c0 f9bd000c LDRSH r0,[sp,#0xc]
0000c4 f9bd1008 LDRSH r1,[sp,#8]
0000c8 f8d4a038 LDR r10,[r4,#0x38]
0000cc 1a40 SUBS r0,r0,r1
0000ce f1000901 ADD r9,r0,#1
0000d2 4620 MOV r0,r4
0000d4 f7fffffe BL WIDGET__GetXSize
0000d8 4607 MOV r7,r0
0000da 4620 MOV r0,r4
0000dc f7fffffe BL WIDGET__GetYSize
0000e0 2105 MOVS r1,#5
0000e2 eb010650 ADD r6,r1,r0,LSR #1
0000e6 1f78 SUBS r0,r7,#5
0000e8 4286 CMP r6,r0
0000ea d900 BLS |L10.238|
0000ec 1f7e SUBS r6,r7,#5
|L10.238|
;;;159 xSizeArrow = _GetArrowSize(pObj);
;;;160 xSizeThumbArea= xSize - 2 * xSizeArrow; /* Number of pixels available for thumb and movement */
0000ee 4271 RSBS r1,r6,#0
0000f0 eb090741 ADD r7,r9,r1,LSL #1
;;;161 ThumbSize = GUI__DivideRound(xSizeThumbArea * pObj->PageSize, NumItems);
0000f4 6c20 LDR r0,[r4,#0x40]
0000f6 46b0 MOV r8,r6 ;159
0000f8 4378 MULS r0,r7,r0
0000fa 4651 MOV r1,r10
0000fc f7fffffe BL GUI__DivideRound
000100 4606 MOV r6,r0
;;;162 if (ThumbSize < 4) {
000102 2804 CMP r0,#4
000104 da00 BGE |L10.264|
;;;163 ThumbSize = 4;
000106 2604 MOVS r6,#4
|L10.264|
;;;164 }
;;;165 if (ThumbSize > xSizeThumbArea) {
000108 42be CMP r6,r7
00010a dd00 BLE |L10.270|
;;;166 ThumbSize = xSizeThumbArea;
00010c 463e MOV r6,r7
|L10.270|
;;;167 }
;;;168 xSizeMoveable = xSizeThumbArea - ThumbSize;
;;;169 pPos->x0_LeftArrow = r.x0;
00010e f9bd0008 LDRSH r0,[sp,#8]
;;;170 pPos->x1_LeftArrow = xSizeArrow - 1;
000112 6028 STR r0,[r5,#0]
000114 f1a80001 SUB r0,r8,#1
;;;171 pPos->x1_RightArrow = xSize - 1;
000118 6068 STR r0,[r5,#4]
00011a f1a90001 SUB r0,r9,#1
;;;172 pPos->x0_RightArrow = xSize - xSizeArrow;
00011e 6168 STR r0,[r5,#0x14]
000120 eba90008 SUB r0,r9,r8
;;;173 pPos->x0_Thumb = pPos->x1_LeftArrow + 1+ GUI__DivideRound(xSizeMoveable * pObj->v, NumItems - pObj->PageSize);
000124 6128 STR r0,[r5,#0x10]
000126 6c21 LDR r1,[r4,#0x40]
000128 6be0 LDR r0,[r4,#0x3c]
00012a 1bbf SUBS r7,r7,r6 ;168
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -