Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7452 | 0CodErr | 1 | .586 |
2 | .Model Flat, StdCall |
||
3 | Option CaseMap: None |
||
4 | |||
5 | Public EXPORTS |
||
6 | |||
7 | FALSE = 0 |
||
8 | TRUE = Not FALSE |
||
9 | |||
10 | CStr Macro QuotedText:VarArg |
||
11 | Local LocalText |
||
12 | .Const |
||
13 | LocalText db QuotedText,0 |
||
14 | .Code |
||
15 | ExitM |
||
16 | EndM |
||
17 | |||
18 | RepArg Macro Arg |
||
19 | Local NewStr |
||
20 | Quot SubStr |
||
21 | IfIdn Quot, <"> |
||
22 | .Data |
||
23 | NewStr db Arg,0 |
||
24 | .Code |
||
25 | ExitM |
||
26 | Else |
||
27 | ExitM |
||
28 | EndIf |
||
29 | EndM |
||
30 | |||
31 | @ Macro Function:Req, Args:VarArg |
||
32 | Arg equ |
||
33 | For Var, |
||
34 | Arg CatStr Arg, <, RepArg(Var)> |
||
35 | EndM |
||
36 | Arg |
||
37 | ExitM |
||
38 | EndM |
||
39 | |||
40 | TMem Struct |
||
41 | State Dword ? |
||
42 | Caption Dword ? |
||
43 | Prompt Dword ? |
||
44 | Default Dword ? |
||
45 | Flags Dword ? |
||
46 | Error Dword ? |
||
47 | Result Dword ? |
||
48 | TMem EndS |
||
49 | |||
50 | TEditBox Struct |
||
51 | x_size Dword ? |
||
52 | left SDword ? |
||
53 | top SDword ? |
||
54 | color Dword ? |
||
55 | shift_color Dword ? |
||
56 | focus_border_color Dword ? |
||
57 | blur_border_color Dword ? |
||
58 | text_color Dword ? |
||
59 | max Dword ? |
||
60 | text Dword ? |
||
61 | mouse_variable Dword ? |
||
62 | flags Dword ? |
||
63 | count Dword ? |
||
64 | pos Dword ? |
||
65 | offs Dword ? |
||
66 | cl_curs_x SWord ? |
||
67 | cl_curs_y SWord ? |
||
68 | shift Word ? |
||
69 | shift_old Word ? |
||
70 | height Dword ? |
||
71 | char_width Dword ? |
||
72 | TEditBox EndS |
||
73 | |||
74 | TStandartColors Struct |
||
75 | frames Dword ? |
||
76 | grab Dword ? |
||
77 | grab_button Dword ? |
||
78 | grab_button_text Dword ? |
||
79 | grab_text Dword ? |
||
80 | work Dword ? |
||
81 | work_button Dword ? |
||
82 | work_button_text Dword ? |
||
83 | work_text Dword ? |
||
84 | work_graph Dword ? |
||
85 | TStandartColors EndS |
||
86 | |||
87 | TRect Struct |
||
88 | Left SDword ? |
||
89 | Top SDword ? |
||
90 | Right SDword ? |
||
91 | Bottom SDword ? |
||
92 | TRect EndS |
||
93 | |||
94 | TBox Struct |
||
95 | Left SDword ? |
||
96 | Top SDword ? |
||
97 | SizeX Dword ? |
||
98 | SizeY Dword ? |
||
99 | TBox EndS |
||
100 | |||
101 | TSize Struct |
||
102 | SizeY Word ? |
||
103 | SizeX Word ? |
||
104 | TSize EndS |
||
105 | |||
106 | TLongPoint Struct |
||
107 | Y SDword ? |
||
108 | X SDword ? |
||
109 | TLongPoint EndS |
||
110 | |||
111 | TPoint Struct |
||
112 | Y SWord ? |
||
113 | X SWord ? |
||
114 | TPoint EndS |
||
115 | |||
116 | TKeyboardInput Struct |
||
117 | Flag Byte ? |
||
118 | Code Byte ? |
||
119 | Union |
||
120 | Scan Byte ? |
||
121 | Control Word ? |
||
122 | EndS |
||
123 | TKeyboardInput EndS |
||
124 | |||
125 | TButtonInput Struct |
||
126 | MouseButton Byte ? |
||
127 | ID Word ? |
||
128 | HiID Byte ? |
||
129 | TButtonInput EndS |
||
130 | |||
131 | TThreadInfo Struct |
||
132 | CpuUsage Dword ? |
||
133 | WinStackPos Word ? |
||
134 | reserved0 Word ? |
||
135 | reserved1 Word ? |
||
136 | ThreadName Byte 11 Dup (?) |
||
137 | reserved2 Byte ? |
||
138 | MemAddress Dword ? |
||
139 | MemUsage Dword ? |
||
140 | Identifier Dword ? |
||
141 | Window TBox <> |
||
142 | ThreadState Word ? |
||
143 | reserved3 Word ? |
||
144 | Client TBox <> |
||
145 | WindowState Byte ? |
||
146 | EventMask Dword ? |
||
147 | KeyboardMode Byte ? |
||
148 | reserved4 Byte 948 Dup (?) |
||
149 | TThreadInfo EndS |
||
150 | |||
151 | IfDef LANG_IT |
||
152 | szCancel equ |
||
153 | ElseIfDef LANG_SP |
||
154 | szCancel equ |
||
155 | ElseIfDef LANG_RU |
||
156 | szCancel equ |
||
157 | ElseIfDef LANG_EN |
||
158 | szCancel equ |
||
159 | Else |
||
160 | .Err LANG_?? |
||
161 | EndIf |
||
162 | |||
163 | WINDOW_BORDER_SIZE = 5 |
||
164 | |||
165 | ; Events |
||
166 | REDRAW_EVENT = 1 |
||
167 | KEY_EVENT = 2 |
||
168 | BUTTON_EVENT = 3 |
||
169 | BACKGROUND_EVENT = 5 |
||
170 | MOUSE_EVENT = 6 |
||
171 | IPC_EVENT = 7 |
||
172 | NETWORK_EVENT = 8 |
||
173 | DEBUG_EVENT = 9 |
||
174 | |||
175 | ; Window Style Constants |
||
176 | WS_SKINNED_FIXED = 4000000H |
||
177 | WS_COORD_CLIENT = 20000000H |
||
178 | WS_CAPTION = 10000000H |
||
179 | |||
180 | ; Caption Style Constants |
||
181 | CS_MOVABLE = 0 |
||
182 | |||
183 | ; Event Mask Constants |
||
184 | EM_REDRAW = 001H |
||
185 | EM_KEY = 002H |
||
186 | EM_BUTTON = 004H |
||
187 | EM_BACKGROUND = 010H |
||
188 | EM_MOUSE = 020H |
||
189 | EM_IPC = 040H |
||
190 | EM_NETWORK = 080H |
||
191 | EM_DEBUG = 100H |
||
192 | |||
193 | ; Draw zero terminated string for DrawText |
||
194 | DT_ZSTRING = 080000000H |
||
195 | |||
196 | ; Charset specifiers for DrawText |
||
197 | DT_CP866_8X16 = 10000000H |
||
198 | DT_CP866_6X9 = 00000000H |
||
199 | |||
200 | ; Button identifiers |
||
201 | BUTTON_CLOSE = 1 |
||
202 | BUTTON_OK = 10 |
||
203 | BUTTON_CANCEL = 20 |
||
204 | |||
205 | KEY_CODE_ENTER = 13 |
||
206 | KEY_CODE_ESCAPE = 27 |
||
207 | |||
208 | ; Flags = [mouse|screen|parent][number|string] |
||
209 | IBF_STRING = 0 ; в буфер будет записана строка ; string will be written to the buffer |
||
210 | IBF_NUMBER = 1 ; в буфер будет записано число ; number will be written to the buffer |
||
211 | IBF_MOUSE_REL = 0 ; относительно положения указателя мыши ; relative to the mouse pointer |
||
212 | IBF_SCREEN_REL = 8 ; относительно экрана ; relative to the screen |
||
213 | IBF_PARENT_REL = 16 ; относительно родительского окна ; relative to the parent window |
||
214 | |||
215 | ; Errors |
||
216 | IBE_NO_ERROR = 0 ; успешно, нет ошибки ; success |
||
217 | IBE_NUMBER_OVERFLOW = 1 ; переполнение при вводе числа ; number greater than 0xFFFFFFFFFFFFFFFF |
||
218 | IBE_RESULT_TOO_LONG = 2 ; результат не умещается в буфер ; result does not fit into buffer |
||
219 | |||
220 | EDIT1_TEXT_BUFFER_SIZE = 1000 |
||
221 | |||
222 | EditBoxDraw_proto TypeDef Proto :Ptr |
||
223 | EditBoxKey_proto TypeDef Proto :Ptr |
||
224 | EditBoxMouse_proto TypeDef Proto :Ptr |
||
225 | EditBoxSetText_proto TypeDef Proto :Ptr, :Ptr |
||
226 | |||
227 | EditBoxDraw_proc TypeDef Ptr EditBoxDraw_proto |
||
228 | EditBoxKey_proc TypeDef Ptr EditBoxKey_proto |
||
229 | EditBoxMouse_proc TypeDef Ptr EditBoxMouse_proto |
||
230 | EditBoxSetText_proc TypeDef Ptr EditBoxSetText_proto |
||
231 | |||
232 | InputBox Proto Buffer:Ptr, Caption:Ptr, Prompt:Ptr, Default:Ptr, Flags:Dword, BufferSize:Dword, RedrawProc:Ptr |
||
233 | |||
234 | ; -------------------------------------------------------- ; |
||
235 | .Data; --------------------------------------------------- ; |
||
236 | ; -------------------------------------------------------- ; |
||
237 | Edit1 TEditBox <\ |
||
238 | 0,\ |
||
239 | 5,\ |
||
240 | 26,\ |
||
241 | 00FFFFFFH,\ |
||
242 | 00A4C4E4H,\ |
||
243 | 0,\ |
||
244 | 0,\ |
||
245 | DT_CP866_8X16,\ |
||
246 | EDIT1_TEXT_BUFFER_SIZE,\ |
||
247 | Offset Edit1TextBuffer,\ |
||
248 | Offset Edit1MouseVariable,\ |
||
249 | 4002H,\ |
||
250 | 0,\ |
||
251 | 0,\ |
||
252 | 0,\ |
||
253 | 0,\ |
||
254 | 0,\ |
||
255 | 0,\ |
||
256 | 0\ |
||
257 | > |
||
258 | |||
259 | Mem Dword Offset InpuBox_Mem |
||
260 | |||
261 | FontHeight Dword 9 |
||
262 | |||
263 | Initialized db FALSE |
||
264 | |||
265 | ; -------------------------------------------------------- ; |
||
266 | .Data? ; ------------------------------------------------- ; |
||
267 | ; -------------------------------------------------------- ; |
||
268 | BoxLib Dword ? |
||
269 | |||
270 | EditBoxDraw EditBoxDraw_proc ? |
||
271 | EditBoxKey EditBoxKey_proc ? |
||
272 | EditBoxMouse EditBoxMouse_proc ? |
||
273 | EditBoxSetText EditBoxSetText_proc ? |
||
274 | |||
275 | SC TStandartColors <> |
||
276 | Window TBox <> |
||
277 | Screen TSize <> |
||
278 | |||
279 | Key TKeyboardInput <> |
||
280 | Button TButtonInput <> |
||
281 | |||
282 | Align 4 |
||
283 | ThreadInfo TThreadInfo <> |
||
284 | |||
285 | Align 4 |
||
286 | ParentThreadInfo TThreadInfo <> |
||
287 | |||
288 | Align 4 |
||
289 | Margin Dword ? |
||
290 | PromptPos TLongPoint <> |
||
291 | ButtonCancel TBox <> |
||
292 | ButtonOK TBox <> |
||
293 | |||
294 | WinCaption Dword ? |
||
295 | TextPrompt Dword ? |
||
296 | TextDefault Dword ? |
||
297 | TextOK Dword ? |
||
298 | TextCancel Dword ? |
||
299 | |||
300 | TextOKLeft Dword ? |
||
301 | TextOKTop Dword ? |
||
302 | TextCancelLeft Dword ? |
||
303 | TextCancelTop Dword ? |
||
304 | |||
305 | TextFlags Dword ? |
||
306 | |||
307 | FontWidth Dword ? |
||
308 | |||
309 | MousePos TPoint <> |
||
310 | |||
311 | ParentID Dword ? |
||
312 | ParentSlot Dword ? |
||
313 | |||
314 | Edit1MouseVariable Dword ? |
||
315 | |||
316 | Align 4 |
||
317 | Edit1TextBuffer Byte EDIT1_TEXT_BUFFER_SIZE + 2 Dup (?) ; buffer for Edit1.text |
||
318 | |||
319 | Align 4 |
||
320 | InpuBox_Mem Byte SizeOf(TMem) + SizeOf(Qword) Dup (?) |
||
321 | |||
322 | Align 4 |
||
323 | Byte 256 Dup (?) |
||
324 | InputBox_Thread_StackTop Label Dword |
||
325 | ; -------------------------------------------------------- ; |
||
326 | .Code ; -------------------------------------------------- ; |
||
327 | ; -------------------------------------------------------- ; |
||
328 | ; convert a string, which represents an signed integer to a number |
||
329 | ; if a number too large(greater than 0xFFFFFFFFFFFFFFFF) then return 0xFFFFFFFFFFFFFFFF and the CARRY flag |
||
330 | a2i Proc Uses ebx esi edi S:Ptr |
||
331 | Local LoDword:Dword, HiDword:Dword, Tmp:Dword |
||
332 | mov edi, 10 |
||
333 | mov esi, S |
||
334 | xor eax, eax |
||
335 | xor edx, edx |
||
336 | xor ebx, ebx |
||
337 | mov LoDword, eax |
||
338 | mov HiDword, eax |
||
339 | movzx ecx, Byte Ptr [esi] |
||
340 | inc esi |
||
341 | cmp cl, '-' |
||
342 | jne @no_sign |
||
343 | dec ebx |
||
344 | @next: |
||
345 | movzx ecx, Byte Ptr [esi] |
||
346 | inc esi |
||
347 | @no_sign: |
||
348 | sub cl, 48 |
||
349 | cmp cl, 9 |
||
350 | jnbe @done |
||
351 | mov eax, HiDword |
||
352 | mul edi ; multiply by 10 |
||
353 | jc @overflow ; CF flag are set if edx is not 0 |
||
354 | mov Tmp, eax |
||
355 | mov eax, LoDword |
||
356 | mul edi ; multiply by 10 |
||
357 | add edx, Tmp |
||
358 | jc @overflow |
||
359 | add eax, ecx |
||
360 | adc edx, 0 |
||
361 | mov LoDword, eax |
||
362 | mov HiDword, edx |
||
363 | jnc @next |
||
364 | @overflow: |
||
365 | mov eax, -1 ; RETURN 0xFFFFFFFFFFFFFFFF |
||
366 | mov edx, eax |
||
367 | jmp @exit |
||
368 | @done: |
||
369 | add eax, ebx |
||
370 | adc edx, ebx |
||
371 | xor eax, ebx |
||
372 | xor edx, ebx |
||
373 | @exit: |
||
374 | ret |
||
375 | a2i EndP |
||
376 | ; -------------------------------------------------------- ; |
||
377 | Align 4 |
||
378 | MemCpy Proc Uses esi edi Src:Ptr, Dst:Ptr, Count:Dword |
||
379 | mov edi, Dst |
||
380 | mov esi, Src |
||
381 | mov ecx, Count |
||
382 | mov edx, ecx |
||
383 | shr ecx, 2 |
||
384 | and edx, 3 |
||
385 | rep movsd |
||
386 | mov ecx, edx |
||
387 | rep movsb |
||
388 | ret |
||
389 | MemCpy EndP |
||
390 | ; -------------------------------------------------------- ; |
||
391 | Align 4 |
||
392 | StrLen Proc Uses edi Src:Ptr |
||
393 | mov edi, Src |
||
394 | mov ecx, 0FFFFFFFFH |
||
395 | xor al, al |
||
396 | repne scasb |
||
397 | mov eax, 0FFFFFFFEH |
||
398 | sub eax, ecx |
||
399 | ret |
||
400 | StrLen EndP |
||
401 | ; -------------------------------------------------------- ; |
||
402 | Align 4 |
||
403 | StrCpy Proc Uses esi edi Src:Ptr, Dst:Ptr |
||
404 | mov edi, Src |
||
405 | mov ecx, 0FFFFFFFFH |
||
406 | mov esi, edi |
||
407 | xor eax, eax |
||
408 | repne scasb |
||
409 | not ecx |
||
410 | mov edi, Dst |
||
411 | mov edx, ecx |
||
412 | shr ecx, 2 |
||
413 | and edx, 3 |
||
414 | rep movsd |
||
415 | mov ecx, edx |
||
416 | rep movsb |
||
417 | mov eax, edi |
||
418 | ret |
||
419 | StrCpy EndP |
||
420 | ; -------------------------------------------------------- ; |
||
421 | Align 4 |
||
422 | GetThreadInfo Proc Uses ebx Slot:Dword, Buffer: Ptr TThreadInfo |
||
423 | mov eax, 9 |
||
424 | mov ebx, Buffer |
||
425 | mov ecx, Slot |
||
426 | int 64 |
||
427 | ret |
||
428 | GetThreadInfo EndP |
||
429 | ; -------------------------------------------------------- ; |
||
430 | Align 4 |
||
431 | ActivateWindow Proc Uses ebx Slot:Dword |
||
432 | mov eax, 18 |
||
433 | mov ebx, 3 |
||
434 | mov ecx, Slot |
||
435 | int 64 |
||
436 | ret |
||
437 | ActivateWindow EndP |
||
438 | ; -------------------------------------------------------- ; |
||
439 | Align 4 |
||
440 | GetSlotById Proc Uses ebx ID:Dword |
||
441 | mov eax, 18 |
||
442 | mov ebx, 21 |
||
443 | mov ecx, ID |
||
444 | int 64 |
||
445 | ret |
||
446 | GetSlotById EndP |
||
447 | ; -------------------------------------------------------- ; |
||
448 | Align 4 |
||
449 | SetEventMask Proc Uses ebx EventMask:Dword |
||
450 | mov eax, 40 |
||
451 | mov ebx, EventMask |
||
452 | int 64 |
||
453 | ret |
||
454 | SetEventMask EndP |
||
455 | ; -------------------------------------------------------- ; |
||
456 | Align 4 |
||
457 | WaitEvent Proc |
||
458 | mov eax, 10 |
||
459 | int 64 |
||
460 | ret |
||
461 | WaitEvent EndP |
||
462 | ; -------------------------------------------------------- ; |
||
463 | Align 4 |
||
464 | GetButton Proc |
||
465 | mov eax, 17 |
||
466 | int 64 |
||
467 | ret |
||
468 | GetButton EndP |
||
469 | ; -------------------------------------------------------- ; |
||
470 | Align 4 |
||
471 | GetKey Proc |
||
472 | mov eax, 2 |
||
473 | int 64 |
||
474 | ret |
||
475 | GetKey EndP |
||
476 | ; -------------------------------------------------------- ; |
||
477 | Align 4 |
||
478 | BeginDraw Proc |
||
479 | push ebx |
||
480 | mov eax, 12 |
||
481 | mov ebx, 1 |
||
482 | int 64 |
||
483 | pop ebx |
||
484 | ret |
||
485 | BeginDraw EndP |
||
486 | ; -------------------------------------------------------- ; |
||
487 | Align 4 |
||
488 | EndDraw Proc |
||
489 | push ebx |
||
490 | mov eax, 12 |
||
491 | mov ebx, 2 |
||
492 | int 64 |
||
493 | pop ebx |
||
494 | ret |
||
495 | EndDraw EndP |
||
496 | ; -------------------------------------------------------- ; |
||
497 | Align 4 |
||
498 | DrawWindow Proc Left:SDword, Top:SDword, Right:SDword, Bottom:SDword, Caption:Ptr, BackColor:Dword, Style:Dword, CapStyle:Dword |
||
499 | push ebx |
||
500 | push edi |
||
501 | push esi |
||
502 | xor eax, eax |
||
503 | mov ebx, Left |
||
504 | mov ecx, Top |
||
505 | shl ebx, 16 |
||
506 | shl ecx, 16 |
||
507 | or ebx, Right |
||
508 | or ecx, Bottom |
||
509 | mov edx, Style |
||
510 | or edx, BackColor |
||
511 | mov edi, Caption |
||
512 | mov esi, CapStyle |
||
513 | int 64 |
||
514 | pop esi |
||
515 | pop edi |
||
516 | pop ebx |
||
517 | ret |
||
518 | DrawWindow EndP |
||
519 | ; -------------------------------------------------------- ; |
||
520 | Align 4 |
||
521 | ThreadTerminate Proc |
||
522 | mov eax, 0FFFFFFFFH |
||
523 | int 64 |
||
524 | ret |
||
525 | ThreadTerminate EndP |
||
526 | ; -------------------------------------------------------- ; |
||
527 | Align 4 |
||
528 | LoadLibrary Proc Path:Ptr |
||
529 | push ebx |
||
530 | mov eax, 68 |
||
531 | mov ebx, 19 |
||
532 | mov ecx, Path |
||
533 | int 64 |
||
534 | pop ebx |
||
535 | ret |
||
536 | LoadLibrary EndP |
||
537 | ; -------------------------------------------------------- ; |
||
538 | Align 4 |
||
539 | GetProcAddress Proc hLib:Ptr, ProcName:Ptr |
||
540 | push esi |
||
541 | push edi |
||
542 | push ebx |
||
543 | mov edx, hLib |
||
544 | xor eax, eax |
||
545 | test edx, edx |
||
546 | jz @end |
||
547 | mov edi, ProcName |
||
548 | mov ecx, 0FFFFFFFFH |
||
549 | repne scasb |
||
550 | mov ebx, ecx |
||
551 | not ebx |
||
552 | @next: |
||
553 | mov esi, [edx] |
||
554 | test esi, esi |
||
555 | jz @end |
||
556 | mov ecx, ebx |
||
557 | mov edi, ProcName |
||
558 | add edx, 8 |
||
559 | repe cmpsb |
||
560 | jne @next |
||
561 | mov eax, [edx - 4] |
||
562 | @end: |
||
563 | pop ebx |
||
564 | pop edi |
||
565 | pop esi |
||
566 | ret |
||
567 | GetProcAddress EndP |
||
568 | ; -------------------------------------------------------- ; |
||
569 | Align 4 |
||
570 | GetScreenSize Proc |
||
571 | push ebx |
||
572 | mov eax, 61 |
||
573 | mov ebx, 1 |
||
574 | int 64 |
||
575 | pop ebx |
||
576 | ret |
||
577 | GetScreenSize EndP |
||
578 | ; -------------------------------------------------------- ; |
||
579 | Align 4 |
||
580 | GetSkinHeight Proc |
||
581 | push ebx |
||
582 | mov eax, 48 |
||
583 | mov ebx, 4 |
||
584 | int 64 |
||
585 | pop ebx |
||
586 | ret |
||
587 | GetSkinHeight EndP |
||
588 | ; -------------------------------------------------------- ; |
||
589 | Align 4 |
||
590 | GetFontHeight Proc |
||
591 | push ebx |
||
592 | mov eax, 48 |
||
593 | mov ebx, 11 |
||
594 | int 64 |
||
595 | pop ebx |
||
596 | ret |
||
597 | GetFontHeight EndP |
||
598 | ; -------------------------------------------------------- ; |
||
599 | Align 4 |
||
600 | DrawButton Proc Left:SDword, Top:SDword, Right:SDword, Bottom:SDword, BackColor:Dword, Style:Dword, ID:Dword |
||
601 | push ebx |
||
602 | push esi |
||
603 | mov eax, 8 |
||
604 | mov ebx, Left |
||
605 | mov ecx, Top |
||
606 | shl ebx, 16 |
||
607 | shl ecx, 16 |
||
608 | or ebx, Right |
||
609 | or ecx, Bottom |
||
610 | mov edx, ID |
||
611 | or edx, Style |
||
612 | mov esi, BackColor |
||
613 | int 64 |
||
614 | pop esi |
||
615 | pop ebx |
||
616 | ret |
||
617 | DrawButton EndP |
||
618 | ; -------------------------------------------------------- ; |
||
619 | Align 4 |
||
620 | GetStandardColors Proc ColorTable:Ptr, TableSize:Dword |
||
621 | push ebx |
||
622 | mov eax, 48 |
||
623 | mov ebx, 3 |
||
624 | mov ecx, ColorTable |
||
625 | mov edx, TableSize |
||
626 | int 64 |
||
627 | pop ebx |
||
628 | ret |
||
629 | GetStandardColors EndP |
||
630 | ; -------------------------------------------------------- ; |
||
631 | Align 4 |
||
632 | DrawText Proc X:SDword, Y:SDword, Text:Ptr, ForeColor:Dword, BackColor:Dword, Flags:Dword, Count:Dword |
||
633 | push ebx |
||
634 | push edi |
||
635 | push esi |
||
636 | mov eax, 4 |
||
637 | mov ebx, X |
||
638 | shl ebx, 16 |
||
639 | or ebx, Y |
||
640 | mov ecx, Flags |
||
641 | or ecx, ForeColor |
||
642 | mov edx, Text |
||
643 | mov edi, BackColor |
||
644 | mov esi, Count |
||
645 | int 64 |
||
646 | pop esi |
||
647 | pop edi |
||
648 | pop ebx |
||
649 | ret |
||
650 | DrawText EndP |
||
651 | ; -------------------------------------------------------- ; |
||
652 | Align 4 |
||
653 | GetMousePos Proc |
||
654 | push ebx |
||
655 | mov eax, 37 |
||
656 | mov ebx, 0 |
||
657 | int 64 |
||
658 | pop ebx |
||
659 | ret |
||
660 | GetMousePos EndP |
||
661 | ; -------------------------------------------------------- ; |
||
662 | Align 4 |
||
663 | ThreadCreate Proc Uses ebx Entry:Ptr, Stack:Ptr |
||
664 | mov eax, 51 |
||
665 | mov ebx, 1 |
||
666 | mov ecx, Entry |
||
667 | mov edx, Stack |
||
668 | int 64 |
||
669 | ret |
||
670 | ThreadCreate EndP |
||
671 | ; -------------------------------------------------------- ; |
||
672 | Align 4 |
||
673 | InputBox Proc Uses ebx esi edi Buffer:Ptr, Caption:Ptr, Prompt:Ptr, Default:Ptr, Flags:Dword, BufferSize:Dword, RedrawProc:Ptr |
||
674 | Local InputBoxID:Dword, InputBoxSlot:Dword, SharedMemorySize:Dword |
||
675 | Local EventMask:Dword, Result:Dword |
||
676 | Invoke GetThreadInfo, 0FFFFFFFFH, Offset ParentThreadInfo |
||
677 | |||
678 | mov eax, ParentThreadInfo.Identifier |
||
679 | mov ParentID, eax |
||
680 | mov ParentSlot, @(GetSlotById, ParentID) |
||
681 | |||
682 | mov ebx, Mem |
||
683 | mov [ebx][TMem.State], FALSE |
||
684 | |||
685 | mov eax, Caption |
||
686 | mov [ebx][TMem.Caption], eax |
||
687 | |||
688 | mov eax, Prompt |
||
689 | mov [ebx][TMem.Prompt], eax |
||
690 | |||
691 | mov eax, Default |
||
692 | mov [ebx][TMem.Default], eax |
||
693 | |||
694 | mov eax, Flags |
||
695 | mov [ebx][TMem.Flags], eax |
||
696 | |||
697 | mov EventMask, @(SetEventMask, EM_REDRAW) |
||
698 | |||
699 | mov InputBoxID, @(ThreadCreate, Offset InputBox_Thread, Offset InputBox_Thread_StackTop) |
||
700 | mov InputBoxSlot, @(GetSlotById, InputBoxID) |
||
701 | .Repeat |
||
702 | Invoke WaitEvent |
||
703 | Invoke ActivateWindow, InputBoxSlot |
||
704 | .If RedrawProc != 0 |
||
705 | call RedrawProc |
||
706 | .EndIf |
||
707 | .Until Dword Ptr [ebx][TMem.State] == TRUE |
||
708 | |||
709 | .If Flags & IBF_NUMBER |
||
710 | .If [ebx][TMem.Error] != IBE_NUMBER_OVERFLOW |
||
711 | mov edi, [ebx][TMem.Result] |
||
712 | add edi, SizeOf(Qword) - 1 |
||
713 | mov edx, edi |
||
714 | mov ecx, SizeOf(Qword) |
||
715 | std |
||
716 | xor al, al |
||
717 | repe scasb |
||
718 | cld |
||
719 | lea eax, [ecx + 1] |
||
720 | .If eax > BufferSize |
||
721 | mov [ebx][TMem.Error], IBE_RESULT_TOO_LONG |
||
722 | .EndIf |
||
723 | Invoke MemCpy, [ebx][TMem.Result], Buffer, BufferSize |
||
724 | .EndIf |
||
725 | .Else |
||
726 | .If @(StrLen, [ebx][TMem.Result]) <= BufferSize |
||
727 | Invoke StrCpy, [ebx][TMem.Result], Buffer |
||
728 | .Else |
||
729 | mov [ebx][TMem.Error], IBE_RESULT_TOO_LONG |
||
730 | mov eax, BufferSize |
||
731 | dec eax |
||
732 | mov edi, Buffer |
||
733 | add edi, eax |
||
734 | mov Byte Ptr [edi], 0 |
||
735 | Invoke MemCpy, [ebx][TMem.Result], Buffer, eax |
||
736 | .EndIf |
||
737 | .EndIf |
||
738 | |||
739 | mov eax, [ebx][TMem.Error] |
||
740 | mov Result, eax |
||
741 | |||
742 | Invoke SetEventMask, EventMask |
||
743 | Invoke ActivateWindow, @(GetSlotById, ParentThreadInfo.Identifier) |
||
744 | |||
745 | mov eax, Result |
||
746 | ret |
||
747 | InputBox EndP |
||
748 | ; -------------------------------------------------------- ; |
||
749 | Align 4 |
||
750 | OnRedraw Proc |
||
751 | Invoke BeginDraw |
||
752 | Invoke GetStandardColors, Offset SC, SizeOf(SC) |
||
753 | mov MousePos, @(GetMousePos) |
||
754 | mov FontHeight, @(GetFontHeight) |
||
755 | .If FontHeight > 9 |
||
756 | mov FontHeight, 16 |
||
757 | .EndIf |
||
758 | ; |
||
759 | .If FontHeight > 9 |
||
760 | mov eax, DT_ZSTRING + DT_CP866_8X16 |
||
761 | mov Edit1.text_color, DT_CP866_8X16 |
||
762 | mov FontWidth, 8 |
||
763 | .Else |
||
764 | mov eax, DT_ZSTRING + DT_CP866_6X9 |
||
765 | mov Edit1.text_color, DT_CP866_6X9 |
||
766 | mov FontWidth, 6 |
||
767 | .EndIf |
||
768 | mov TextFlags, eax |
||
769 | ; |
||
770 | mov ebx, Mem |
||
771 | |||
772 | mov eax, [ebx][TMem.Caption] |
||
773 | mov WinCaption, eax |
||
774 | mov eax, [ebx][TMem.Prompt] |
||
775 | mov TextPrompt, eax |
||
776 | |||
777 | mov TextOK, CStr(" OK ") |
||
778 | mov TextCancel, szCancel |
||
779 | |||
780 | mov eax, SC.work_graph |
||
781 | mov Edit1.focus_border_color, eax |
||
782 | ; Margin = FontHeight / 2 |
||
783 | mov eax, FontHeight |
||
784 | shr eax, 1 |
||
785 | mov Margin, eax |
||
786 | ; Window.SizeY = |
||
787 | ; GetSkinHeight + Margin + FontHeight + Margin + 1 + FontHeight + 1 + Margin + FontHeight + Margin + FontWidth + Margin + WINDOW_BORDER_SIZE |
||
788 | Invoke GetSkinHeight |
||
789 | add eax, Margin |
||
790 | add eax, FontHeight |
||
791 | add eax, Margin |
||
792 | add eax, 1 |
||
793 | add eax, FontHeight |
||
794 | add eax, 1 |
||
795 | add eax, Margin |
||
796 | add eax, FontHeight |
||
797 | add eax, Margin |
||
798 | add eax, FontWidth |
||
799 | add eax, Margin |
||
800 | add eax, WINDOW_BORDER_SIZE |
||
801 | mov Window.SizeY, eax |
||
802 | ; Window.SizeX = Screen.SizeX / 4 |
||
803 | mov Screen, @(GetScreenSize) |
||
804 | movzx eax, Screen.SizeX |
||
805 | shr eax, 2 |
||
806 | mov Window.SizeX, eax |
||
807 | .If (ebx != 0) && ([ebx][TMem.Flags] & IBF_SCREEN_REL) |
||
808 | ; Window.Left = (Screen.SizeX - Window.SizeX) / 2 |
||
809 | movzx eax, Screen.SizeX |
||
810 | sub eax, Window.SizeX |
||
811 | shr eax, 1 |
||
812 | mov Window.Left, eax |
||
813 | ; Window.Top = (Screen.SizeY - Window.SizeY) / 2 |
||
814 | movzx eax, Screen.SizeY |
||
815 | sub eax, Window.SizeX |
||
816 | shr eax, 1 |
||
817 | mov Window.Top, eax |
||
818 | .ElseIf (ebx != 0) && ([ebx][TMem.Flags] & IBF_PARENT_REL) |
||
819 | Invoke GetThreadInfo, ParentSlot, Offset ThreadInfo |
||
820 | ; Window.Left = (Parent.SizeX - Window.SizeX) / 2 + Parent.Left |
||
821 | mov eax, ThreadInfo.Window.SizeX |
||
822 | sub eax, Window.SizeX |
||
823 | shr eax, 1 |
||
824 | cdq ; |
||
825 | xor eax, edx ; eax = abs(eax) |
||
826 | sub eax, edx ; |
||
827 | mov edx, eax |
||
828 | mov eax, ThreadInfo.Window.Left |
||
829 | add eax, edx |
||
830 | mov Window.Left, eax |
||
831 | ; Window.Left = (Parent.SizeY - Window.SizeY) / 2 + Parent.Top |
||
832 | mov eax, ThreadInfo.Window.SizeY |
||
833 | sub eax, Window.SizeY |
||
834 | shr eax, 1 |
||
835 | cdq ; |
||
836 | xor eax, edx ; eax = abs(eax) |
||
837 | sub eax, edx ; |
||
838 | mov edx, eax |
||
839 | mov eax, ThreadInfo.Window.Top |
||
840 | add eax, edx |
||
841 | mov Window.Top, eax |
||
842 | .Else ;------------------------------------------------ |
||
843 | ; Window.Left = MousePos.X - Window.SizeX / 2 |
||
844 | movzx eax, MousePos.X |
||
845 | mov ecx, Window.SizeX |
||
846 | shr ecx, 1 |
||
847 | sub eax, ecx |
||
848 | .If SIGN? |
||
849 | xor eax, eax |
||
850 | .EndIf |
||
851 | mov Window.Left, eax |
||
852 | ; Window.Top = MousePos.Y - Window.SizeY / 2 |
||
853 | movzx eax, MousePos.Y |
||
854 | mov ecx, Window.SizeY |
||
855 | shr ecx, 1 |
||
856 | sub eax, ecx |
||
857 | .If SIGN? |
||
858 | xor eax, eax |
||
859 | .EndIf |
||
860 | mov Window.Top, eax |
||
861 | .EndIf ;----------------------------------------------- |
||
862 | ; PromptPos.X = Margin |
||
863 | ; PromptPos.Y = Margin |
||
864 | ; Edit1.left = Margin |
||
865 | mov eax, Margin |
||
866 | mov PromptPos.X, eax |
||
867 | mov PromptPos.Y, eax |
||
868 | mov Edit1.left, eax |
||
869 | ; Edit1.x_size = Window.SizeX - WINDOW_BORDER_SIZE * 2 |
||
870 | mov eax, Window.SizeX |
||
871 | sub eax, WINDOW_BORDER_SIZE * 2 |
||
872 | sub eax, Margin |
||
873 | sub eax, Margin |
||
874 | mov Edit1.x_size, eax |
||
875 | ; Edit1.top = Margin + FontHeight + Margin |
||
876 | mov eax, Margin |
||
877 | add eax, FontHeight |
||
878 | add eax, Margin |
||
879 | mov Edit1.top, eax |
||
880 | ; ButtonCancel.SizeX = StrLen(szCancel) * FontWidth + FontWidth |
||
881 | ; ButtonOK.SizeX = ButtonCancel.SizeX |
||
882 | mov eax, FontWidth |
||
883 | imul eax, 8 |
||
884 | mov ecx, FontWidth |
||
885 | add eax, ecx |
||
886 | mov ButtonCancel.SizeX, eax |
||
887 | mov ButtonOK.SizeX, eax |
||
888 | ; ButtonCancel.SizeY = FontHeight + FontWidth |
||
889 | ; ButtonOK.SizeY = ButtonCancel.SizeY |
||
890 | mov eax, FontHeight |
||
891 | mov ecx, FontWidth |
||
892 | add eax, ecx |
||
893 | mov ButtonCancel.SizeY, eax |
||
894 | mov ButtonOK.SizeY, eax |
||
895 | ; ButtonCancel.Top = Edit1.top + 1 + FontHeight + 1 + Margin + Margin |
||
896 | ; ButtonOK.Top = ButtonCancel.Top |
||
897 | mov eax, Edit1.top |
||
898 | add eax, 1 |
||
899 | add eax, FontHeight |
||
900 | add eax, 1 |
||
901 | add eax, Margin |
||
902 | add eax, Margin |
||
903 | mov ButtonCancel.Top, eax |
||
904 | mov ButtonOK.Top, eax |
||
905 | ; ButtonCancel.Left = Window.SizeX - WINDOW_BORDER_SIZE * 2 - Margin - ButtonCancel.SizeX |
||
906 | ; ButtonOK.Left = ButtonCancel.Left - Margin - ButtonOK.SizeX |
||
907 | mov eax, Window.SizeX |
||
908 | sub eax, WINDOW_BORDER_SIZE * 2 |
||
909 | sub eax, Margin |
||
910 | sub eax, ButtonCancel.SizeX |
||
911 | mov ButtonCancel.Left, eax |
||
912 | sub eax, Margin |
||
913 | sub eax, ButtonOK.SizeX |
||
914 | mov ButtonOK.Left, eax |
||
915 | ; TextOKLeft = ButtonOK.Left + FontWidth / 2 + 1 |
||
916 | ; TextOKTop = ButtonOK.Top + FontWidth / 2 + 1 |
||
917 | mov eax, ButtonOK.Left |
||
918 | mov edx, ButtonOK.Top |
||
919 | mov ecx, FontWidth |
||
920 | shr ecx, 1 |
||
921 | add ecx, 1 |
||
922 | add eax, ecx |
||
923 | add edx, ecx |
||
924 | mov TextOKLeft, eax |
||
925 | mov TextOKTop, edx |
||
926 | ; TextCancelLeft = ButtonCancel.Left + FontWidth / 2 + 1 |
||
927 | ; TextCancelTop = ButtonCancel.Top + FontWidth / 2 + 1 |
||
928 | mov eax, ButtonCancel.Left |
||
929 | mov edx, ButtonCancel.Top |
||
930 | mov ecx, FontWidth |
||
931 | shr ecx, 1 |
||
932 | add ecx, 1 |
||
933 | add eax, ecx |
||
934 | add edx, ecx |
||
935 | mov TextCancelLeft, eax |
||
936 | mov TextCancelTop, edx |
||
937 | ; |
||
938 | Invoke DrawWindow, Window.Left, Window.Top, Window.SizeX, Window.SizeY, WinCaption, SC.work, WS_SKINNED_FIXED + WS_COORD_CLIENT + WS_CAPTION, CS_MOVABLE |
||
939 | Invoke DrawText, PromptPos.X, PromptPos.Y, TextPrompt, SC.work_text, 0, TextFlags, 0 |
||
940 | Invoke DrawButton, ButtonOK.Left, ButtonOK.Top, ButtonOK.SizeX, ButtonOK.SizeY, SC.work_button, 0, BUTTON_OK |
||
941 | Invoke DrawText, TextOKLeft, TextOKTop, TextOK, SC.work_button_text, 0, TextFlags, 0 |
||
942 | Invoke DrawButton, ButtonCancel.Left, ButtonCancel.Top, ButtonCancel.SizeX, ButtonCancel.SizeY, SC.work_button, 0, BUTTON_CANCEL |
||
943 | Invoke DrawText, TextCancelLeft, TextCancelTop, TextCancel, SC.work_button_text, 0, TextFlags, 0 |
||
944 | Invoke EditBoxDraw, Offset Edit1 |
||
945 | Invoke EndDraw |
||
946 | ret |
||
947 | OnRedraw Endp |
||
948 | ; -------------------------------------------------------- ; |
||
949 | Align 4 |
||
950 | OK Proc |
||
951 | mov ebx, Mem |
||
952 | .If [ebx][TMem.Flags] & IBF_NUMBER |
||
953 | |||
954 | lea edi, [ebx + SizeOf(TMem)] |
||
955 | mov [ebx][TMem.Result], edi |
||
956 | |||
957 | mov [edi], @(a2i, Edit1.text) |
||
958 | mov [edi + SizeOf(Dword)], edx |
||
959 | .If CARRY? |
||
960 | mov [ebx][TMem.Error], IBE_NUMBER_OVERFLOW |
||
961 | .Else |
||
962 | mov [ebx][TMem.Error], IBE_NO_ERROR |
||
963 | .EndIf |
||
964 | .Else |
||
965 | mov eax, Edit1.text |
||
966 | mov [ebx][TMem.Result], eax |
||
967 | mov [ebx][TMem.Error], IBE_NO_ERROR |
||
968 | .EndIf |
||
969 | mov [ebx][TMem.State], TRUE |
||
970 | Invoke ActivateWindow, ParentSlot |
||
971 | Invoke ThreadTerminate |
||
972 | ret |
||
973 | OK Endp |
||
974 | ; -------------------------------------------------------- ; |
||
975 | Align 4 |
||
976 | Cancel Proc |
||
977 | mov ebx, Mem |
||
978 | .If [ebx][TMem.Flags] & IBF_NUMBER |
||
979 | |||
980 | lea edi, [ebx + SizeOf(TMem)] |
||
981 | |||
982 | mov [ebx][TMem.Result], edi |
||
983 | mov [edi], @(a2i, [ebx][TMem.Default]) |
||
984 | mov [edi + SizeOf(Dword)], edx |
||
985 | .If CARRY? |
||
986 | mov [ebx][TMem.Error], IBE_NUMBER_OVERFLOW |
||
987 | .Else |
||
988 | mov [ebx][TMem.Error], IBE_NO_ERROR |
||
989 | .EndIf |
||
990 | .Else |
||
991 | mov eax, [ebx][TMem.Default] |
||
992 | mov [ebx][TMem.Result], eax |
||
993 | mov [ebx][TMem.Error], IBE_NO_ERROR |
||
994 | .EndIf |
||
995 | mov [ebx][TMem.State], TRUE |
||
996 | Invoke ActivateWindow, ParentSlot |
||
997 | Invoke ThreadTerminate |
||
998 | ret |
||
999 | Cancel Endp |
||
1000 | ; -------------------------------------------------------- ; |
||
1001 | Align 4 |
||
1002 | InputBox_Thread: |
||
1003 | .If Initialized == FALSE |
||
1004 | mov BoxLib, @(LoadLibrary, CStr("/sys/lib/box_lib.obj")) |
||
1005 | mov EditBoxDraw, @(GetProcAddress, BoxLib, CStr("edit_box")) |
||
1006 | mov EditBoxKey, @(GetProcAddress, BoxLib, CStr("edit_box_key")) |
||
1007 | mov EditBoxMouse, @(GetProcAddress, BoxLib, CStr("edit_box_mouse")) |
||
1008 | mov EditBoxSetText, @(GetProcAddress, BoxLib, CStr("edit_box_set_text")) |
||
1009 | |||
1010 | mov Initialized, TRUE |
||
1011 | .EndIf |
||
1012 | |||
1013 | mov ebx, Mem |
||
1014 | |||
1015 | Invoke EditBoxSetText, Offset Edit1, [ebx][TMem.Default] |
||
1016 | |||
1017 | Invoke SetEventMask, EM_REDRAW + EM_KEY + EM_BUTTON + EM_MOUSE |
||
1018 | |||
1019 | .Repeat |
||
1020 | Invoke WaitEvent |
||
1021 | .If eax == REDRAW_EVENT |
||
1022 | Invoke OnRedraw |
||
1023 | .ElseIf eax == KEY_EVENT |
||
1024 | mov Key, @(GetKey) |
||
1025 | .If Key.Code == KEY_CODE_ENTER |
||
1026 | Invoke OK |
||
1027 | .ElseIf Key.Code == KEY_CODE_ESCAPE |
||
1028 | Invoke Cancel |
||
1029 | .Else |
||
1030 | Invoke EditBoxKey, Offset Edit1 |
||
1031 | .EndIf |
||
1032 | .ElseIf eax == BUTTON_EVENT |
||
1033 | mov Button, @(GetButton) |
||
1034 | .If Button.ID == BUTTON_CLOSE |
||
1035 | Invoke Cancel |
||
1036 | .ElseIf Button.ID == BUTTON_OK |
||
1037 | Invoke OK |
||
1038 | .ElseIf Button.ID == BUTTON_CANCEL |
||
1039 | Invoke Cancel |
||
1040 | .EndIf |
||
1041 | .ElseIf eax == MOUSE_EVENT |
||
1042 | Invoke EditBoxMouse, Offset Edit1 |
||
1043 | .EndIf |
||
1044 | .Until 0 |
||
1045 | ; -------------------------------------------------------- ; |
||
1046 | Align 16 |
||
1047 | EXPORTS Label Dword |
||
1048 | Dword CStr("InputBox"), Offset InputBox |
||
1049 | Dword 0, 0 |
||
1050 | ; -------------------------------------------------------- ; |
||
1051 | END=>>>>>>>>>>>>\ |