2 * WineCalc (winecalc.c)
4 * Copyright 2003 James Briggs
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include <stdio.h> // sprintf
25 // #include <commctrl.h>
32 // lame M$ math library doesn't support hyp functions
34 #define atanh(X) atan(X)
35 #define asinh(X) asin(X)
36 #define acosh(X) acos(X)
41 // 1. In the original calculator, numbers are "extended precision".
42 // We emulate with calcfloat (calcfloat floating point) for now.
43 // Note that recent M$ compilers 5.0 and later do not implement double float,
44 // and do not support 80-bit numbers. Max width is 64-bits.
48 // i) current edit buffer value for keystrokes
49 // ii) computed value area for last computation
50 // iii) memory area for MR, MC, MS, M+
51 // iv) formatted display buffer
53 // 3. Memory Store works off current buffer, not value
55 // 4. display limit is 32 numbers plus 10 commas plus one period = 43 characters
57 // 5. original calc is better called SciCalc and saves settings in win.ini:
60 // layout=1 (0 = scientific mode, 1 = basic mode)
61 // UseSep=1 (0 = no digits separator, 1 = enable digits separator)
65 // The menus know their own states, so we don't need to track them
66 // When switching to Standard Calculator Mode, number base is changed to Decimal and Trig Mode to Degrees,
67 // but Word Size Mode is unchanged
69 // 7. It would be nice to add command line parsing for batch files
72 // various display error messages
74 static char err_invalid
[CALC_BUF_SIZE
];
75 static char err_divide_by_zero
[CALC_BUF_SIZE
];
76 static char err_undefined
[CALC_BUF_SIZE
];
78 // calculator state is kept here
84 static int keys
[CALC_NS_COUNT
]['f'+1]; // note: sparse array
86 // map from button press to calc[] index
87 // 0, ... 9, A, B, C, D, E, F,FE,DMS,SIN,COS,TAN,EXP, PI
88 static const int h
[] = {
89 0, 0, 33, 34, 21, 22, 23, 10, 11, 12, 54, 55, 56 ,57, 58 ,59, 6, 17, 28, 39, 50, 18, 53 };
91 // enable status of various buttons on sci mode depending on number base
92 static const int btn_toggle
[CALC_NS_COUNT
][TOGGLE_COUNT
] =
93 // 0, ... 9, A, B, C, D, E, F,FE,DMS,SIN,COS,TAN,EXP,PI
95 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },
96 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 },
97 { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
98 { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0 }
101 static int hms
[] = { 64, 65, 66 };
102 static int hws
[] = { 69, 70, 71, 72 };
104 static int sta
[] = { 16, 27, 38, 49 };
106 static HMENU menus
[3];
108 static char appname
[40];
112 int parse(int wParam
, int lParam
);
116 extern HWND hWndListBox
;
120 int WINAPI
WinMain( HINSTANCE hInst
, HINSTANCE hPrevInst
, LPSTR cmdline
, int cmdshow
)
127 char s
[CALC_BUF_SIZE
];
132 r
= GetProfileString("SciCalc",
139 calc
.sciMode
= atoi(s
);
141 if (calc
.sciMode
!= 0 &&
143 calc
.sciMode
= 1; // Standard Mode
145 r
= GetProfileString("SciCalc",
152 calc
.digitGrouping
= atoi(s
);
154 if (calc
.digitGrouping
!= 0 &&
155 calc
.digitGrouping
!= 1)
156 calc
.digitGrouping
= 1;
158 calc
.new = 1; // initialize struct values
160 if (!LoadString( hInst
, IDS_APPNAME
, appname
, sizeof(appname
)))
162 if (!LoadString( hInst
, IDS_ERR_INVALID_INPUT
, err_invalid
, sizeof(err_invalid
)))
164 if (!LoadString( hInst
, IDS_ERR_DIVIDE_BY_ZERO
, err_divide_by_zero
, sizeof(err_divide_by_zero
)))
166 if (!LoadString( hInst
, IDS_ERR_UNDEFINED
, err_undefined
, sizeof(err_undefined
)))
169 wc
.style
= CS_HREDRAW
| CS_VREDRAW
;
170 wc
.lpfnWndProc
= MainProc
;
173 wc
.hInstance
= hInst
;
174 wc
.hIcon
= LoadIcon( hInst
, appname
);
175 wc
.hCursor
= LoadCursor( NULL
, IDI_APPLICATION
);
176 wc
.hbrBackground
= (HBRUSH
)(COLOR_BTNFACE
+1);
177 wc
.lpszMenuName
= NULL
;
178 wc
.lpszClassName
= appname
;
180 if (!RegisterClass(&wc
)) exit(1);
182 hWnd
= CreateWindow( appname
,
184 WS_OVERLAPPEDWINDOW
& ~WS_THICKFRAME
& ~WS_MAXIMIZEBOX
,
187 calc
.sciMode
? CALC_STANDARD_WIDTH
: CALC_SCIENTIFIC_WIDTH
,
188 calc
.sciMode
? CALC_STANDARD_HEIGHT
: CALC_SCIENTIFIC_HEIGHT
,
197 ShowWindow( hWnd
, cmdshow
);
198 UpdateWindow( hWnd
);
200 if (!(haccel
= LoadAccelerators(hInst
, "MAIN_MENU")))
203 while( GetMessage(&msg
, NULL
, 0, 0) ) {
204 if (hWndDlgStats
== 0 || !IsDialogMessage(hWndDlgStats
, &msg
)) {
205 if (!TranslateAccelerator( hWnd
, haccel
, &msg
)) {
206 TranslateMessage( &msg
);
207 DispatchMessage( &msg
);
215 LRESULT WINAPI
MainProc( HWND hWnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
223 calc
.hInst
= ((LPCREATESTRUCT
) lParam
)->hInstance
;
228 InitMenus(calc
.hInst
);
231 SetMenu(hWnd
, menus
[MENU_STD
]);
233 SetMenu(hWnd
, menus
[MENU_SCIMS
]);
235 calc_buffer_display(&calc
);
243 hdc
= BeginPaint( hWnd
, &ps
);
244 hMemDC
= CreateCompatibleDC( hdc
);
246 DrawCalc( hdc
, hMemDC
, &ps
, &calc
);
249 EndPaint( hWnd
, &ps
);
255 calc
.pos
.x
= (unsigned) LOWORD(lParam
);
256 calc
.pos
.y
= (unsigned) HIWORD(lParam
);
262 char s
[CALC_BUF_SIZE
];
264 sprintf(s
, "%d", calc
.sciMode
);
265 r
= WriteProfileString("SciCalc", "layout", s
);
267 sprintf(s
, "%d", calc
.digitGrouping
);
268 r
= WriteProfileString("SciCalc", "UseSep", s
);
271 DestroyCalc( &calc
);
272 PostQuitMessage( 0 );
280 MessageBox(hWnd
, "No Help Available", "Windows Help", MB_OK
);
287 if (calc
.numBase
== NBASE_DECIMAL
)
288 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_MS_DEGREES
, lParam
);
290 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_WS_DWORD
, lParam
);
298 if (calc
.numBase
== NBASE_DECIMAL
)
299 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_MS_RADIANS
, lParam
);
301 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_WS_WORD
, lParam
);
310 if (calc
.numBase
== NBASE_DECIMAL
)
311 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_MS_GRADS
, lParam
);
313 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_WS_BYTE
, lParam
);
321 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_NS_HEX
, lParam
);
324 case VK_F6
: // Decimal
328 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_NS_DEC
, lParam
);
335 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_NS_OCT
, lParam
);
338 case VK_F8
: // Binary
342 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_NS_BIN
, lParam
);
345 case VK_F12
: // QWORD
349 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_WS_QWORD
, lParam
);
355 SendMessage(hWnd
, WM_CHAR
, 'Z', lParam
);
358 case VK_INSERT
: // Dat
360 SendMessage(hWndListBox
, LB_INSERTSTRING
, -1, (LPARAM
)calc
.buffer
);
361 InvalidateRect(hWndDlgStats
, NULL
, TRUE
); // update list count at bottom edge of dialog
362 UpdateWindow(hWndDlgStats
);
368 calc
.buffer
[0] = '\0';
369 calc_buffer_display(&calc
);
380 show_debug(&calc
, "Start WM_CHAR", wParam
, lParam
);
384 case '\x13': // Ctrl+S Sta Statistics
386 if (hWndDlgStats
) { // Statistics Box already displayed, focus but don't create another one
387 // SetFocus(hWndDlgStats);
388 // SendMessage(hWndDlgStats, WM_SETFOCUS, 0, 0);
395 EnableWindow((HWND
)calc
.cb
[sta
[i
]].hBtn
, FALSE
);
399 EnableWindow((HWND
)calc
.cb
[sta
[i
]].hBtn
, TRUE
);
401 hWndDlgStats
= CreateDialog( // modeless dialog
402 calc
.hInst
, // handle to application instance
403 "DLG_STATS", // identifies dialog box template name
404 hWnd
, // handle to owner window
405 StatsDlgProc
); // pointer to dialog box procedure
410 SendMessage(hWndDlgStats
, WM_SETFOCUS
, 0, 0);
416 case '\x01': // Ctrl+A Ave Statistics
417 case '\x04': // Ctrl+D s Standard Deviation Statistics
418 case '\x14': // Ctrl+T Sum Statistics
423 char s
[CALC_BUF_SIZE
];
429 // This is all lame. Here we are querying the list control for items and calculating the total.
430 // We should have an array of intermediate results to work with to avoid roundoff errors, etc.
432 n
= SendMessage(hWndListBox
, LB_GETCOUNT
, 0, 0);
435 SendMessage(hWndListBox
, LB_GETTEXT
, i
, (LPARAM
)s
);
436 val
= calc_atof(s
,calc
.numBase
);
441 if (LOWORD(wParam
) != '\x14') // not sum only
444 if (LOWORD(wParam
== '\x04')) { // standard deviation is sqrt(sum( xbar - x )^2 / (n-1))
448 val
+= pow(x
[i
] - avg
, 2);
451 total
= sqrt(val
/ n
); // complete population
453 total
= sqrt(val
/ (n
- 1)); // sample of population
456 if (LOWORD(wParam
) == '\x01') // average or mean
459 calc_ftoa(&calc
, total
, s
);
460 strcpy(calc
.buffer
, s
);
461 calc_buffer_display(&calc
);
466 case '\x03': // Ctrl+C Copy
471 HGLOBAL hGlobalMemory
;
474 if (!(len
= strlen(calc
.display
)))
477 if (!(hGlobalMemory
= GlobalAlloc(GHND
, len
+ 1)))
480 if (!(pGlobalMemory
= GlobalLock(hGlobalMemory
)))
483 if (!(s
= calc
.display
))
486 for (i
= 0; i
< len
; i
++)
487 *pGlobalMemory
++ = *s
++;
489 GlobalUnlock(hGlobalMemory
); // call GetLastError() for exception handling
491 if (!OpenClipboard(hWnd
))
494 if (!EmptyClipboard())
497 if (!SetClipboardData(CF_TEXT
, hGlobalMemory
))
500 if (!CloseClipboard())
505 case '\x16': // Ctrl+V Paste
512 HGLOBAL hGlobalMemory
;
515 if (IsClipboardFormatAvailable(CF_TEXT
)) {
516 if (!OpenClipboard(hWnd
))
519 if (!(hGlobalMemory
= GetClipboardData(CF_TEXT
)))
522 if (!(size
= GlobalSize(hGlobalMemory
)))
525 if (!(s
= (char *)malloc(size
)))
528 if (!(pGlobalMemory
= GlobalLock(hGlobalMemory
)))
531 strcpy(s
, pGlobalMemory
);
533 GlobalUnlock(hGlobalMemory
);
535 if (!CloseClipboard())
538 // calc paste protocol
540 // :c clear memory WM_CHAR, 0x0c
541 // :e enable scientific notation WM_CHAR, 'v'
542 // :m store display in memory WM_CHAR, 0x0d
543 // :p add display to memory WM_CHAR, 0x10
544 // :q clear current calculation WM_CHAR, '\x1b'
545 // :r read memory into display WM_CHAR, 0x12
546 // \ Dat WM_CHAR, VK_INSERT
548 // parse the pasted data, validate and SendMessage it one character at a time.
549 // it would appear wincalc does it this way (slow), although very slow appearing on Wine.
551 while ((c
= *s
++) && (i
++ < size
)) {
555 else if (c
== '\\') {
556 SendMessage(hWnd
, WM_KEYDOWN
, VK_INSERT
, lParam
);
563 case 'c': // clear memory
566 SendMessage(hWnd
, WM_CHAR
, 0x0c, lParam
);
568 case 'e': // enable scientific notation
571 SendMessage(hWnd
, WM_CHAR
, 'v', lParam
);
573 case 'm': // store display in memory
576 SendMessage(hWnd
, WM_CHAR
, 0x0d, NUMBER_OF_THE_BEAST
);
578 case 'p': // add display to memory
581 SendMessage(hWnd
, WM_CHAR
, 0x10, lParam
);
583 case 'q': // clear current calculation
586 SendMessage(hWnd
, WM_CHAR
, '\x1b', lParam
);
588 case 'r': // read memory into display
591 SendMessage(hWnd
, WM_CHAR
, 0x12, lParam
);
593 default: // just eat it but complain
600 if ((calc
.numBase
== NBASE_HEX
) &&
601 ((c
>= '0' && c
<= '9') ||
602 (c
>= 'a' && c
<= 'f') ||
603 (c
>= 'A' && c
<= 'F'))) {
605 SendMessage(hWnd
, WM_CHAR
, c
, lParam
);
607 else if ((calc
.numBase
== NBASE_DECIMAL
) &&
608 (c
>= '0' && c
<= '9')) {
609 SendMessage(hWnd
, WM_CHAR
, c
, lParam
);
611 else if ((calc
.numBase
== NBASE_OCTAL
) &&
612 (c
>= '0' && c
<= '7')) {
613 SendMessage(hWnd
, WM_CHAR
, c
, lParam
);
615 else if ((calc
.numBase
== NBASE_BINARY
) &&
616 (c
== '0' || c
== '1')) {
617 SendMessage(hWnd
, WM_CHAR
, c
, lParam
);
619 else if (c
== '.' || c
== ',' ||
620 c
== 'e' || c
== 'E' ||
621 c
== '+' || c
== '-') {
622 SendMessage(hWnd
, WM_CHAR
, c
, lParam
);
624 else if (c
== ' ' || // eat harmless trash here
629 else { // extra spicy trash gets noticed
631 MessageBeep(0); // uh, beeps can get annoying. maybe rate limit.
642 int ret
= parse(wParam
, lParam
);
646 calc_buffer_display(&calc
);
650 switch(LOWORD(wParam
)) {
653 SendMessage(hWnd
, WM_CHAR
, '\x03', lParam
);
657 SendMessage(hWnd
, WM_CHAR
, '\x16', lParam
);
660 case IDM_MODE_STANDARD
:
666 calc
.trigMode
= TRIGMODE_DEGREES
;
667 calc
.numBase
= NBASE_DECIMAL
;
669 EnableWindow(hWnd
, FALSE
);
672 for (i
=1;i
<COUNT_MENUS
;i
++) {
673 if (calc
.numBase
!= ID_CALC_NS_DEC
) {
674 CheckMenuItem(menus
[i
], ID_CALC_NS_HEX
, MF_UNCHECKED
);
675 CheckMenuItem(menus
[i
], ID_CALC_NS_DEC
, MF_CHECKED
);
676 CheckMenuItem(menus
[i
], ID_CALC_NS_OCT
, MF_UNCHECKED
);
677 CheckMenuItem(menus
[i
], ID_CALC_NS_BIN
, MF_UNCHECKED
);
681 for (i
=1;i
<COUNT_MENUS
;i
++) {
682 CheckMenuItem(menus
[i
], ID_CALC_MS_DEGREES
, MF_CHECKED
);
683 CheckMenuItem(menus
[i
], ID_CALC_MS_RADIANS
, MF_UNCHECKED
);
684 CheckMenuItem(menus
[i
], ID_CALC_MS_GRADS
, MF_UNCHECKED
);
687 SetMenu(hWnd
, menus
[MENU_STD
]);
689 // SendMessage(hWnd, WM_SIZE, SIZE_RESTORED, CALC_STANDARD_WIDTH | (CALC_STANDARD_HEIGHT << 8));
690 GetWindowRect(hWnd
, &lpRect
);
691 MoveWindow(hWnd
, lpRect
.left
, lpRect
.top
, CALC_STANDARD_WIDTH
, CALC_STANDARD_HEIGHT
, TRUE
);
695 EnableWindow(hWnd
, TRUE
);
700 case IDM_MODE_SCIENTIFIC
:
705 EnableWindow(hWnd
, FALSE
);
707 SetMenu(hWnd
, menus
[MENU_SCIMS
]);
709 GetWindowRect(hWnd
, &lpRect
);
710 MoveWindow(hWnd
, lpRect
.left
, lpRect
.top
, CALC_SCIENTIFIC_WIDTH
, CALC_SCIENTIFIC_HEIGHT
, TRUE
);
715 SendMessage(calc
.cb
[67].hBtn
, BM_SETCHECK
, TRUE
, 0);
718 SendMessage(calc
.cb
[68].hBtn
, BM_SETCHECK
, TRUE
, 0);
720 EnableWindow(hWnd
, TRUE
);
725 case IDM_DIGIT_GROUPING
:
730 calc
.digitGrouping
= !calc
.digitGrouping
;
732 n
= (calc
.digitGrouping
? MF_CHECKED
: MF_UNCHECKED
);
734 for (i
=0;i
<COUNT_MENUS
;i
++)
735 CheckMenuItem(menus
[i
], IDM_DIGIT_GROUPING
, n
);
737 calc_buffer_display(&calc
);
741 case IDM_HELP_TOPICS
:
742 MessageBox(hWnd
, "No Help Available", "Windows Help", MB_OK
);
746 DialogBox( calc
.hInst
, "DLG_ABOUT", hWnd
, AboutDlgProc
);
755 int w
= LOWORD(wParam
);
757 if (w
== ID_CALC_NS_HEX
) {
758 if (calc
.numBase
== NBASE_HEX
)
761 calc
.numBase
= NBASE_HEX
;
763 else if (w
== ID_CALC_NS_DEC
) {
764 if (calc
.numBase
== NBASE_DECIMAL
)
767 calc
.numBase
= NBASE_DECIMAL
;
769 else if (w
== ID_CALC_NS_OCT
) {
770 if (calc
.numBase
== NBASE_OCTAL
)
773 calc
.numBase
= NBASE_OCTAL
;
775 else if (w
== ID_CALC_NS_BIN
) {
776 if (calc
.numBase
== NBASE_BINARY
)
779 calc
.numBase
= NBASE_BINARY
;
782 for (i
=0;i
<CALC_NS_COUNT
;i
++)
783 SendMessage(calc
.cb
[60+i
].hBtn
, BM_SETCHECK
, w
== (ID_CALC_NS_HEX
+ i
) ? 1 : 0, 0);
785 for (i
=2;i
<TOGGLE_COUNT
;i
++) { // skip 0 and 1, always valid
786 if (btn_toggle
[w
- ID_CALC_NS_HEX
][i
]) {
787 if (!IsWindowEnabled((HWND
)calc
.cb
[h
[i
]].hBtn
))
788 EnableWindow((HWND
)calc
.cb
[h
[i
]].hBtn
, TRUE
);
792 if (IsWindowEnabled((HWND
)calc
.cb
[h
[i
]].hBtn
))
793 EnableWindow((HWND
)calc
.cb
[h
[i
]].hBtn
, FALSE
);
797 if (w
== ID_CALC_NS_DEC
) {
798 for (i
=0;i
<CALC_WS_COUNT
;i
++) {
799 if (IsWindowEnabled((HWND
)calc
.cb
[hws
[i
]].hBtn
)) {
800 ShowWindow((HWND
)calc
.cb
[hws
[i
]].hBtn
, SW_HIDE
);
801 EnableWindow((HWND
)calc
.cb
[hws
[i
]].hBtn
, FALSE
);
804 for (i
=0;i
<CALC_MS_COUNT
;i
++) {
805 if (!IsWindowEnabled((HWND
)calc
.cb
[hms
[i
]].hBtn
)) {
806 ShowWindow((HWND
)calc
.cb
[hms
[i
]].hBtn
, SW_SHOWNORMAL
);
807 EnableWindow((HWND
)calc
.cb
[hms
[i
]].hBtn
, TRUE
);
812 for (i
=0;i
<CALC_MS_COUNT
;i
++) {
813 if (IsWindowEnabled((HWND
)calc
.cb
[hms
[i
]].hBtn
)) {
814 ShowWindow((HWND
)calc
.cb
[hms
[i
]].hBtn
, SW_HIDE
);
815 EnableWindow((HWND
)calc
.cb
[hms
[i
]].hBtn
, FALSE
);
818 for (i
=0;i
<CALC_WS_COUNT
;i
++) {
819 if (!IsWindowEnabled((HWND
)calc
.cb
[hws
[i
]].hBtn
)) {
820 ShowWindow((HWND
)calc
.cb
[hws
[i
]].hBtn
, SW_SHOWNORMAL
);
821 EnableWindow((HWND
)calc
.cb
[hws
[i
]].hBtn
, TRUE
);
826 CheckMenuItem(menus
[i
], ID_CALC_MS_DEGREES
, MF_CHECKED
);
828 for (i
=1;i
<COUNT_MENUS
;i
++) { // skip the simple Standard calculator mode
829 CheckMenuItem(menus
[i
], ID_CALC_NS_HEX
, (w
== ID_CALC_NS_HEX
? MF_CHECKED
: MF_UNCHECKED
) );
830 CheckMenuItem(menus
[i
], ID_CALC_NS_DEC
, (w
== ID_CALC_NS_DEC
? MF_CHECKED
: MF_UNCHECKED
) );
831 CheckMenuItem(menus
[i
], ID_CALC_NS_OCT
, (w
== ID_CALC_NS_OCT
? MF_CHECKED
: MF_UNCHECKED
) );
832 CheckMenuItem(menus
[i
], ID_CALC_NS_BIN
, (w
== ID_CALC_NS_BIN
? MF_CHECKED
: MF_UNCHECKED
) );
835 if (wParam
== ID_CALC_NS_DEC
) {
836 SetMenu(hWnd
, menus
[MENU_SCIMS
]);
840 calc
.displayMode
= 0;
841 SetMenu(hWnd
, menus
[MENU_SCIWS
]);
844 calc_buffer_display(&calc
);
848 case ID_CALC_MS_DEGREES
:
849 case ID_CALC_MS_RADIANS
:
850 case ID_CALC_MS_GRADS
:
853 int w
= LOWORD(wParam
);
855 if (w
== ID_CALC_MS_DEGREES
)
856 calc
.trigMode
= TRIGMODE_DEGREES
;
857 else if (w
== ID_CALC_MS_RADIANS
)
858 calc
.trigMode
= TRIGMODE_RADIANS
;
859 else if (w
== ID_CALC_MS_GRADS
)
860 calc
.trigMode
= TRIGMODE_GRADS
;
864 for (i
=0;i
<CALC_MS_COUNT
;i
++)
865 SendMessage(calc
.cb
[64+i
].hBtn
, BM_SETCHECK
, w
== (ID_CALC_MS_DEGREES
+ i
) ? 1 : 0, 0);
867 for (i
=1;i
<COUNT_MENUS
;i
++) { // skip the simple Standard calculator mode
868 CheckMenuItem(menus
[i
], ID_CALC_MS_DEGREES
, (wParam
== ID_CALC_MS_DEGREES
) ? MF_CHECKED
: MF_UNCHECKED
);
869 CheckMenuItem(menus
[i
], ID_CALC_MS_RADIANS
, (wParam
== ID_CALC_MS_RADIANS
) ? MF_CHECKED
: MF_UNCHECKED
);
870 CheckMenuItem(menus
[i
], ID_CALC_MS_GRADS
, (wParam
== ID_CALC_MS_GRADS
) ? MF_CHECKED
: MF_UNCHECKED
);
877 case ID_CALC_WS_QWORD
:
878 case ID_CALC_WS_DWORD
:
879 case ID_CALC_WS_WORD
:
880 case ID_CALC_WS_BYTE
:
883 int w
= LOWORD(wParam
);
887 for (i
=0;i
<CALC_WS_COUNT
;i
++)
888 SendMessage(calc
.cb
[69+i
].hBtn
, BM_SETCHECK
, LOWORD(wParam
) == (ID_CALC_WS_QWORD
+ i
) ? 1 : 0, 0);
890 for (i
=1; i
<COUNT_MENUS
; i
++) { // skip the simple Standard calculator mode
891 CheckMenuItem(menus
[i
], ID_CALC_WS_QWORD
, (w
== ID_CALC_WS_QWORD
? MF_CHECKED
: MF_UNCHECKED
) );
892 CheckMenuItem(menus
[i
], ID_CALC_WS_DWORD
, (w
== ID_CALC_WS_DWORD
? MF_CHECKED
: MF_UNCHECKED
) );
893 CheckMenuItem(menus
[i
], ID_CALC_WS_WORD
, (w
== ID_CALC_WS_WORD
? MF_CHECKED
: MF_UNCHECKED
) );
894 CheckMenuItem(menus
[i
], ID_CALC_WS_BYTE
, (w
== ID_CALC_WS_BYTE
? MF_CHECKED
: MF_UNCHECKED
) );
907 SendMessage(calc
.cb
[67].hBtn
, BM_SETCHECK
, calc
.invMode
? TRUE
: FALSE
, 0);
917 SendMessage(calc
.cb
[68].hBtn
, BM_SETCHECK
, calc
.hypMode
? TRUE
: FALSE
, 0);
922 if (HIWORD(wParam
) == BN_CLICKED
) {
925 LOWORD(wParam
) != ID_CALC_CLEAR_ENTRY
&&
926 LOWORD(wParam
) != ID_CALC_CLEAR_ALL
) {
935 switch (LOWORD(wParam
)) {
947 SendMessage(hWnd
, WM_CHAR
, LOWORD(wParam
)+'0' , lParam
);
951 SendMessage(hWnd
, WM_CHAR
, 'a', lParam
);
955 SendMessage(hWnd
, WM_CHAR
, 'b', lParam
);
959 SendMessage(hWnd
, WM_CHAR
, 'c', lParam
);
963 SendMessage(hWnd
, WM_CHAR
, 'd', lParam
);
967 SendMessage(hWnd
, WM_CHAR
, 'e', lParam
);
971 SendMessage(hWnd
, WM_CHAR
, 'f', lParam
);
974 case ID_CALC_DECIMAL
:
975 SendMessage(hWnd
, WM_CHAR
, '.', lParam
);
978 case ID_CALC_BACKSPACE
:
979 SendMessage(hWnd
, WM_CHAR
, '\b', lParam
);
982 case ID_CALC_CLEAR_ENTRY
:
983 SendMessage(hWnd
, WM_KEYDOWN
, VK_DELETE
, lParam
);
986 case ID_CALC_CLEAR_ALL
:
987 SendMessage(hWnd
, WM_CHAR
, '\x1b', lParam
);
990 case ID_CALC_MEM_CLEAR
:
991 SendMessage(hWnd
, WM_CHAR
, 0x0c, lParam
);
994 case ID_CALC_MEM_RECALL
:
995 SendMessage(hWnd
, WM_CHAR
, 0x12, lParam
);
998 case ID_CALC_MEM_STORE
:
999 SendMessage(hWnd
, WM_CHAR
, 0x0d, NUMBER_OF_THE_BEAST
); // trying to tell between Return and Ctrl+M
1002 case ID_CALC_MEM_PLUS
:
1003 SendMessage(hWnd
, WM_CHAR
, 0x10, lParam
);
1007 SendMessage(hWnd
, WM_CHAR
, '?', lParam
); // this is not a wincalc keystroke
1010 case ID_CALC_SQUARE
:
1011 SendMessage(hWnd
, WM_CHAR
, '@', lParam
);
1015 SendMessage(hWnd
, WM_CHAR
, 'p', lParam
);
1019 SendMessage(hWnd
, WM_CHAR
, 'n', lParam
);
1023 SendMessage(hWnd
, WM_CHAR
, 'l', lParam
);
1027 SendMessage(hWnd
, WM_CHAR
, '#', lParam
);
1031 SendMessage(hWnd
, WM_CHAR
, 'y', lParam
);
1035 SendMessage(hWnd
, WM_CHAR
, 's', lParam
);
1039 SendMessage(hWnd
, WM_CHAR
, 'o', lParam
);
1043 SendMessage(hWnd
, WM_CHAR
, 't', lParam
);
1047 SendMessage(hWnd
, WM_CHAR
, '<', lParam
);
1051 SendMessage(hWnd
, WM_CHAR
, '~', lParam
);
1055 SendMessage(hWnd
, WM_CHAR
, '&', lParam
);
1059 SendMessage(hWnd
, WM_CHAR
, '|', lParam
);
1063 SendMessage(hWnd
, WM_CHAR
, '^', lParam
);
1067 SendMessage(hWnd
, WM_CHAR
, ';', lParam
);
1070 case ID_CALC_FACTORIAL
:
1071 SendMessage(hWnd
, WM_CHAR
, '!', lParam
);
1074 case ID_CALC_RECIPROCAL
:
1075 SendMessage(hWnd
, WM_CHAR
, 'r', lParam
);
1079 SendMessage(hWnd
, WM_KEYDOWN
, VK_F9
, lParam
);
1083 SendMessage(hWnd
, WM_CHAR
, '+', lParam
);
1087 SendMessage(hWnd
, WM_CHAR
, '-', lParam
);
1090 case ID_CALC_MULTIPLY
:
1091 SendMessage(hWnd
, WM_CHAR
, '*', lParam
);
1094 case ID_CALC_DIVIDE
:
1095 SendMessage(hWnd
, WM_CHAR
, '/', lParam
);
1098 case ID_CALC_EQUALS
:
1099 SendMessage(hWnd
, WM_CHAR
, '=', lParam
);
1102 case ID_CALC_PERCENT
:
1103 SendMessage(hWnd
, WM_CHAR
, '%', lParam
);
1107 SendMessage(hWnd
, WM_CHAR
, 'x', lParam
);
1111 SendMessage(hWnd
, WM_CHAR
, 'v', lParam
);
1114 case ID_CALC_LEFTPAREN
:
1115 SendMessage(hWnd
, WM_CHAR
, '(', lParam
);
1118 case ID_CALC_RIGHTPAREN
:
1119 SendMessage(hWnd
, WM_CHAR
, ')', lParam
);
1123 SendMessage(hWnd
, WM_CHAR
, '%', lParam
);
1127 SendMessage(hWnd
, WM_KEYDOWN
, VK_INSERT
, lParam
);
1131 SendMessage(hWnd
, WM_CHAR
, '\x01', lParam
); // Ctrl+A
1135 SendMessage(hWnd
, WM_CHAR
, '\x04', lParam
); // Ctrl+D
1139 SendMessage(hWnd
, WM_CHAR
, '\x13', lParam
); // Ctrl+S
1143 SendMessage(hWnd
, WM_CHAR
, '\x14', lParam
); // Ctrl+T
1147 SendMessage(hWnd
, WM_CHAR
, 'm', lParam
);
1153 } // button message switch
1159 show_debug(&calc
, "After WM_CHAR", wParam
, lParam
);
1164 } // WM_COMMAND switch
1165 } // Main Message switch
1166 return( DefWindowProc( hWnd
, msg
, wParam
, lParam
));
1173 // initialize keys lut for validating keystrokes in various number bases
1175 for (i
='0';i
<='9';i
++) {
1176 keys
[NBASE_HEX
][i
] = 1;
1177 keys
[NBASE_DECIMAL
][i
] = 1;
1180 keys
[NBASE_OCTAL
][i
] = 1;
1183 keys
[NBASE_BINARY
][i
] = 1;
1186 for (i
='a';i
<='f';i
++)
1187 keys
[NBASE_HEX
][i
] = 1;
1189 for (i
='A';i
<='F';i
++)
1190 keys
[NBASE_HEX
][i
] = 1;
1193 void InitMenus(HINSTANCE hInst
)
1195 if (!(menus
[MENU_STD
] = LoadMenu(hInst
,"MAIN_MENU")))
1198 if (!(menus
[MENU_SCIMS
] = LoadMenu(hInst
,"SCIMS_MENU")))
1201 if (!(menus
[MENU_SCIWS
] = LoadMenu(hInst
,"SCIWS_MENU")))
1204 CheckMenuItem(menus
[MENU_STD
], IDM_MODE_STANDARD
, MF_CHECKED
);
1205 if (calc
.digitGrouping
) {
1206 CheckMenuItem(menus
[MENU_STD
], IDM_DIGIT_GROUPING
, MF_CHECKED
);
1207 CheckMenuItem(menus
[MENU_SCIMS
], IDM_DIGIT_GROUPING
, MF_CHECKED
);
1208 CheckMenuItem(menus
[MENU_SCIWS
], IDM_DIGIT_GROUPING
, MF_CHECKED
);
1211 calc_setmenuitem_radio(menus
[MENU_STD
], IDM_MODE_STANDARD
);
1212 calc_setmenuitem_radio(menus
[MENU_STD
], IDM_MODE_SCIENTIFIC
);
1215 calc_setmenuitem_radio(menus
[MENU_SCIMS
], IDM_MODE_STANDARD
);
1216 calc_setmenuitem_radio(menus
[MENU_SCIMS
], IDM_MODE_SCIENTIFIC
);
1218 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_NS_HEX
);
1219 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_NS_DEC
);
1220 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_NS_OCT
);
1221 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_NS_BIN
);
1223 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_MS_DEGREES
);
1224 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_MS_RADIANS
);
1225 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_MS_GRADS
);
1226 CheckMenuItem(menus
[MENU_SCIMS
], IDM_MODE_SCIENTIFIC
, MF_CHECKED
);
1227 CheckMenuItem(menus
[MENU_SCIMS
], ID_CALC_NS_DEC
, MF_CHECKED
);
1228 CheckMenuItem(menus
[MENU_SCIMS
], ID_CALC_MS_DEGREES
, MF_CHECKED
);
1231 calc_setmenuitem_radio(menus
[MENU_SCIWS
], IDM_MODE_STANDARD
);
1232 calc_setmenuitem_radio(menus
[MENU_SCIWS
], IDM_MODE_SCIENTIFIC
);
1234 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_NS_HEX
);
1235 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_NS_DEC
);
1236 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_NS_OCT
);
1237 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_NS_BIN
);
1239 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_WS_QWORD
);
1240 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_WS_DWORD
);
1241 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_WS_WORD
);
1242 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_WS_BYTE
);
1243 CheckMenuItem(menus
[MENU_SCIWS
], IDM_MODE_SCIENTIFIC
, MF_CHECKED
);
1244 CheckMenuItem(menus
[MENU_SCIWS
], ID_CALC_NS_DEC
, MF_CHECKED
);
1245 CheckMenuItem(menus
[MENU_SCIWS
], ID_CALC_WS_QWORD
, MF_CHECKED
);
1248 void InitCalc (CALC
*calc
)
1255 HINSTANCE hInst
= calc
->hInst
;
1256 HFONT hFont
= GetStockObject(DEFAULT_GUI_FONT
);
1258 calc
->trigMode
= TRIGMODE_DEGREES
;
1259 calc
->numBase
= NBASE_DECIMAL
;
1266 calc
->displayMode
= 0;
1267 calc
->buffer
[0] = '\0';
1268 strcpy(calc
->display
, "0.");
1273 calc
->wordSize
= WORDSIZE_QWORD
;
1278 if (calc
->sciMode
) {
1279 calc
->numButtons
= CALC_BUTTONS_STANDARD
;
1283 skipx
= MARGIN_LEFT
;
1284 skipy
= CALC_STANDARD_MARGIN_TOP
+ CALC_EDIT_HEIGHT
;
1287 strcpy(calc
->cb
[0].label
,"FILLER");
1288 calc
->cb
[0].color
= CALC_COLOR_BLUE
;
1289 calc
->cb
[0].r
.left
= skipx
+ 4;
1290 calc
->cb
[0].r
.top
= skipy
+ 2;
1291 calc
->cb
[0].r
.right
= skipx
+ SZ_FILLER_X
- 2;
1292 calc
->cb
[0].r
.bottom
= skipy
+ SZ_FILLER_Y
- 2;
1293 calc
->cb
[0].enable
= 1;
1295 skipx
= SZ_FILLER_X
+ MARGIN_STANDARD_BIG_X
+ 11;
1297 calc
->cb
[1].id
= ID_CALC_BACKSPACE
;
1298 LoadString( hInst
, IDS_BTN_BACKSPACE
, calc
->cb
[1].label
, sizeof(calc
->cb
[1].label
));
1299 calc
->cb
[1].color
= CALC_COLOR_RED
;
1300 calc
->cb
[1].r
.left
= skipx
;
1301 calc
->cb
[1].r
.top
= skipy
;
1302 calc
->cb
[1].r
.right
= SZ_BIGBTN_X
;
1303 calc
->cb
[1].r
.bottom
= SZ_BIGBTN_Y
;
1304 calc
->cb
[1].enable
= 1;
1306 skipx
+= SZ_BIGBTN_X
+ MARGIN_SMALL_X
;
1308 calc
->cb
[2].id
= ID_CALC_CLEAR_ENTRY
;
1309 LoadString( hInst
, IDS_BTN_CLEAR_ENTRY
, calc
->cb
[2].label
, sizeof(calc
->cb
[2].label
));
1310 calc
->cb
[2].color
= CALC_COLOR_RED
;
1311 calc
->cb
[2].r
.left
= skipx
;
1312 calc
->cb
[2].r
.top
= skipy
;
1313 calc
->cb
[2].r
.right
= SZ_BIGBTN_X
;
1314 calc
->cb
[2].r
.bottom
= SZ_BIGBTN_Y
;
1315 calc
->cb
[2].enable
= 1;
1317 skipx
+= SZ_BIGBTN_X
+ MARGIN_SMALL_X
;
1319 calc
->cb
[3].id
= ID_CALC_CLEAR_ALL
;
1320 LoadString( hInst
, IDS_BTN_CLEAR_ALL
, calc
->cb
[3].label
, sizeof(calc
->cb
[3].label
));
1321 calc
->cb
[3].color
= CALC_COLOR_RED
;
1322 calc
->cb
[3].r
.left
= skipx
;
1323 calc
->cb
[3].r
.top
= skipy
;
1324 calc
->cb
[3].r
.right
= SZ_BIGBTN_X
;
1325 calc
->cb
[3].r
.bottom
= SZ_BIGBTN_Y
;
1326 calc
->cb
[3].enable
= 1;
1330 skipx
= MARGIN_LEFT
;
1331 skipy
+= SZ_BIGBTN_Y
+ MARGIN_BIG_Y
;
1333 calc
->cb
[4].id
= ID_CALC_MEM_CLEAR
;
1334 LoadString( hInst
, IDS_BTN_MEM_CLEAR
, calc
->cb
[4].label
, sizeof(calc
->cb
[4].label
));
1335 calc
->cb
[4].color
= CALC_COLOR_RED
;
1336 calc
->cb
[4].r
.left
= skipx
;
1337 calc
->cb
[4].r
.top
= skipy
;
1338 calc
->cb
[4].r
.right
= SZ_MEDBTN_X
;
1339 calc
->cb
[4].r
.bottom
= SZ_MEDBTN_Y
;
1340 calc
->cb
[4].enable
= 1;
1342 skipx
+= SZ_MEDBTN_X
+ MARGIN_STANDARD_BIG_X
;
1344 calc
->cb
[5].id
= ID_CALC_SEVEN
;
1345 strcpy(calc
->cb
[5].label
,"7");
1346 calc
->cb
[5].color
= CALC_COLOR_BLUE
;
1347 calc
->cb
[5].r
.left
= skipx
;
1348 calc
->cb
[5].r
.top
= skipy
;
1349 calc
->cb
[5].r
.right
= SZ_MEDBTN_X
;
1350 calc
->cb
[5].r
.bottom
= SZ_MEDBTN_Y
;
1351 calc
->cb
[5].enable
= 1;
1353 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1355 calc
->cb
[6].id
= ID_CALC_EIGHT
;
1356 strcpy(calc
->cb
[6].label
,"8");
1357 calc
->cb
[6].color
= CALC_COLOR_BLUE
;
1358 calc
->cb
[6].r
.left
= skipx
;
1359 calc
->cb
[6].r
.top
= skipy
;
1360 calc
->cb
[6].r
.right
= SZ_MEDBTN_X
;
1361 calc
->cb
[6].r
.bottom
= SZ_MEDBTN_Y
;
1362 calc
->cb
[6].enable
= 1;
1364 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1366 calc
->cb
[7].id
= ID_CALC_NINE
;
1367 strcpy(calc
->cb
[7].label
,"9");
1368 calc
->cb
[7].color
= CALC_COLOR_BLUE
;
1369 calc
->cb
[7].r
.left
= skipx
;
1370 calc
->cb
[7].r
.top
= skipy
;
1371 calc
->cb
[7].r
.right
= SZ_MEDBTN_X
;
1372 calc
->cb
[7].r
.bottom
= SZ_MEDBTN_Y
;
1373 calc
->cb
[7].enable
= 1;
1375 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1377 calc
->cb
[8].id
= ID_CALC_DIVIDE
;
1378 strcpy(calc
->cb
[8].label
,"/");
1379 calc
->cb
[8].color
= CALC_COLOR_RED
;
1380 calc
->cb
[8].r
.left
= skipx
;
1381 calc
->cb
[8].r
.top
= skipy
;
1382 calc
->cb
[8].r
.right
= SZ_MEDBTN_X
;
1383 calc
->cb
[8].r
.bottom
= SZ_MEDBTN_Y
;
1384 calc
->cb
[8].enable
= 1;
1386 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1388 calc
->cb
[9].id
= ID_CALC_SQRT
;
1389 LoadString( hInst
, IDS_BTN_SQRT
, calc
->cb
[9].label
, sizeof(calc
->cb
[9].label
));
1390 calc
->cb
[9].color
= CALC_COLOR_BLUE
;
1391 calc
->cb
[9].r
.left
= skipx
;
1392 calc
->cb
[9].r
.top
= skipy
;
1393 calc
->cb
[9].r
.right
= SZ_MEDBTN_X
;
1394 calc
->cb
[9].r
.bottom
= SZ_MEDBTN_Y
;
1395 calc
->cb
[9].enable
= 1;
1399 skipx
= MARGIN_LEFT
;
1400 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1402 calc
->cb
[10].id
= ID_CALC_MEM_RECALL
;
1403 LoadString( hInst
, IDS_BTN_MEM_RECALL
, calc
->cb
[10].label
, sizeof(calc
->cb
[10].label
));
1404 calc
->cb
[10].color
= CALC_COLOR_RED
;
1405 calc
->cb
[10].r
.left
= skipx
;
1406 calc
->cb
[10].r
.top
= skipy
;
1407 calc
->cb
[10].r
.right
= SZ_MEDBTN_X
;
1408 calc
->cb
[10].r
.bottom
= SZ_MEDBTN_Y
;
1409 calc
->cb
[10].enable
= 1;
1411 skipx
+= SZ_MEDBTN_X
+ MARGIN_STANDARD_BIG_X
;
1413 calc
->cb
[11].id
= ID_CALC_FOUR
;
1414 strcpy(calc
->cb
[11].label
,"4");
1415 calc
->cb
[11].color
= CALC_COLOR_BLUE
;
1416 calc
->cb
[11].r
.left
= skipx
;
1417 calc
->cb
[11].r
.top
= skipy
;
1418 calc
->cb
[11].r
.right
= SZ_MEDBTN_X
;
1419 calc
->cb
[11].r
.bottom
= SZ_MEDBTN_Y
;
1420 calc
->cb
[11].enable
= 1;
1422 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1424 calc
->cb
[12].id
= ID_CALC_FIVE
;
1425 strcpy(calc
->cb
[12].label
,"5");
1426 calc
->cb
[12].color
= CALC_COLOR_BLUE
;
1427 calc
->cb
[12].r
.left
= skipx
;
1428 calc
->cb
[12].r
.top
= skipy
;
1429 calc
->cb
[12].r
.right
= SZ_MEDBTN_X
;
1430 calc
->cb
[12].r
.bottom
= SZ_MEDBTN_Y
;
1431 calc
->cb
[12].enable
= 1;
1433 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1435 calc
->cb
[13].id
= ID_CALC_SIX
;
1436 strcpy(calc
->cb
[13].label
,"6");
1437 calc
->cb
[13].color
= CALC_COLOR_BLUE
;
1438 calc
->cb
[13].r
.left
= skipx
;
1439 calc
->cb
[13].r
.top
= skipy
;
1440 calc
->cb
[13].r
.right
= SZ_MEDBTN_X
;
1441 calc
->cb
[13].r
.bottom
= SZ_MEDBTN_Y
;
1442 calc
->cb
[13].enable
= 1;
1444 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1446 calc
->cb
[14].id
= ID_CALC_MULTIPLY
;
1447 strcpy(calc
->cb
[14].label
,"*");
1448 calc
->cb
[14].color
= CALC_COLOR_RED
;
1449 calc
->cb
[14].r
.left
= skipx
;
1450 calc
->cb
[14].r
.top
= skipy
;
1451 calc
->cb
[14].r
.right
= SZ_MEDBTN_X
;
1452 calc
->cb
[14].r
.bottom
= SZ_MEDBTN_Y
;
1453 calc
->cb
[14].enable
= 1;
1455 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1457 calc
->cb
[15].id
= ID_CALC_PERCENT
;
1458 strcpy(calc
->cb
[15].label
,"%");
1459 calc
->cb
[15].color
= CALC_COLOR_BLUE
;
1460 calc
->cb
[15].r
.left
= skipx
;
1461 calc
->cb
[15].r
.top
= skipy
;
1462 calc
->cb
[15].r
.right
= SZ_MEDBTN_X
;
1463 calc
->cb
[15].r
.bottom
= SZ_MEDBTN_Y
;
1464 calc
->cb
[15].enable
= 1;
1468 skipx
= MARGIN_LEFT
;
1469 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1471 calc
->cb
[16].id
= ID_CALC_MEM_STORE
;
1472 LoadString( hInst
, IDS_BTN_MEM_STORE
, calc
->cb
[16].label
, sizeof(calc
->cb
[16].label
));
1473 calc
->cb
[16].color
= CALC_COLOR_RED
;
1474 calc
->cb
[16].r
.left
= skipx
;
1475 calc
->cb
[16].r
.top
= skipy
;
1476 calc
->cb
[16].r
.right
= SZ_MEDBTN_X
;
1477 calc
->cb
[16].r
.bottom
= SZ_MEDBTN_Y
;
1478 calc
->cb
[16].enable
= 1;
1480 skipx
+= SZ_MEDBTN_X
+ MARGIN_STANDARD_BIG_X
;
1482 calc
->cb
[17].id
= ID_CALC_ONE
;
1483 strcpy(calc
->cb
[17].label
,"1");
1484 calc
->cb
[17].color
= CALC_COLOR_BLUE
;
1485 calc
->cb
[17].r
.left
= skipx
;
1486 calc
->cb
[17].r
.top
= skipy
;
1487 calc
->cb
[17].r
.right
= SZ_MEDBTN_X
;
1488 calc
->cb
[17].r
.bottom
= SZ_MEDBTN_Y
;
1489 calc
->cb
[17].enable
= 1;
1491 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1493 calc
->cb
[18].id
= ID_CALC_TWO
;
1494 strcpy(calc
->cb
[18].label
,"2");
1495 calc
->cb
[18].color
= CALC_COLOR_BLUE
;
1496 calc
->cb
[18].r
.left
= skipx
;
1497 calc
->cb
[18].r
.top
= skipy
;
1498 calc
->cb
[18].r
.right
= SZ_MEDBTN_X
;
1499 calc
->cb
[18].r
.bottom
= SZ_MEDBTN_Y
;
1500 calc
->cb
[18].enable
= 1;
1502 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1504 calc
->cb
[19].id
= ID_CALC_THREE
;
1505 strcpy(calc
->cb
[19].label
,"3");
1506 calc
->cb
[19].color
= CALC_COLOR_BLUE
;
1507 calc
->cb
[19].r
.left
= skipx
;
1508 calc
->cb
[19].r
.top
= skipy
;
1509 calc
->cb
[19].r
.right
= SZ_MEDBTN_X
;
1510 calc
->cb
[19].r
.bottom
= SZ_MEDBTN_Y
;
1511 calc
->cb
[19].enable
= 1;
1513 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1515 calc
->cb
[20].id
= ID_CALC_MINUS
;
1516 strcpy(calc
->cb
[20].label
,"-");
1517 calc
->cb
[20].color
= CALC_COLOR_RED
;
1518 calc
->cb
[20].r
.left
= skipx
;
1519 calc
->cb
[20].r
.top
= skipy
;
1520 calc
->cb
[20].r
.right
= SZ_MEDBTN_X
;
1521 calc
->cb
[20].r
.bottom
= SZ_MEDBTN_Y
;
1522 calc
->cb
[20].enable
= 1;
1524 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1526 calc
->cb
[21].id
= ID_CALC_RECIPROCAL
;
1527 strcpy(calc
->cb
[21].label
,"1/x");
1528 calc
->cb
[21].color
= CALC_COLOR_RED
;
1529 calc
->cb
[21].r
.left
= skipx
;
1530 calc
->cb
[21].r
.top
= skipy
;
1531 calc
->cb
[21].r
.right
= SZ_MEDBTN_X
;
1532 calc
->cb
[21].r
.bottom
= SZ_MEDBTN_Y
;
1533 calc
->cb
[21].enable
= 1;
1537 skipx
= MARGIN_LEFT
;
1538 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1540 calc
->cb
[22].id
= ID_CALC_MEM_PLUS
;
1541 LoadString( hInst
, IDS_BTN_MEM_PLUS
, calc
->cb
[22].label
, sizeof(calc
->cb
[22].label
));
1542 calc
->cb
[22].color
= CALC_COLOR_RED
;
1543 calc
->cb
[22].r
.left
= skipx
;
1544 calc
->cb
[22].r
.top
= skipy
;
1545 calc
->cb
[22].r
.right
= SZ_MEDBTN_X
;
1546 calc
->cb
[22].r
.bottom
= SZ_MEDBTN_Y
;
1547 calc
->cb
[22].enable
= 1;
1549 skipx
+= SZ_MEDBTN_X
+ MARGIN_STANDARD_BIG_X
;
1551 calc
->cb
[23].id
= ID_CALC_ZERO
;
1552 strcpy(calc
->cb
[23].label
,"0");
1553 calc
->cb
[23].color
= CALC_COLOR_BLUE
;
1554 calc
->cb
[23].r
.left
= skipx
;
1555 calc
->cb
[23].r
.top
= skipy
;
1556 calc
->cb
[23].r
.right
= SZ_MEDBTN_X
;
1557 calc
->cb
[23].r
.bottom
= SZ_MEDBTN_Y
;
1558 calc
->cb
[23].enable
= 1;
1560 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1562 calc
->cb
[24].id
= ID_CALC_SIGN
;
1563 strcpy(calc
->cb
[24].label
,"+/-");
1564 calc
->cb
[24].color
= CALC_COLOR_RED
;
1565 calc
->cb
[24].r
.left
= skipx
;
1566 calc
->cb
[24].r
.top
= skipy
;
1567 calc
->cb
[24].r
.right
= SZ_MEDBTN_X
;
1568 calc
->cb
[24].r
.bottom
= SZ_MEDBTN_Y
;
1569 calc
->cb
[24].enable
= 1;
1571 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1573 calc
->cb
[25].id
= ID_CALC_DECIMAL
;
1574 strcpy(calc
->cb
[25].label
,".");
1575 calc
->cb
[25].color
= CALC_COLOR_BLUE
;
1576 calc
->cb
[25].r
.left
= skipx
;
1577 calc
->cb
[25].r
.top
= skipy
;
1578 calc
->cb
[25].r
.right
= SZ_MEDBTN_X
;
1579 calc
->cb
[25].r
.bottom
= SZ_MEDBTN_Y
;
1580 calc
->cb
[25].enable
= 1;
1582 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1584 calc
->cb
[26].id
= ID_CALC_PLUS
;
1585 strcpy(calc
->cb
[26].label
,"+");
1586 calc
->cb
[26].color
= CALC_COLOR_RED
;
1587 calc
->cb
[26].r
.left
= skipx
;
1588 calc
->cb
[26].r
.top
= skipy
;
1589 calc
->cb
[26].r
.right
= SZ_MEDBTN_X
;
1590 calc
->cb
[26].r
.bottom
= SZ_MEDBTN_Y
;
1591 calc
->cb
[26].enable
= 1;
1593 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1595 calc
->cb
[27].id
= ID_CALC_EQUALS
;
1596 strcpy(calc
->cb
[27].label
,"=");
1597 calc
->cb
[27].color
= CALC_COLOR_RED
;
1598 calc
->cb
[27].r
.left
= skipx
;
1599 calc
->cb
[27].r
.top
= skipy
;
1600 calc
->cb
[27].r
.right
= SZ_MEDBTN_X
;
1601 calc
->cb
[27].r
.bottom
= SZ_MEDBTN_Y
;
1602 calc
->cb
[27].enable
= 1;
1605 calc
->numButtons
= CALC_BUTTONS_SCIENTIFIC
;
1609 skipx
= MARGIN_LEFT
;
1610 skipy
= CALC_SCIENTIFIC_MARGIN_TOP
+ CALC_EDIT_HEIGHT
- 1;
1613 strcpy(calc
->cb
[0].label
,"FILLER");
1614 calc
->cb
[0].color
= CALC_COLOR_BLUE
;
1615 calc
->cb
[0].r
.left
= skipx
+ 4 * SZ_MEDBTN_X
+ 2 * SZ_SPACER_X
+ 2 * MARGIN_SMALL_X
+ 12;
1616 calc
->cb
[0].r
.top
= skipy
;
1617 calc
->cb
[0].r
.right
= skipx
+ 4 * SZ_MEDBTN_X
+ 2 * SZ_SPACER_X
+ 2 * MARGIN_SMALL_X
+ SZ_FILLER_X
+ 4;
1618 calc
->cb
[0].r
.bottom
= skipy
+ SZ_FILLER_Y
- 6;
1619 calc
->cb
[0].enable
= 1;
1622 strcpy(calc
->cb
[1].label
,"FILLER");
1623 calc
->cb
[1].color
= CALC_COLOR_BLUE
;
1624 calc
->cb
[1].r
.left
= skipx
+ 3 * SZ_MEDBTN_X
+ SZ_SPACER_X
+ 2 * MARGIN_SMALL_X
+ 8;
1625 calc
->cb
[1].r
.top
= skipy
;
1626 calc
->cb
[1].r
.right
= skipx
+ 3 * SZ_MEDBTN_X
+ SZ_SPACER_X
+ 2 * MARGIN_SMALL_X
+ SZ_FILLER_X
+ 0;
1627 calc
->cb
[1].r
.bottom
= skipy
+ SZ_FILLER_Y
- 6;
1628 calc
->cb
[1].enable
= 1;
1630 skipx
+= SZ_FILLER_X
+ MARGIN_SMALL_X
;
1632 skipx
= MARGIN_BIG_X
;
1634 calc
->cb
[2].id
= ID_CALC_BACKSPACE
;
1635 LoadString( hInst
, IDS_BTN_BACKSPACE
, calc
->cb
[2].label
, sizeof(calc
->cb
[2].label
));
1636 calc
->cb
[2].color
= CALC_COLOR_RED
;
1637 calc
->cb
[2].r
.left
= skipx
;
1638 calc
->cb
[2].r
.top
= skipy
;
1639 calc
->cb
[2].r
.right
= SZ_BIGBTN_X
;
1640 calc
->cb
[2].r
.bottom
= SZ_BIGBTN_Y
;
1641 calc
->cb
[2].enable
= 1;
1643 skipx
+= SZ_BIGBTN_X
+ MARGIN_SMALL_X
;
1645 calc
->cb
[3].id
= ID_CALC_CLEAR_ENTRY
;
1646 LoadString( hInst
, IDS_BTN_CLEAR_ENTRY
, calc
->cb
[3].label
, sizeof(calc
->cb
[3].label
));
1647 calc
->cb
[3].color
= CALC_COLOR_RED
;
1648 calc
->cb
[3].r
.left
= skipx
;
1649 calc
->cb
[3].r
.top
= skipy
;
1650 calc
->cb
[3].r
.right
= SZ_BIGBTN_X
;
1651 calc
->cb
[3].r
.bottom
= SZ_BIGBTN_Y
;
1652 calc
->cb
[3].enable
= 1;
1654 skipx
+= SZ_BIGBTN_X
+ MARGIN_SMALL_X
;
1656 calc
->cb
[4].id
= ID_CALC_CLEAR_ALL
;
1657 LoadString( hInst
, IDS_BTN_CLEAR_ALL
, calc
->cb
[4].label
, sizeof(calc
->cb
[4].label
));
1658 calc
->cb
[4].color
= CALC_COLOR_RED
;
1659 calc
->cb
[4].r
.left
= skipx
;
1660 calc
->cb
[4].r
.top
= skipy
;
1661 calc
->cb
[4].r
.right
= SZ_BIGBTN_X
;
1662 calc
->cb
[4].r
.bottom
= SZ_BIGBTN_Y
;
1663 calc
->cb
[4].enable
= 1;
1667 skipx
= MARGIN_LEFT
;
1668 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1670 calc
->cb
[5].id
= ID_CALC_STA
;
1671 strcpy(calc
->cb
[5].label
,"Sta");
1672 calc
->cb
[5].color
= CALC_COLOR_GRAY
;
1673 calc
->cb
[5].r
.left
= skipx
;
1674 calc
->cb
[5].r
.top
= skipy
;
1675 calc
->cb
[5].r
.right
= SZ_MEDBTN_X
;
1676 calc
->cb
[5].r
.bottom
= SZ_MEDBTN_Y
;
1677 calc
->cb
[5].enable
= 1;
1679 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1681 calc
->cb
[6].id
= ID_CALC_FE
;
1682 strcpy(calc
->cb
[6].label
,"F-E");
1683 calc
->cb
[6].color
= CALC_COLOR_MAGENTA
;
1684 calc
->cb
[6].r
.left
= skipx
;
1685 calc
->cb
[6].r
.top
= skipy
;
1686 calc
->cb
[6].r
.right
= SZ_MEDBTN_X
;
1687 calc
->cb
[6].r
.bottom
= SZ_MEDBTN_Y
;
1688 calc
->cb
[6].enable
= 1;
1690 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1692 calc
->cb
[7].id
= ID_CALC_LEFTPAREN
;
1693 strcpy(calc
->cb
[7].label
,"(");
1694 calc
->cb
[7].color
= CALC_COLOR_MAGENTA
;
1695 calc
->cb
[7].r
.left
= skipx
;
1696 calc
->cb
[7].r
.top
= skipy
;
1697 calc
->cb
[7].r
.right
= SZ_MEDBTN_X
;
1698 calc
->cb
[7].r
.bottom
= SZ_MEDBTN_Y
;
1699 calc
->cb
[7].enable
= 0;
1701 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1703 calc
->cb
[8].id
= ID_CALC_RIGHTPAREN
;
1704 strcpy(calc
->cb
[8].label
,")");
1705 calc
->cb
[8].color
= CALC_COLOR_MAGENTA
;
1706 calc
->cb
[8].r
.left
= skipx
;
1707 calc
->cb
[8].r
.top
= skipy
;
1708 calc
->cb
[8].r
.right
= SZ_MEDBTN_X
;
1709 calc
->cb
[8].r
.bottom
= SZ_MEDBTN_Y
;
1710 calc
->cb
[8].enable
= 0;
1712 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1714 calc
->cb
[9].id
= ID_CALC_MEM_CLEAR
;
1715 LoadString( hInst
, IDS_BTN_MEM_CLEAR
, calc
->cb
[9].label
, sizeof(calc
->cb
[9].label
));
1716 calc
->cb
[9].color
= CALC_COLOR_RED
;
1717 calc
->cb
[9].r
.left
= skipx
;
1718 calc
->cb
[9].r
.top
= skipy
;
1719 calc
->cb
[9].r
.right
= SZ_MEDBTN_X
;
1720 calc
->cb
[9].r
.bottom
= SZ_MEDBTN_Y
;
1721 calc
->cb
[9].enable
= 1;
1723 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1725 calc
->cb
[10].id
= ID_CALC_SEVEN
;
1726 strcpy(calc
->cb
[10].label
,"7");
1727 calc
->cb
[10].color
= CALC_COLOR_BLUE
;
1728 calc
->cb
[10].r
.left
= skipx
;
1729 calc
->cb
[10].r
.top
= skipy
;
1730 calc
->cb
[10].r
.right
= SZ_MEDBTN_X
;
1731 calc
->cb
[10].r
.bottom
= SZ_MEDBTN_Y
;
1732 calc
->cb
[10].enable
= 1;
1734 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1736 calc
->cb
[11].id
= ID_CALC_EIGHT
;
1737 strcpy(calc
->cb
[11].label
,"8");
1738 calc
->cb
[11].color
= CALC_COLOR_BLUE
;
1739 calc
->cb
[11].r
.left
= skipx
;
1740 calc
->cb
[11].r
.top
= skipy
;
1741 calc
->cb
[11].r
.right
= SZ_MEDBTN_X
;
1742 calc
->cb
[11].r
.bottom
= SZ_MEDBTN_Y
;
1743 calc
->cb
[11].enable
= 1;
1745 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1747 calc
->cb
[12].id
= ID_CALC_NINE
;
1748 strcpy(calc
->cb
[12].label
,"9");
1749 calc
->cb
[12].color
= CALC_COLOR_BLUE
;
1750 calc
->cb
[12].r
.left
= skipx
;
1751 calc
->cb
[12].r
.top
= skipy
;
1752 calc
->cb
[12].r
.right
= SZ_MEDBTN_X
;
1753 calc
->cb
[12].r
.bottom
= SZ_MEDBTN_Y
;
1754 calc
->cb
[12].enable
= 1;
1756 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1758 calc
->cb
[13].id
= ID_CALC_DIVIDE
;
1759 strcpy(calc
->cb
[13].label
,"/");
1760 calc
->cb
[13].color
= CALC_COLOR_RED
;
1761 calc
->cb
[13].r
.left
= skipx
;
1762 calc
->cb
[13].r
.top
= skipy
;
1763 calc
->cb
[13].r
.right
= SZ_MEDBTN_X
;
1764 calc
->cb
[13].r
.bottom
= SZ_MEDBTN_Y
;
1765 calc
->cb
[13].enable
= 1;
1767 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1769 calc
->cb
[14].id
= ID_CALC_MOD
;
1770 strcpy(calc
->cb
[14].label
,"Mod");
1771 calc
->cb
[14].color
= CALC_COLOR_RED
;
1772 calc
->cb
[14].r
.left
= skipx
;
1773 calc
->cb
[14].r
.top
= skipy
;
1774 calc
->cb
[14].r
.right
= SZ_MEDBTN_X
;
1775 calc
->cb
[14].r
.bottom
= SZ_MEDBTN_Y
;
1776 calc
->cb
[14].enable
= 1;
1778 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1780 calc
->cb
[15].id
= ID_CALC_AND
;
1781 strcpy(calc
->cb
[15].label
,"And");
1782 calc
->cb
[15].color
= CALC_COLOR_RED
;
1783 calc
->cb
[15].r
.left
= skipx
;
1784 calc
->cb
[15].r
.top
= skipy
;
1785 calc
->cb
[15].r
.right
= SZ_MEDBTN_X
;
1786 calc
->cb
[15].r
.bottom
= SZ_MEDBTN_Y
;
1787 calc
->cb
[15].enable
= 1;
1791 skipx
= MARGIN_LEFT
;
1792 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1794 calc
->cb
[16].id
= ID_CALC_AVE
;
1795 strcpy(calc
->cb
[16].label
,"Ave");
1796 calc
->cb
[16].color
= CALC_COLOR_GRAY
;
1797 calc
->cb
[16].r
.left
= skipx
;
1798 calc
->cb
[16].r
.top
= skipy
;
1799 calc
->cb
[16].r
.right
= SZ_MEDBTN_X
;
1800 calc
->cb
[16].r
.bottom
= SZ_MEDBTN_Y
;
1801 calc
->cb
[16].enable
= 0;
1803 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1805 calc
->cb
[17].id
= ID_CALC_DMS
;
1806 strcpy(calc
->cb
[17].label
,"dms");
1807 calc
->cb
[17].color
= CALC_COLOR_MAGENTA
;
1808 calc
->cb
[17].r
.left
= skipx
;
1809 calc
->cb
[17].r
.top
= skipy
;
1810 calc
->cb
[17].r
.right
= SZ_MEDBTN_X
;
1811 calc
->cb
[17].r
.bottom
= SZ_MEDBTN_Y
;
1812 calc
->cb
[17].enable
= 1;
1814 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1816 calc
->cb
[18].id
= ID_CALC_EXP
;
1817 strcpy(calc
->cb
[18].label
,"Exp");
1818 calc
->cb
[18].color
= CALC_COLOR_MAGENTA
;
1819 calc
->cb
[18].r
.left
= skipx
;
1820 calc
->cb
[18].r
.top
= skipy
;
1821 calc
->cb
[18].r
.right
= SZ_MEDBTN_X
;
1822 calc
->cb
[18].r
.bottom
= SZ_MEDBTN_Y
;
1823 calc
->cb
[18].enable
= 1;
1825 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1827 calc
->cb
[19].id
= ID_CALC_LN
;
1828 strcpy(calc
->cb
[19].label
,"ln");
1829 calc
->cb
[19].color
= CALC_COLOR_MAGENTA
;
1830 calc
->cb
[19].r
.left
= skipx
;
1831 calc
->cb
[19].r
.top
= skipy
;
1832 calc
->cb
[19].r
.right
= SZ_MEDBTN_X
;
1833 calc
->cb
[19].r
.bottom
= SZ_MEDBTN_Y
;
1834 calc
->cb
[19].enable
= 1;
1836 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1838 calc
->cb
[20].id
= ID_CALC_MEM_RECALL
;
1839 strcpy(calc
->cb
[20].label
,"MR");
1840 calc
->cb
[20].color
= CALC_COLOR_RED
;
1841 calc
->cb
[20].r
.left
= skipx
;
1842 calc
->cb
[20].r
.top
= skipy
;
1843 calc
->cb
[20].r
.right
= SZ_MEDBTN_X
;
1844 calc
->cb
[20].r
.bottom
= SZ_MEDBTN_Y
;
1845 calc
->cb
[20].enable
= 1;
1847 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1849 calc
->cb
[21].id
= ID_CALC_FOUR
;
1850 strcpy(calc
->cb
[21].label
,"4");
1851 calc
->cb
[21].color
= CALC_COLOR_BLUE
;
1852 calc
->cb
[21].r
.left
= skipx
;
1853 calc
->cb
[21].r
.top
= skipy
;
1854 calc
->cb
[21].r
.right
= SZ_MEDBTN_X
;
1855 calc
->cb
[21].r
.bottom
= SZ_MEDBTN_Y
;
1856 calc
->cb
[21].enable
= 1;
1858 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1860 calc
->cb
[22].id
= ID_CALC_FIVE
;
1861 strcpy(calc
->cb
[22].label
,"5");
1862 calc
->cb
[22].color
= CALC_COLOR_BLUE
;
1863 calc
->cb
[22].r
.left
= skipx
;
1864 calc
->cb
[22].r
.top
= skipy
;
1865 calc
->cb
[22].r
.right
= SZ_MEDBTN_X
;
1866 calc
->cb
[22].r
.bottom
= SZ_MEDBTN_Y
;
1867 calc
->cb
[22].enable
= 1;
1869 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1871 calc
->cb
[23].id
= ID_CALC_SIX
;
1872 strcpy(calc
->cb
[23].label
,"6");
1873 calc
->cb
[23].color
= CALC_COLOR_BLUE
;
1874 calc
->cb
[23].r
.left
= skipx
;
1875 calc
->cb
[23].r
.top
= skipy
;
1876 calc
->cb
[23].r
.right
= SZ_MEDBTN_X
;
1877 calc
->cb
[23].r
.bottom
= SZ_MEDBTN_Y
;
1878 calc
->cb
[23].enable
= 1;
1880 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1882 calc
->cb
[24].id
= ID_CALC_MULTIPLY
;
1883 strcpy(calc
->cb
[24].label
,"*");
1884 calc
->cb
[24].color
= CALC_COLOR_RED
;
1885 calc
->cb
[24].r
.left
= skipx
;
1886 calc
->cb
[24].r
.top
= skipy
;
1887 calc
->cb
[24].r
.right
= SZ_MEDBTN_X
;
1888 calc
->cb
[24].r
.bottom
= SZ_MEDBTN_Y
;
1889 calc
->cb
[24].enable
= 1;
1891 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1893 calc
->cb
[25].id
= ID_CALC_OR
;
1894 strcpy(calc
->cb
[25].label
,"Or");
1895 calc
->cb
[25].color
= CALC_COLOR_RED
;
1896 calc
->cb
[25].r
.left
= skipx
;
1897 calc
->cb
[25].r
.top
= skipy
;
1898 calc
->cb
[25].r
.right
= SZ_MEDBTN_X
;
1899 calc
->cb
[25].r
.bottom
= SZ_MEDBTN_Y
;
1900 calc
->cb
[25].enable
= 1;
1902 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1904 calc
->cb
[26].id
= ID_CALC_XOR
;
1905 strcpy(calc
->cb
[26].label
,"Xor");
1906 calc
->cb
[26].color
= CALC_COLOR_RED
;
1907 calc
->cb
[26].r
.left
= skipx
;
1908 calc
->cb
[26].r
.top
= skipy
;
1909 calc
->cb
[26].r
.right
= SZ_MEDBTN_X
;
1910 calc
->cb
[26].r
.bottom
= SZ_MEDBTN_Y
;
1911 calc
->cb
[26].enable
= 1;
1915 skipx
= MARGIN_LEFT
;
1916 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1918 calc
->cb
[27].id
= ID_CALC_SUM
;
1919 strcpy(calc
->cb
[27].label
,"Sum");
1920 calc
->cb
[27].color
= CALC_COLOR_GRAY
;
1921 calc
->cb
[27].r
.left
= skipx
;
1922 calc
->cb
[27].r
.top
= skipy
;
1923 calc
->cb
[27].r
.right
= SZ_MEDBTN_X
;
1924 calc
->cb
[27].r
.bottom
= SZ_MEDBTN_Y
;
1925 calc
->cb
[27].enable
= 0;
1927 skipx
+= MARGIN_SMALL_X
+ SZ_MEDBTN_X
+ SZ_SPACER_X
;
1929 calc
->cb
[28].id
= ID_CALC_SIN
;
1930 strcpy(calc
->cb
[28].label
,"sin");
1931 calc
->cb
[28].color
= CALC_COLOR_MAGENTA
;
1932 calc
->cb
[28].r
.left
= skipx
;
1933 calc
->cb
[28].r
.top
= skipy
;
1934 calc
->cb
[28].r
.right
= SZ_MEDBTN_X
;
1935 calc
->cb
[28].r
.bottom
= SZ_MEDBTN_Y
;
1936 calc
->cb
[28].enable
= 1;
1938 skipx
+= MARGIN_SMALL_X
+ SZ_MEDBTN_X
;
1940 calc
->cb
[29].id
= ID_CALC_POWER
;
1941 strcpy(calc
->cb
[29].label
,"x^y");
1942 calc
->cb
[29].color
= CALC_COLOR_MAGENTA
;
1943 calc
->cb
[29].r
.left
= skipx
;
1944 calc
->cb
[29].r
.top
= skipy
;
1945 calc
->cb
[29].r
.right
= SZ_MEDBTN_X
;
1946 calc
->cb
[29].r
.bottom
= SZ_MEDBTN_Y
;
1947 calc
->cb
[29].enable
= 1;
1949 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1951 calc
->cb
[30].id
= ID_CALC_LOG10
;
1952 strcpy(calc
->cb
[30].label
,"log");
1953 calc
->cb
[30].color
= CALC_COLOR_MAGENTA
;
1954 calc
->cb
[30].r
.left
= skipx
;
1955 calc
->cb
[30].r
.top
= skipy
;
1956 calc
->cb
[30].r
.right
= SZ_MEDBTN_X
;
1957 calc
->cb
[30].r
.bottom
= SZ_MEDBTN_Y
;
1958 calc
->cb
[30].enable
= 1;
1960 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1962 calc
->cb
[31].id
= ID_CALC_MEM_STORE
;
1963 LoadString( hInst
, IDS_BTN_MEM_STORE
, calc
->cb
[31].label
, sizeof(calc
->cb
[31].label
));
1964 calc
->cb
[31].color
= CALC_COLOR_RED
;
1965 calc
->cb
[31].r
.left
= skipx
;
1966 calc
->cb
[31].r
.top
= skipy
;
1967 calc
->cb
[31].r
.right
= SZ_MEDBTN_X
;
1968 calc
->cb
[31].r
.bottom
= SZ_MEDBTN_Y
;
1969 calc
->cb
[31].enable
= 1;
1971 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1973 calc
->cb
[32].id
= ID_CALC_ONE
;
1974 strcpy(calc
->cb
[32].label
,"1");
1975 calc
->cb
[32].color
= CALC_COLOR_BLUE
;
1976 calc
->cb
[32].r
.left
= skipx
;
1977 calc
->cb
[32].r
.top
= skipy
;
1978 calc
->cb
[32].r
.right
= SZ_MEDBTN_X
;
1979 calc
->cb
[32].r
.bottom
= SZ_MEDBTN_Y
;
1980 calc
->cb
[32].enable
= 1;
1982 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1984 calc
->cb
[33].id
= ID_CALC_TWO
;
1985 strcpy(calc
->cb
[33].label
,"2");
1986 calc
->cb
[33].color
= CALC_COLOR_BLUE
;
1987 calc
->cb
[33].r
.left
= skipx
;
1988 calc
->cb
[33].r
.top
= skipy
;
1989 calc
->cb
[33].r
.right
= SZ_MEDBTN_X
;
1990 calc
->cb
[33].r
.bottom
= SZ_MEDBTN_Y
;
1991 calc
->cb
[33].enable
= 1;
1993 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1995 calc
->cb
[34].id
= ID_CALC_THREE
;
1996 strcpy(calc
->cb
[34].label
,"3");
1997 calc
->cb
[34].color
= CALC_COLOR_BLUE
;
1998 calc
->cb
[34].r
.left
= skipx
;
1999 calc
->cb
[34].r
.top
= skipy
;
2000 calc
->cb
[34].r
.right
= SZ_MEDBTN_X
;
2001 calc
->cb
[34].r
.bottom
= SZ_MEDBTN_Y
;
2002 calc
->cb
[34].enable
= 1;
2004 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2006 calc
->cb
[35].id
= ID_CALC_MINUS
;
2007 strcpy(calc
->cb
[35].label
,"-");
2008 calc
->cb
[35].color
= CALC_COLOR_RED
;
2009 calc
->cb
[35].r
.left
= skipx
;
2010 calc
->cb
[35].r
.top
= skipy
;
2011 calc
->cb
[35].r
.right
= SZ_MEDBTN_X
;
2012 calc
->cb
[35].r
.bottom
= SZ_MEDBTN_Y
;
2013 calc
->cb
[35].enable
= 1;
2015 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2017 calc
->cb
[36].id
= ID_CALC_LSH
;
2018 strcpy(calc
->cb
[36].label
,"Lsh");
2019 calc
->cb
[36].color
= CALC_COLOR_RED
;
2020 calc
->cb
[36].r
.left
= skipx
;
2021 calc
->cb
[36].r
.top
= skipy
;
2022 calc
->cb
[36].r
.right
= SZ_MEDBTN_X
;
2023 calc
->cb
[36].r
.bottom
= SZ_MEDBTN_Y
;
2024 calc
->cb
[36].enable
= 1;
2026 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2028 calc
->cb
[37].id
= ID_CALC_NOT
;
2029 strcpy(calc
->cb
[37].label
,"Not");
2030 calc
->cb
[37].color
= CALC_COLOR_RED
;
2031 calc
->cb
[37].r
.left
= skipx
;
2032 calc
->cb
[37].r
.top
= skipy
;
2033 calc
->cb
[37].r
.right
= SZ_MEDBTN_X
;
2034 calc
->cb
[37].r
.bottom
= SZ_MEDBTN_Y
;
2035 calc
->cb
[37].enable
= 1;
2039 skipx
= MARGIN_LEFT
;
2040 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
2042 calc
->cb
[38].id
= ID_CALC_S
;
2043 strcpy(calc
->cb
[38].label
,"s");
2044 calc
->cb
[38].color
= CALC_COLOR_GRAY
;
2045 calc
->cb
[38].r
.left
= skipx
;
2046 calc
->cb
[38].r
.top
= skipy
;
2047 calc
->cb
[38].r
.right
= SZ_MEDBTN_X
;
2048 calc
->cb
[38].r
.bottom
= SZ_MEDBTN_Y
;
2049 calc
->cb
[38].enable
= 0;
2051 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2053 calc
->cb
[39].id
= ID_CALC_COS
;
2054 strcpy(calc
->cb
[39].label
,"cos");
2055 calc
->cb
[39].color
= CALC_COLOR_MAGENTA
;
2056 calc
->cb
[39].r
.left
= skipx
;
2057 calc
->cb
[39].r
.top
= skipy
;
2058 calc
->cb
[39].r
.right
= SZ_MEDBTN_X
;
2059 calc
->cb
[39].r
.bottom
= SZ_MEDBTN_Y
;
2060 calc
->cb
[39].enable
= 1;
2062 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2064 calc
->cb
[40].id
= ID_CALC_CUBE
;
2065 strcpy(calc
->cb
[40].label
,"x^3");
2066 calc
->cb
[40].color
= CALC_COLOR_MAGENTA
;
2067 calc
->cb
[40].r
.left
= skipx
;
2068 calc
->cb
[40].r
.top
= skipy
;
2069 calc
->cb
[40].r
.right
= SZ_MEDBTN_X
;
2070 calc
->cb
[40].r
.bottom
= SZ_MEDBTN_Y
;
2071 calc
->cb
[40].enable
= 1;
2073 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2075 calc
->cb
[41].id
= ID_CALC_FACTORIAL
;
2076 strcpy(calc
->cb
[41].label
,"n!");
2077 calc
->cb
[41].color
= CALC_COLOR_MAGENTA
;
2078 calc
->cb
[41].r
.left
= skipx
;
2079 calc
->cb
[41].r
.top
= skipy
;
2080 calc
->cb
[41].r
.right
= SZ_MEDBTN_X
;
2081 calc
->cb
[41].r
.bottom
= SZ_MEDBTN_Y
;
2082 calc
->cb
[41].enable
= 1;
2084 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2086 calc
->cb
[42].id
= ID_CALC_MEM_PLUS
;
2087 LoadString( hInst
, IDS_BTN_MEM_PLUS
, calc
->cb
[42].label
, sizeof(calc
->cb
[42].label
));
2088 calc
->cb
[42].color
= CALC_COLOR_RED
;
2089 calc
->cb
[42].r
.left
= skipx
;
2090 calc
->cb
[42].r
.top
= skipy
;
2091 calc
->cb
[42].r
.right
= SZ_MEDBTN_X
;
2092 calc
->cb
[42].r
.bottom
= SZ_MEDBTN_Y
;
2093 calc
->cb
[42].enable
= 1;
2095 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2097 calc
->cb
[43].id
= ID_CALC_ZERO
;
2098 strcpy(calc
->cb
[43].label
,"0");
2099 calc
->cb
[43].color
= CALC_COLOR_BLUE
;
2100 calc
->cb
[43].r
.left
= skipx
;
2101 calc
->cb
[43].r
.top
= skipy
;
2102 calc
->cb
[43].r
.right
= SZ_MEDBTN_X
;
2103 calc
->cb
[43].r
.bottom
= SZ_MEDBTN_Y
;
2104 calc
->cb
[43].enable
= 1;
2106 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2108 calc
->cb
[44].id
= ID_CALC_SIGN
;
2109 strcpy(calc
->cb
[44].label
,"+/-");
2110 calc
->cb
[44].color
= CALC_COLOR_RED
;
2111 calc
->cb
[44].r
.left
= skipx
;
2112 calc
->cb
[44].r
.top
= skipy
;
2113 calc
->cb
[44].r
.right
= SZ_MEDBTN_X
;
2114 calc
->cb
[44].r
.bottom
= SZ_MEDBTN_Y
;
2115 calc
->cb
[44].enable
= 1;
2117 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2119 calc
->cb
[45].id
= ID_CALC_DECIMAL
;
2120 strcpy(calc
->cb
[45].label
,".");
2121 calc
->cb
[45].color
= CALC_COLOR_BLUE
;
2122 calc
->cb
[45].r
.left
= skipx
;
2123 calc
->cb
[45].r
.top
= skipy
;
2124 calc
->cb
[45].r
.right
= SZ_MEDBTN_X
;
2125 calc
->cb
[45].r
.bottom
= SZ_MEDBTN_Y
;
2126 calc
->cb
[45].enable
= 1;
2128 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2130 calc
->cb
[46].id
= ID_CALC_PLUS
;
2131 strcpy(calc
->cb
[46].label
,"+");
2132 calc
->cb
[46].color
= CALC_COLOR_RED
;
2133 calc
->cb
[46].r
.left
= skipx
;
2134 calc
->cb
[46].r
.top
= skipy
;
2135 calc
->cb
[46].r
.right
= SZ_MEDBTN_X
;
2136 calc
->cb
[46].r
.bottom
= SZ_MEDBTN_Y
;
2137 calc
->cb
[46].enable
= 1;
2139 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2141 calc
->cb
[47].id
= ID_CALC_EQUALS
;
2142 strcpy(calc
->cb
[47].label
,"=");
2143 calc
->cb
[47].color
= CALC_COLOR_RED
;
2144 calc
->cb
[47].r
.left
= skipx
;
2145 calc
->cb
[47].r
.top
= skipy
;
2146 calc
->cb
[47].r
.right
= SZ_MEDBTN_X
;
2147 calc
->cb
[47].r
.bottom
= SZ_MEDBTN_Y
;
2148 calc
->cb
[47].enable
= 1;
2150 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2152 calc
->cb
[48].id
= ID_CALC_INT
;
2153 strcpy(calc
->cb
[48].label
,"Int");
2154 calc
->cb
[48].color
= CALC_COLOR_RED
;
2155 calc
->cb
[48].r
.left
= skipx
;
2156 calc
->cb
[48].r
.top
= skipy
;
2157 calc
->cb
[48].r
.right
= SZ_MEDBTN_X
;
2158 calc
->cb
[48].r
.bottom
= SZ_MEDBTN_Y
;
2159 calc
->cb
[48].enable
= 1;
2164 skipx
= MARGIN_LEFT
;
2165 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
2167 calc
->cb
[49].id
= ID_CALC_DAT
;
2168 strcpy(calc
->cb
[49].label
,"Dat");
2169 calc
->cb
[49].color
= CALC_COLOR_GRAY
;
2170 calc
->cb
[49].r
.left
= skipx
;
2171 calc
->cb
[49].r
.top
= skipy
;
2172 calc
->cb
[49].r
.right
= SZ_MEDBTN_X
;
2173 calc
->cb
[49].r
.bottom
= SZ_MEDBTN_Y
;
2174 calc
->cb
[49].enable
= 0;
2176 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2178 calc
->cb
[50].id
= ID_CALC_TAN
;
2179 strcpy(calc
->cb
[50].label
,"tan");
2180 calc
->cb
[50].color
= CALC_COLOR_MAGENTA
;
2181 calc
->cb
[50].r
.left
= skipx
;
2182 calc
->cb
[50].r
.top
= skipy
;
2183 calc
->cb
[50].r
.right
= SZ_MEDBTN_X
;
2184 calc
->cb
[50].r
.bottom
= SZ_MEDBTN_Y
;
2185 calc
->cb
[50].enable
= 1;
2187 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2189 calc
->cb
[51].id
= ID_CALC_SQUARE
;
2190 strcpy(calc
->cb
[51].label
,"x^2");
2191 calc
->cb
[51].color
= CALC_COLOR_MAGENTA
;
2192 calc
->cb
[51].r
.left
= skipx
;
2193 calc
->cb
[51].r
.top
= skipy
;
2194 calc
->cb
[51].r
.right
= SZ_MEDBTN_X
;
2195 calc
->cb
[51].r
.bottom
= SZ_MEDBTN_Y
;
2196 calc
->cb
[51].enable
= 1;
2198 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2200 calc
->cb
[52].id
= ID_CALC_RECIPROCAL
;
2201 strcpy(calc
->cb
[52].label
,"1/x");
2202 calc
->cb
[52].color
= CALC_COLOR_MAGENTA
;
2203 calc
->cb
[52].r
.left
= skipx
;
2204 calc
->cb
[52].r
.top
= skipy
;
2205 calc
->cb
[52].r
.right
= SZ_MEDBTN_X
;
2206 calc
->cb
[52].r
.bottom
= SZ_MEDBTN_Y
;
2207 calc
->cb
[52].enable
= 1;
2209 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2211 calc
->cb
[53].id
= ID_CALC_PI
;
2212 strcpy(calc
->cb
[53].label
,"pi");
2213 calc
->cb
[53].color
= CALC_COLOR_BLUE
;
2214 calc
->cb
[53].r
.left
= skipx
;
2215 calc
->cb
[53].r
.top
= skipy
;
2216 calc
->cb
[53].r
.right
= SZ_MEDBTN_X
;
2217 calc
->cb
[53].r
.bottom
= SZ_MEDBTN_Y
;
2218 calc
->cb
[53].enable
= 1;
2220 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2222 calc
->cb
[54].id
= ID_CALC_A
;
2223 strcpy(calc
->cb
[54].label
,"A");
2224 calc
->cb
[54].color
= CALC_COLOR_GRAY
;
2225 calc
->cb
[54].r
.left
= skipx
;
2226 calc
->cb
[54].r
.top
= skipy
;
2227 calc
->cb
[54].r
.right
= SZ_MEDBTN_X
;
2228 calc
->cb
[54].r
.bottom
= SZ_MEDBTN_Y
;
2229 calc
->cb
[54].enable
= 0;
2231 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2233 calc
->cb
[55].id
= ID_CALC_B
;
2234 strcpy(calc
->cb
[55].label
,"B");
2235 calc
->cb
[55].color
= CALC_COLOR_GRAY
;
2236 calc
->cb
[55].r
.left
= skipx
;
2237 calc
->cb
[55].r
.top
= skipy
;
2238 calc
->cb
[55].r
.right
= SZ_MEDBTN_X
;
2239 calc
->cb
[55].r
.bottom
= SZ_MEDBTN_Y
;
2240 calc
->cb
[55].enable
= 0;
2242 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2244 calc
->cb
[56].id
= ID_CALC_C
;
2245 strcpy(calc
->cb
[56].label
,"C");
2246 calc
->cb
[56].color
= CALC_COLOR_GRAY
;
2247 calc
->cb
[56].r
.left
= skipx
;
2248 calc
->cb
[56].r
.top
= skipy
;
2249 calc
->cb
[56].r
.right
= SZ_MEDBTN_X
;
2250 calc
->cb
[56].r
.bottom
= SZ_MEDBTN_Y
;
2251 calc
->cb
[56].enable
= 0;
2253 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2255 calc
->cb
[57].id
= ID_CALC_D
;
2256 strcpy(calc
->cb
[57].label
,"D");
2257 calc
->cb
[57].color
= CALC_COLOR_GRAY
;
2258 calc
->cb
[57].r
.left
= skipx
;
2259 calc
->cb
[57].r
.top
= skipy
;
2260 calc
->cb
[57].r
.right
= SZ_MEDBTN_X
;
2261 calc
->cb
[57].r
.bottom
= SZ_MEDBTN_Y
;
2262 calc
->cb
[57].enable
= 0;
2264 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2266 calc
->cb
[58].id
= ID_CALC_E
;
2267 strcpy(calc
->cb
[58].label
,"E");
2268 calc
->cb
[58].color
= CALC_COLOR_GRAY
;
2269 calc
->cb
[58].r
.left
= skipx
;
2270 calc
->cb
[58].r
.top
= skipy
;
2271 calc
->cb
[58].r
.right
= SZ_MEDBTN_X
;
2272 calc
->cb
[58].r
.bottom
= SZ_MEDBTN_Y
;
2273 calc
->cb
[58].enable
= 0;
2275 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2277 calc
->cb
[59].id
= ID_CALC_F
;
2278 strcpy(calc
->cb
[59].label
,"F");
2279 calc
->cb
[59].color
= CALC_COLOR_GRAY
;
2280 calc
->cb
[59].r
.left
= skipx
;
2281 calc
->cb
[59].r
.top
= skipy
;
2282 calc
->cb
[59].r
.right
= SZ_MEDBTN_X
;
2283 calc
->cb
[59].r
.bottom
= SZ_MEDBTN_Y
;
2284 calc
->cb
[59].enable
= 0;
2288 calc
->cb
[60].id
= ID_CALC_NS_HEX
;
2289 strcpy(calc
->cb
[60].label
,"Hex");
2290 calc
->cb
[60].color
= CALC_COLOR_GRAY
;
2291 calc
->cb
[60].r
.left
= CALC_NS_HEX_LEFT
;
2292 calc
->cb
[60].r
.top
= CALC_NS_HEX_TOP
;
2293 calc
->cb
[60].r
.right
= SZ_RADIO_NS_X
;
2294 calc
->cb
[60].r
.bottom
= SZ_RADIO_NS_Y
;
2295 calc
->cb
[60].enable
= 1;
2297 calc
->cb
[61].id
= ID_CALC_NS_DEC
;
2298 strcpy(calc
->cb
[61].label
,"Dec");
2299 calc
->cb
[61].color
= CALC_COLOR_GRAY
;
2300 calc
->cb
[61].r
.left
= CALC_NS_DEC_LEFT
;
2301 calc
->cb
[61].r
.top
= CALC_NS_DEC_TOP
;
2302 calc
->cb
[61].r
.right
= SZ_RADIO_NS_X
;
2303 calc
->cb
[61].r
.bottom
= SZ_RADIO_NS_Y
;
2304 calc
->cb
[61].enable
= 1;
2306 calc
->cb
[62].id
= ID_CALC_NS_OCT
;
2307 strcpy(calc
->cb
[62].label
,"Oct");
2308 calc
->cb
[62].color
= CALC_COLOR_GRAY
;
2309 calc
->cb
[62].r
.left
= CALC_NS_OCT_LEFT
;
2310 calc
->cb
[62].r
.top
= CALC_NS_OCT_TOP
;
2311 calc
->cb
[62].r
.right
= SZ_RADIO_NS_X
;
2312 calc
->cb
[62].r
.bottom
= SZ_RADIO_NS_Y
;
2313 calc
->cb
[62].enable
= 1;
2315 calc
->cb
[63].id
= ID_CALC_NS_BIN
;
2316 strcpy(calc
->cb
[63].label
,"Bin");
2317 calc
->cb
[63].color
= CALC_COLOR_GRAY
;
2318 calc
->cb
[63].r
.left
= CALC_NS_BIN_LEFT
;
2319 calc
->cb
[63].r
.top
= CALC_NS_BIN_TOP
;
2320 calc
->cb
[63].r
.right
= SZ_RADIO_NS_X
;
2321 calc
->cb
[63].r
.bottom
= SZ_RADIO_NS_Y
;
2322 calc
->cb
[63].enable
= 1;
2324 calc
->cb
[64].id
= ID_CALC_MS_DEGREES
;
2325 strcpy(calc
->cb
[64].label
,"Degrees");
2326 calc
->cb
[64].color
= CALC_COLOR_GRAY
;
2327 calc
->cb
[64].r
.left
= CALC_MS_DEGREES_LEFT
;
2328 calc
->cb
[64].r
.top
= CALC_MS_DEGREES_TOP
;
2329 calc
->cb
[64].r
.right
= SZ_RADIO_MS_X
;
2330 calc
->cb
[64].r
.bottom
= SZ_RADIO_MS_Y
;
2331 calc
->cb
[64].enable
= 1;
2333 calc
->cb
[65].id
= ID_CALC_MS_RADIANS
;
2334 strcpy(calc
->cb
[65].label
,"Radians");
2335 calc
->cb
[65].color
= CALC_COLOR_GRAY
;
2336 calc
->cb
[65].r
.left
= CALC_MS_RADIANS_LEFT
;
2337 calc
->cb
[65].r
.top
= CALC_MS_RADIANS_TOP
;
2338 calc
->cb
[65].r
.right
= SZ_RADIO_MS_X
;
2339 calc
->cb
[65].r
.bottom
= SZ_RADIO_MS_Y
;
2340 calc
->cb
[65].enable
= 1;
2342 calc
->cb
[66].id
= ID_CALC_MS_GRADS
;
2343 strcpy(calc
->cb
[66].label
,"Grads");
2344 calc
->cb
[66].color
= CALC_COLOR_GRAY
;
2345 calc
->cb
[66].r
.left
= CALC_MS_GRADS_LEFT
;
2346 calc
->cb
[66].r
.top
= CALC_MS_GRADS_TOP
;
2347 calc
->cb
[66].r
.right
= SZ_RADIO_MS_X
;
2348 calc
->cb
[66].r
.bottom
= SZ_RADIO_MS_Y
;
2349 calc
->cb
[66].enable
= 1;
2351 calc
->cb
[67].id
= ID_CALC_CB_INV
;
2352 strcpy(calc
->cb
[67].label
,"Inv");
2353 calc
->cb
[67].color
= CALC_COLOR_GRAY
;
2354 calc
->cb
[67].r
.left
= CALC_CB_INV_LEFT
;
2355 calc
->cb
[67].r
.top
= CALC_CB_INV_TOP
;
2356 calc
->cb
[67].r
.right
= SZ_RADIO_CB_X
;
2357 calc
->cb
[67].r
.bottom
= SZ_RADIO_CB_Y
;
2358 calc
->cb
[67].enable
= 1;
2360 calc
->cb
[68].id
= ID_CALC_CB_HYP
;
2361 strcpy(calc
->cb
[68].label
,"Hyp");
2362 calc
->cb
[68].color
= CALC_COLOR_GRAY
;
2363 calc
->cb
[68].r
.left
= CALC_CB_HYP_LEFT
;
2364 calc
->cb
[68].r
.top
= CALC_CB_HYP_TOP
;
2365 calc
->cb
[68].r
.right
= SZ_RADIO_CB_X
;
2366 calc
->cb
[68].r
.bottom
= SZ_RADIO_CB_Y
;
2367 calc
->cb
[68].enable
= 1;
2369 calc
->cb
[69].id
= ID_CALC_WS_QWORD
;
2370 strcpy(calc
->cb
[69].label
,"Qword");
2371 calc
->cb
[69].color
= CALC_COLOR_GRAY
;
2372 calc
->cb
[69].r
.left
= CALC_WS_QWORD_LEFT
;
2373 calc
->cb
[69].r
.top
= CALC_WS_QWORD_TOP
;
2374 calc
->cb
[69].r
.right
= SZ_RADIO_WS_X
;
2375 calc
->cb
[69].r
.bottom
= SZ_RADIO_WS_Y
;
2376 calc
->cb
[69].enable
= 1;
2378 calc
->cb
[70].id
= ID_CALC_WS_DWORD
;
2379 strcpy(calc
->cb
[70].label
,"Dword");
2380 calc
->cb
[70].color
= CALC_COLOR_GRAY
;
2381 calc
->cb
[70].r
.left
= CALC_WS_DWORD_LEFT
;
2382 calc
->cb
[70].r
.top
= CALC_WS_DWORD_TOP
;
2383 calc
->cb
[70].r
.right
= SZ_RADIO_WS_X
;
2384 calc
->cb
[70].r
.bottom
= SZ_RADIO_WS_Y
;
2385 calc
->cb
[70].enable
= 1;
2387 calc
->cb
[71].id
= ID_CALC_WS_WORD
;
2388 strcpy(calc
->cb
[71].label
,"Word");
2389 calc
->cb
[71].color
= CALC_COLOR_GRAY
;
2390 calc
->cb
[71].r
.left
= CALC_WS_WORD_LEFT
;
2391 calc
->cb
[71].r
.top
= CALC_WS_WORD_TOP
;
2392 calc
->cb
[71].r
.right
= SZ_RADIO_WS_X
;
2393 calc
->cb
[71].r
.bottom
= SZ_RADIO_WS_Y
;
2394 calc
->cb
[71].enable
= 1;
2396 calc
->cb
[72].id
= ID_CALC_WS_BYTE
;
2397 strcpy(calc
->cb
[72].label
,"Byte");
2398 calc
->cb
[72].color
= CALC_COLOR_GRAY
;
2399 calc
->cb
[72].r
.left
= CALC_WS_BYTE_LEFT
;
2400 calc
->cb
[72].r
.top
= CALC_WS_BYTE_TOP
;
2401 calc
->cb
[72].r
.right
= SZ_RADIO_WS_X
;
2402 calc
->cb
[72].r
.bottom
= SZ_RADIO_WS_Y
;
2403 calc
->cb
[72].enable
= 1;
2406 // preload clip region for filler squares
2408 if (calc
->sciMode
) {
2411 rFiller
.left
= calc
->cb
[0].r
.left
;
2412 rFiller
.top
= calc
->cb
[0].r
.top
;
2413 rFiller
.right
= calc
->cb
[0].r
.right
;
2414 rFiller
.bottom
= calc
->cb
[0].r
.bottom
;
2419 rFiller
.left
= calc
->cb
[1].r
.left
;
2420 rFiller
.top
= calc
->cb
[1].r
.top
;
2421 rFiller
.right
= calc
->cb
[0].r
.right
;
2422 rFiller
.bottom
= calc
->cb
[0].r
.bottom
;
2425 top_button
= calc
->numButtons
- 1;
2427 top_button
-= CALC_NS_COUNT
+ CALC_MS_COUNT
+ CALC_CB_COUNT
+ CALC_WS_COUNT
;
2429 for (; n
<= top_button
; n
++) {
2432 calc
->cb
[n
].hBtn
= CreateWindow(
2435 WS_VISIBLE
| WS_CHILD
| WS_BORDER
| BS_CENTER
| BS_VCENTER
| BS_TEXT
|
2436 (calc
->cb
[n
].enable
? 0 : WS_DISABLED
), // BS_FLAT
2439 calc
->cb
[n
].r
.right
,
2440 calc
->cb
[n
].r
.bottom
,
2442 (HMENU
)calc
->cb
[n
].id
,
2447 if (!calc
->cb
[n
].hBtn
)
2450 SendMessage(calc
->cb
[n
].hBtn
, WM_SETFONT
, (WPARAM
)hFont
, TRUE
);
2453 if (!calc
->sciMode
) {
2454 top_button
+= CALC_NS_COUNT
;
2455 for (; n
<=top_button
; n
++) {
2456 int j
= ID_CALC_NS_HEX
+ n
- top_button
+ CALC_NS_COUNT
- 1;
2457 calc
->cb
[n
].hBtn
= CreateWindow(
2460 WS_VISIBLE
| WS_CHILD
| BS_LEFT
| BS_VCENTER
| BS_TEXT
| BS_RADIOBUTTON
,
2461 CALC_NS_OFFSET_X
+ calc
->cb
[n
].r
.left
,
2462 CALC_NS_OFFSET_Y
+ calc
->cb
[n
].r
.top
,
2463 calc
->cb
[n
].r
.right
,
2464 calc
->cb
[n
].r
.bottom
,
2471 if (!calc
->cb
[n
].hBtn
)
2474 SendMessage(calc
->cb
[n
].hBtn
, WM_SETFONT
, (WPARAM
)hFont
, TRUE
);
2477 top_button
+= CALC_MS_COUNT
;
2479 for (; n
<=top_button
; n
++) {
2480 calc
->cb
[n
].hBtn
= CreateWindow(
2483 WS_VISIBLE
| WS_CHILD
| BS_LEFT
| BS_VCENTER
| BS_TEXT
| BS_RADIOBUTTON
,
2484 CALC_MS_OFFSET_X
+ calc
->cb
[n
].r
.left
,
2485 CALC_MS_OFFSET_Y
+ calc
->cb
[n
].r
.top
,
2486 calc
->cb
[n
].r
.right
,
2487 calc
->cb
[n
].r
.bottom
,
2489 (HMENU
)(ID_CALC_MS_DEGREES
+ n
- top_button
+ CALC_MS_COUNT
- 1),
2494 if (!calc
->cb
[n
].hBtn
)
2497 SendMessage(calc
->cb
[n
].hBtn
, WM_SETFONT
, (WPARAM
)hFont
, TRUE
);
2500 top_button
+= CALC_CB_COUNT
;
2502 for (; n
<=top_button
; n
++) {
2503 calc
->cb
[n
].hBtn
= CreateWindow(
2506 WS_VISIBLE
| WS_CHILD
| BS_LEFT
| BS_VCENTER
| BS_TEXT
| BS_CHECKBOX
,
2507 CALC_CB_OFFSET_X
+ calc
->cb
[n
].r
.left
,
2508 CALC_CB_OFFSET_Y
+ calc
->cb
[n
].r
.top
,
2509 calc
->cb
[n
].r
.right
,
2510 calc
->cb
[n
].r
.bottom
,
2512 (HMENU
)(ID_CALC_CB_INV
+ n
- top_button
+ CALC_CB_COUNT
- 1),
2517 if (!calc
->cb
[n
].hBtn
)
2520 SendMessage(calc
->cb
[n
].hBtn
, WM_SETFONT
, (WPARAM
)hFont
, TRUE
);
2523 top_button
+= CALC_WS_COUNT
;
2525 for (; n
<=top_button
; n
++) {
2526 calc
->cb
[n
].hBtn
= CreateWindow(
2529 WS_CHILD
| BS_LEFT
| BS_VCENTER
| BS_TEXT
| BS_RADIOBUTTON
,
2530 CALC_WS_OFFSET_X
+ calc
->cb
[n
].r
.left
,
2531 CALC_WS_OFFSET_Y
+ calc
->cb
[n
].r
.top
,
2532 calc
->cb
[n
].r
.right
,
2533 calc
->cb
[n
].r
.bottom
,
2535 (HMENU
)(ID_CALC_WS_QWORD
+ n
- top_button
+ CALC_WS_COUNT
- 1),
2540 if (!calc
->cb
[n
].hBtn
)
2543 EnableWindow(calc
->cb
[n
].hBtn
, FALSE
);
2544 SendMessage(calc
->cb
[n
].hBtn
, WM_SETFONT
, (WPARAM
)hFont
, TRUE
);
2549 SendMessage(calc
->cb
[61].hBtn
, BM_SETCHECK
, 1, 0); // decimal
2550 SendMessage(calc
->cb
[64].hBtn
, BM_SETCHECK
, 1, 0); // degrees
2551 SendMessage(calc
->cb
[69].hBtn
, BM_SETCHECK
, 1, 0); // qword
2555 void DrawCalcRect (HDC hdc
, HDC hMemDC
, PAINTSTRUCT
*ps
, CALC
*calc
, int object
)
2566 int WDISPLAY_BOTTOM
;
2568 if (!calc
->sciMode
) {
2569 WDISPLAY_LEFT
= WDISPLAY_SCIENTIFIC_LEFT
;
2570 WDISPLAY_TOP
= WDISPLAY_SCIENTIFIC_TOP
;
2571 WDISPLAY_RIGHT
= WDISPLAY_SCIENTIFIC_RIGHT
;
2572 WDISPLAY_BOTTOM
= WDISPLAY_SCIENTIFIC_BOTTOM
;
2575 WDISPLAY_LEFT
= WDISPLAY_STANDARD_LEFT
;
2576 WDISPLAY_TOP
= WDISPLAY_STANDARD_TOP
;
2577 WDISPLAY_RIGHT
= WDISPLAY_STANDARD_RIGHT
;
2578 WDISPLAY_BOTTOM
= WDISPLAY_STANDARD_BOTTOM
;
2581 // never delete the active pen!
2585 hPenGray
= CreatePen(PS_SOLID
, 1, RGB(CALC_GRAY
,CALC_GRAY
,CALC_GRAY
));
2586 hPenBlack
= CreatePen(PS_SOLID
, 1, RGB(0,0,0));
2587 hPenWhite
= CreatePen(PS_SOLID
, 1, RGB(255,255,255));
2589 hPenOrg
= SelectObject(hdc
, hPenGray
);
2592 calc
->cb
[object
].r
.left
,
2593 calc
->cb
[object
].r
.bottom
,
2596 LineTo(hdc
, calc
->cb
[object
].r
.left
, calc
->cb
[object
].r
.top
);
2597 LineTo(hdc
, calc
->cb
[object
].r
.right
, calc
->cb
[object
].r
.top
);
2601 SelectObject(hdc
, hPenBlack
);
2604 calc
->cb
[object
].r
.right
-2,
2605 calc
->cb
[object
].r
.top
+1,
2608 LineTo(hdc
, calc
->cb
[object
].r
.left
+1, calc
->cb
[object
].r
.top
+1);
2609 LineTo(hdc
, calc
->cb
[object
].r
.left
+1, calc
->cb
[object
].r
.bottom
-1);
2611 SelectObject(hdc
, hPenBlack
);
2618 LineTo(hdc
, WDISPLAY_LEFT
- 1, WDISPLAY_TOP
- 1);
2619 LineTo(hdc
, WDISPLAY_RIGHT
+ 1, WDISPLAY_TOP
- 1);
2621 SelectObject(hdc
, hPenGray
);
2628 LineTo(hdc
, WDISPLAY_LEFT
- 2, WDISPLAY_TOP
- 2);
2629 LineTo(hdc
, WDISPLAY_LEFT
- 2, WDISPLAY_BOTTOM
+ 1);
2633 SelectObject(hdc
, hPenWhite
);
2636 calc
->cb
[object
].r
.left
,
2637 calc
->cb
[object
].r
.bottom
,
2640 LineTo(hdc
, calc
->cb
[object
].r
.right
, calc
->cb
[object
].r
.bottom
);
2641 LineTo(hdc
, calc
->cb
[object
].r
.right
, calc
->cb
[object
].r
.top
);
2643 SelectObject(hdc
, hPenOrg
);
2644 DeleteObject(hPenGray
);
2645 DeleteObject(hPenBlack
);
2646 DeleteObject(hPenWhite
);
2649 void DrawCalcRectSci(HDC hdc
, HDC hMemDC
, PAINTSTRUCT
*ps
, CALC
*calc
, RECT
*r
)
2655 // never delete the active pen!
2659 hPen
= CreatePen(PS_SOLID
, 1, RGB(255,255,255));
2660 hPenOrg
= SelectObject(hdc
, hPen
);
2667 LineTo(hdc
, r
->left
+ 1, r
->top
+ 1);
2668 LineTo(hdc
, r
->right
+ 1, r
->top
+ 1);
2669 LineTo(hdc
, r
->right
+ 1, r
->bottom
+ 1);
2670 LineTo(hdc
, r
->left
+ 1, r
->bottom
+ 1);
2672 SelectObject(hdc
, hPenOrg
);
2677 hPen
= CreatePen(PS_SOLID
, 1, RGB(CALC_GRAY
,CALC_GRAY
,CALC_GRAY
));
2678 hPenOrg
= SelectObject(hdc
, hPen
);
2685 LineTo(hdc
, r
->left
, r
->top
);
2686 LineTo(hdc
, r
->right
, r
->top
);
2687 LineTo(hdc
, r
->right
, r
->bottom
);
2688 LineTo(hdc
, r
->left
, r
->bottom
);
2690 SelectObject(hdc
, hPenOrg
);
2694 static RECT scirect1
= {
2695 WDISPLAY_SCIENTIFIC_LEFT
- 2,
2696 WDISPLAY_SCIENTIFIC_TOP
+ 25,
2697 WDISPLAY_SCIENTIFIC_LEFT
+ 202,
2698 WDISPLAY_SCIENTIFIC_TOP
+ 51
2701 static RECT scirect2
= {
2702 WDISPLAY_SCIENTIFIC_LEFT
+ 205,
2703 WDISPLAY_SCIENTIFIC_TOP
+ 25,
2704 WDISPLAY_SCIENTIFIC_RIGHT
,
2705 WDISPLAY_SCIENTIFIC_TOP
+ 51
2708 static RECT scirect3
= {
2709 WDISPLAY_SCIENTIFIC_LEFT
- 2,
2710 WDISPLAY_SCIENTIFIC_TOP
+ 57,
2711 WDISPLAY_SCIENTIFIC_LEFT
+ 102,
2712 WDISPLAY_SCIENTIFIC_TOP
+ 81
2715 void DrawCalc (HDC hdc
, HDC hMemDC
, PAINTSTRUCT
*ps
, CALC
*calc
)
2717 char s
[CALC_BUF_SIZE
];
2719 scirect1
.right
= calc
->cb
[0].r
.right
+ 2;
2720 scirect2
.left
= calc
->cb
[0].r
.right
+ 5;
2721 scirect3
.right
= calc
->cb
[1].r
.left
- 10;
2723 DrawCalcRect (hdc
, hMemDC
, ps
, calc
, 0);
2725 if (!calc
->sciMode
) {
2726 DrawCalcRect (hdc
, hMemDC
, ps
, calc
, 1);
2727 DrawCalcRectSci(hdc
, hMemDC
, ps
, calc
, &scirect1
);
2728 DrawCalcRectSci(hdc
, hMemDC
, ps
, calc
, &scirect2
);
2729 DrawCalcRectSci(hdc
, hMemDC
, ps
, calc
, &scirect3
);
2732 LoadString(calc
->hInst
, IDS_BTN_MEM_STATUS_M
, s
, sizeof(s
));
2734 DrawCalcText(hdc
, hMemDC
, ps
, calc
, 0, s
);
2737 void DrawCalcText (HDC hdc
, HDC hMemDC
, PAINTSTRUCT
*ps
, CALC
*calc
, int object
, char *s
)
2745 char s2
[CALC_BUF_SIZE
];
2750 int WDISPLAY_BOTTOM
;
2752 if (!calc
->sciMode
) {
2753 WDISPLAY_LEFT
= WDISPLAY_SCIENTIFIC_LEFT
;
2754 WDISPLAY_TOP
= WDISPLAY_SCIENTIFIC_TOP
;
2755 WDISPLAY_RIGHT
= WDISPLAY_SCIENTIFIC_RIGHT
;
2756 WDISPLAY_BOTTOM
= WDISPLAY_SCIENTIFIC_BOTTOM
;
2759 WDISPLAY_LEFT
= WDISPLAY_STANDARD_LEFT
;
2760 WDISPLAY_TOP
= WDISPLAY_STANDARD_TOP
;
2761 WDISPLAY_RIGHT
= WDISPLAY_STANDARD_RIGHT
;
2762 WDISPLAY_BOTTOM
= WDISPLAY_STANDARD_BOTTOM
;
2765 // DEFAULT_GUI_FONT is Tahoma on 2000 and XP?
2766 // SYSTEM_FONT is MS Sans Serif?
2768 hFont
= GetStockObject(DEFAULT_GUI_FONT
);
2770 hFontOrg
= SelectObject(hdc
, hFont
);
2773 SetBkMode(hdc
, TRANSPARENT
);
2776 calc
->cb
[object
].r
.left
+ 9,
2777 calc
->cb
[object
].r
.top
+ 7,
2782 SetBkMode(hdc
, OPAQUE
);
2786 sprintf(s2
, "(=%d",calc
->paren
);
2788 SetBkMode(hdc
, TRANSPARENT
);
2790 SetTextAlign(hdc
, TA_CENTER
);
2793 calc
->cb
[object
+1].r
.left
+ 13,
2794 calc
->cb
[object
+1].r
.top
+ 6,
2799 SetBkMode(hdc
, OPAQUE
);
2802 hPen
= CreatePen(PS_SOLID
, 1, RGB(255,255,255));
2803 hPenOrg
= SelectObject(hdc
, hPen
);
2807 WDISPLAY_BOTTOM
+ 1,
2811 LineTo(hdc
, WDISPLAY_RIGHT
+ 1, WDISPLAY_BOTTOM
+ 1);
2812 LineTo(hdc
, WDISPLAY_RIGHT
+ 1, WDISPLAY_TOP
- 2);
2814 Rectangle(hdc
, WDISPLAY_LEFT
, WDISPLAY_TOP
, WDISPLAY_RIGHT
, WDISPLAY_BOTTOM
);
2816 SelectObject(hdc
, hPenOrg
);
2819 SetBkMode(hdc
, TRANSPARENT
);
2821 SetTextAlign(hdc
, TA_RIGHT
);
2827 strlen(calc
->display
)
2830 SelectObject(hdc
, hFontOrg
);
2833 void DestroyCalc (CALC
*calc
)
2837 for (i
=0;i
<calc
->numButtons
;i
++)
2838 DestroyWindow(calc
->cb
[i
].hBtn
);
2841 void calc_buffer_format(CALC
*calc
) {
2847 // calc_buffer_format: enforce buffer content rules
2849 // disallow more than one point (beep)
2850 // remove leading zeros
2851 // remove trailing zeros after point (sprintf can cause this)
2852 // remove trailing points
2853 // chop at 32 digits. Though there could also be a point, and 10 separator characters.
2862 calc
->buffer
[strlen(calc
->buffer
)-1] = '\0';
2872 calc
->buffer
[n
] = '\0';
2877 // remove leading zeros
2886 // remove trailing points
2891 if (*(p
+n
-1) == '.') {
2908 // chop at 32 digits
2916 *(calc
->buffer
+ n
++) = *(p
++);
2917 *(calc
->buffer
+ n
) = '\0';
2920 void calc_buffer_display(CALC
*calc
) {
2922 char s
[CALC_BUF_SIZE
];
2923 char r
[CALC_BUF_SIZE
] = "0";
2927 switch (calc
->numBase
) {
2929 real
= calc_atof(calc
->buffer
, calc
->numBase
);
2930 sprintf(calc
->display
, "%x", (long)real
);
2934 sprintf(calc
->display
, "%o", calc
->buffer
);
2938 sprintf(calc
->display
, "%x", calc
->buffer
);
2942 calc_buffer_format(calc
);
2944 if (calc
->displayMode
) {
2945 if (!strcmp(calc
->buffer
, "0") || !calc
->buffer
[0]) {
2946 strcpy(calc
->display
, "0.e+0");
2954 r
= calc_atof(calc
->buffer
, calc
->numBase
);
2955 sprintf(s
, FMT_DESC_EXP
, r
);
2956 // remove leading zeros in exponent
2959 if (*p
== 'e') { // starting exponent parsing
2963 else if (exp
) { // inside exponent, and haven't seen a digit, so could be a leading zero
2969 if (exp
&& (*p
!= 'e') && (*p
!= '0') && (*p
!= '+') && (*p
!= '-')) {
2975 calc
->display
[i
++] = *p
;
2980 if (calc
->display
[i
-1] == '+') // all trailing zeros
2982 calc
->display
[i
++] = '0';
2984 calc
->display
[i
] = 0;
2988 // calc_buffer_display: display buffer after formatting
2990 // if digitGrouping, embed separators
2991 // add point if missing
2994 strcpy(s
,calc
->buffer
);
3005 if (calc
->digitGrouping
)
3008 if (!point
&& calc
->numBase
== NBASE_DECIMAL
)
3013 strcpy(calc
->display
, r
);
3016 strcpy(calc
->display
, s
);
3020 InvalidateRect(calc
->hWnd
, NULL
, FALSE
);
3021 UpdateWindow(calc
->hWnd
);
3024 char *calc_sep(char *s
)
3032 char r
[CALC_BUF_SIZE
];
3041 // need to handle leading minus sign!
3043 // see if there is a point character
3052 // if there is a point character, skip over decimal places
3061 // commify the integer part now
3063 while (c
= *(s
+ --n
)) {
3076 strcpy(s
, strrev(r
));
3081 long factorial(long n
)
3086 return n
* factorial(n
- 1);
3089 void calc_setmenuitem_radio(HMENU hMenu
, UINT id
)
3091 MENUITEMINFO menuItem
;
3093 menuItem
.fMask
= MIIM_FTYPE
;
3094 menuItem
.fType
= MFT_STRING
| MFT_RADIOCHECK
;
3095 // menuItem.fState = MFS_ENABLED;
3096 // menuItem.wID = id;
3097 // menuItem.hSubMenu = NULL;
3098 // menuItem.hbmpChecked = NULL;
3099 // menuItem.hbmpUnchecked = NULL;
3100 // menuItem.dwItemData = 0;
3101 // menuItem.dwTypeData = "Hex\tF5";
3102 // menuItem.cch = sizeof("Hex\tF5");
3103 menuItem
.cbSize
= sizeof(MENUITEMINFO
);
3105 SetMenuItemInfo(hMenu
, id
, FALSE
, &menuItem
);
3108 calcfloat
calc_convert_to_radians(CALC
*calc
)
3110 calcfloat r
= calc_atof(calc
->buffer
, calc
->numBase
);
3112 if (calc
->trigMode
== TRIGMODE_RADIANS
)
3114 if (calc
->trigMode
== TRIGMODE_DEGREES
)
3115 return r
* CONST_PI
/ 180;
3116 else if (calc
->trigMode
== TRIGMODE_GRADS
)
3117 return r
* CONST_PI
/ 200; // 90 degrees == 100 grads
3122 calcfloat
calc_convert_from_radians(CALC
*calc
)
3124 calcfloat r
= calc_atof(calc
->buffer
, calc
->numBase
);
3126 if (calc
->trigMode
== TRIGMODE_RADIANS
)
3128 if (calc
->trigMode
== TRIGMODE_DEGREES
)
3129 return r
* 180 / CONST_PI
;
3130 else if (calc
->trigMode
== TRIGMODE_GRADS
)
3131 return r
* 200 / CONST_PI
; // 90 degrees == 100 grads
3136 void show_debug(CALC
*calc
, char *title
, long w
, long l
)
3142 "wParam = (%c) %d:%d, %x:%xh\n \
3143 lParam = %d:%d, %x:%x\n \
3147 display = \"%s\"\n \
3176 MessageBox(calc
->hWnd
, s
, title
, MB_OK
);
3179 calcfloat
calc_atof(char *s
, int base
)
3181 // converts from another base to decimal calcfloat
3185 return CALC_ATOF(s
);
3187 return (calcfloat
)strtol(s
, NULL
, 16);
3189 return (calcfloat
)strtol(s
, NULL
, 8);
3191 return (calcfloat
)strtol(s
, NULL
, 2);
3199 void calc_ftoa(CALC
*calc
, calcfloat r
, char *buf
)
3201 // converts from decimal calcfloat to another base
3203 switch (calc
->numBase
) {
3205 sprintf(buf
, FMT_DESC_FLOAT
, r
);
3208 sprintf(buf
, "%lX", (long)r
);
3211 sprintf(buf
, "%lo", (long)r
);
3213 case NBASE_BINARY
: // 911 - need routine here
3221 int parse(int wParam
, int lParam
)
3224 case '\b': // backspace
3227 calc
.buffer
[strlen(calc
.buffer
)-1] = '\0';
3233 calc
.buffer
[0] = '\0';
3260 char s22
[CALC_BUF_SIZE
];
3261 char w
= (char)LOWORD(wParam
);
3263 if (!keys
[calc
.numBase
][w
]) {
3268 if (calc
.next
) { // user first digit indicates new buffer needed after previous UI event
3270 calc
.buffer
[0] = '\0';
3274 sprintf(s22
,"%c", w
);
3275 strcat(calc
.buffer
, s22
);
3280 case ',': // 911 - need to handle this, i18n
3282 if (calc
.numBase
== NBASE_DECIMAL
) {
3283 if (calc
.next
) { // first digit indicates new buffer needed after previous UI event
3285 calc
.buffer
[0] = '\0';
3288 strcat(calc
.buffer
, ".");
3297 case 'X': // exp, e(1)=2.718
3299 if (calc
.numBase
== NBASE_DECIMAL
) {
3301 calc
.value
= exp(calc_atof(calc
.buffer
, calc
.numBase
));
3302 sprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3313 if (calc_atof(calc
.buffer
, calc
.numBase
) == 0.0L) {
3314 strcpy(calc
.buffer
, err_invalid
);
3317 calc
.value
= log10(calc_atof(calc
.buffer
, calc
.numBase
));
3318 sprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3323 case 'n': // ln is natural logarithm
3326 if (calc_atof(calc
.buffer
, calc
.numBase
) == 0.0L) {
3327 strcpy(calc
.buffer
, err_invalid
);
3330 calc
.value
= log(calc_atof(calc
.buffer
, calc
.numBase
));
3331 sprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3337 if (calc
.numBase
== NBASE_DECIMAL
) {
3339 sprintf(calc
.buffer
, FMT_DESC_FLOAT
, CONST_PI
);
3347 case '\x0c': // Ctrl+L MC (only need to invalid rectangle if wasn't already zero, no need to update display)
3352 InvalidateRect(calc
.hWnd
, &rFiller
, TRUE
);
3353 UpdateWindow(calc
.hWnd
);
3359 case '\x12': // Ctrl+R MR (value doesn't change, so no invalid rectangle. but display is updated.)
3362 if (calc
.memory
!= calc_atof(calc
.buffer
, calc
.numBase
))
3363 sprintf(calc
.buffer
,FMT_DESC_FLOAT
,calc
.memory
);
3368 case '\x10': // Ctrl+P M+ (need to invalidate rectangle in many cases but not display)
3371 InvalidateRect(calc
.hWnd
, &rFiller
, TRUE
);
3372 calc
.memory
+= calc_atof(calc
.buffer
, calc
.numBase
);
3376 case '\x0d': // Ctrl+M MS (only need to invalid rectangle if was zero and now not,
3378 // or was not zero and now is, not display)
3381 int x
= GetKeyState(VK_CONTROL
);
3383 if (x
< 0 || lParam
== NUMBER_OF_THE_BEAST
) {
3384 if ((!calc
.memory
&& calc_atof(calc
.buffer
, calc
.numBase
)) ||
3385 (calc
.memory
&& !calc_atof(calc
.buffer
, calc
.numBase
))) {
3387 calc
.memory
= calc_atof(calc
.buffer
, calc
.numBase
);
3388 InvalidateRect(calc
.hWnd
, &rFiller
, FALSE
);
3389 UpdateWindow(calc
.hWnd
);
3392 calc
.memory
= calc_atof(calc
.buffer
, calc
.numBase
);
3399 // fall through for Enter processing ... but there is a bug here in Ctrl+M vs. Return
3402 calcfloat r
= calc
.operand
;
3404 if (calc
.newenter
) {
3406 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3407 r
= calc_atof(calc
.buffer
, calc
.numBase
); // convert buffer from whatever base to decimal real
3410 if (calc
.oper
== '+') {
3413 else if (calc
.oper
== '-') {
3416 else if (calc
.oper
== '*') {
3419 else if (calc
.oper
== '%') {
3420 calc
.value
= (long)calc
.value
% (long)r
;
3422 else if (calc
.oper
== '/') {
3423 if (!calc_atof(calc
.buffer
, calc
.numBase
)) {
3424 strcpy(calc
.buffer
, err_undefined
);
3431 else if (calc
.oper
== '&') {
3432 calc
.value
= (calcfloat
)((long)calc
.value
& (long)r
);
3434 else if (calc
.oper
== '|') {
3435 calc
.value
= (calcfloat
)((long)calc
.value
| (long)r
);
3437 else if (calc
.oper
== '^') {
3438 calc
.value
= (calcfloat
)((long)calc
.value
^ (long)r
);
3440 else if (calc
.oper
== 'y') {
3441 calc
.value
= (calcfloat
)pow(calc
.value
, r
);
3443 else if (calc
.oper
== '<') {
3445 calc
.value
= (calcfloat
)((long)calc
.value
>> (long)calc_atof(calc
.buffer
, calc
.numBase
));
3447 calc
.value
= (calcfloat
)((long)calc
.value
<< (long)calc_atof(calc
.buffer
, calc
.numBase
));
3449 else { // must have been a gratuitous user =
3451 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3454 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3466 if (calc_atof(calc
.buffer
, calc
.numBase
) == 0) {
3468 strcpy(calc
.buffer
, err_divide_by_zero
);
3471 calc
.value
= 1/calc_atof(calc
.buffer
, calc
.numBase
);
3472 sprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3476 case '@': // ^2 - sqrt in standard mode, squared in sci mode
3479 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3482 calc
.value
*= calc
.value
;
3484 calc
.value
= sqrt(calc
.value
);
3486 sprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3492 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3493 calc
.value
*= calc
.value
* calc
.value
;
3494 sprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3501 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3509 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3517 calc
.value
= (long)calc_atof(calc
.buffer
, calc
.numBase
);
3518 sprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3521 case '!': // factorial, need to use gamma function for reals t^(z-1)*e^t dt
3524 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3525 calc
.value
= (calcfloat
)factorial((long)calc
.value
);
3526 sprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3529 case '&': // bitwise and
3533 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3536 case '|': // bitwise or
3540 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3543 case '^': // bitwise xor
3547 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3550 case '~': // bitwise not
3553 calc
.value
= ~ (long) calc_atof(calc
.buffer
, calc
.numBase
);
3554 sprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3558 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3559 calc
.value
+= calc
.operand
;
3560 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3569 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3570 calc
.value
= calc
.operand
;
3573 calc
.value
-= calc
.operand
;
3574 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3585 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3586 calc
.value
= calc
.operand
;
3589 calc
.value
*= calc
.operand
;
3590 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3600 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3601 calc
.value
= calc
.operand
;
3604 calc
.value
/= calc
.operand
;
3605 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3613 if (!calc
.sciMode
) {
3616 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3617 calc
.value
= calc
.operand
;
3620 calc
.value
= (long)atof(calc
.buffer
) % (long)calc
.operand
;
3621 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3626 r
= calc_atof(calc
.buffer
, calc
.numBase
);
3628 sprintf(calc
.buffer
, FMT_DESC_FLOAT
, r
* calc
.value
/ (calcfloat
)100.0);
3639 if (calc
.numBase
== NBASE_DECIMAL
) {
3643 r
= calc_convert_to_radians(&calc
);
3644 if (calc
.hypMode
&& calc
.invMode
)
3645 calc
.value
= acosh(r
);
3646 else if (calc
.invMode
)
3647 calc
.value
= acos(r
);
3648 else if (calc
.hypMode
)
3649 calc
.value
= cosh(r
);
3651 calc
.value
= cos(calc_atof(calc
.buffer
, calc
.numBase
));
3652 sprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3663 if (calc
.numBase
== NBASE_DECIMAL
) {
3665 calcfloat r
= calc_convert_to_radians(&calc
);
3667 if (calc
.hypMode
&& calc
.invMode
)
3668 calc
.value
= asinh(r
);
3669 else if (calc
.invMode
)
3670 calc
.value
= asin(r
);
3671 else if (calc
.hypMode
)
3672 calc
.value
= sinh(r
);
3674 calc
.value
= sin(r
);
3676 sprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3687 if (calc
.numBase
== NBASE_DECIMAL
) {
3688 calcfloat r
= calc_convert_to_radians(&calc
);
3690 if (calc
.hypMode
&& calc
.invMode
)
3691 calc
.value
= atanh(r
);
3692 else if (calc
.invMode
)
3693 calc
.value
= atan(r
);
3694 else if (calc
.hypMode
)
3695 calc
.value
= tanh(r
);
3697 calc
.value
= tan(r
);
3699 sprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3707 case 'M': // dms = Degrees Minutes Seconds
3710 if (calc
.numBase
== NBASE_DECIMAL
) {
3712 calcfloat r
= calc_atof(calc
.buffer
, calc
.numBase
);
3716 r
= (long)r
+ r2
* 0.6; // multiply by 60 and divide by 100
3718 sprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3726 case 'V': // toggle scientic notation like 1.e+2 or 100
3729 calc
.displayMode
= !calc
.displayMode
;
3732 // non-standard keystrokes ...
3737 if (calc_atof(calc
.buffer
, calc
.numBase
) < 0) {
3739 strcpy(calc
.buffer
, err_invalid
);
3742 calc
.value
= sqrt(calc_atof(calc
.buffer
, calc
.numBase
));
3743 sprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3750 char s
[CALC_BUF_SIZE
] = "-";
3752 if (!strcmp(calc
.buffer
, "0"))
3755 if (calc
.buffer
[0] == '-')
3756 strcpy(s
, calc
.buffer
+1);
3758 strcpy(s
+1, calc
.buffer
);
3760 strcpy(calc
.buffer
, s
);
3764 case 'G': // debug mode
3781 case WM_CONTEXTMENU: // need to subclass control and just call WinHelp!
3782 WinHelp((HWND) wParam, "c:/windows/help/calc.hlp", HELP_CONTEXTMENU, (DWORD)(LPVOID)2);