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
27 // #include <commctrl.h>
34 // lame M$ math library doesn't support hyp functions
36 #define atanh(X) atan(X)
37 #define asinh(X) asin(X)
38 #define acosh(X) acos(X)
43 // 1. In the original calculator, numbers are "extended precision".
44 // We emulate with calcfloat (calcfloat floating point) for now.
45 // Note that recent M$ compilers 5.0 and later do not implement double float,
46 // and do not support 80-bit numbers. Max width is 64-bits.
50 // i) current edit buffer value for keystrokes
51 // ii) computed value area for last computation
52 // iii) memory area for MR, MC, MS, M+
53 // iv) formatted display buffer
55 // 3. Memory Store works off current buffer, not value
57 // 4. display limit is 32 numbers plus 10 commas plus one period = 43 characters
59 // 5. original calc is better called SciCalc and saves settings in win.ini:
62 // layout=1 (0 = scientific mode, 1 = basic mode)
63 // UseSep=1 (0 = no digits separator, 1 = enable digits separator)
67 // The menus know their own states, so we don't need to track them
68 // When switching to Standard Calculator Mode, number base is changed to Decimal and Trig Mode to Degrees,
69 // but Word Size Mode is unchanged
71 // 7. It would be nice to add command line parsing for batch files
74 // various display error messages
76 static TCHAR err_invalid
[CALC_BUF_SIZE
];
77 static TCHAR err_divide_by_zero
[CALC_BUF_SIZE
];
78 static TCHAR err_undefined
[CALC_BUF_SIZE
];
80 // calculator state is kept here
86 static int keys
[CALC_NS_COUNT
]['f'+1]; // note: sparse array
88 // map from button press to calc[] index
89 // 0, ... 9, A, B, C, D, E, F,FE,DMS,SIN,COS,TAN,EXP, PI
90 static const int h
[] = {
91 0, 0, 33, 34, 21, 22, 23, 10, 11, 12, 54, 55, 56 ,57, 58 ,59, 6, 17, 28, 39, 50, 18, 53 };
93 // enable status of various buttons on sci mode depending on number base
94 static const int btn_toggle
[CALC_NS_COUNT
][TOGGLE_COUNT
] =
95 // 0, ... 9, A, B, C, D, E, F,FE,DMS,SIN,COS,TAN,EXP,PI
97 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },
98 { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 },
99 { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
100 { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0 }
103 static int hms
[] = { 64, 65, 66 };
104 static int hws
[] = { 69, 70, 71, 72 };
106 static int sta
[] = { 16, 27, 38, 49 };
108 static HMENU menus
[3];
110 static TCHAR appname
[40];
114 int parse(int wParam
, int lParam
);
118 extern HWND hWndListBox
;
122 int WINAPI
WinMain( HINSTANCE hInst
, HINSTANCE hPrevInst
, LPSTR cmdline
, int cmdshow
)
128 TCHAR s
[CALC_BUF_SIZE
];
133 r
= GetProfileString(TEXT("SciCalc"),
140 calc
.sciMode
= _ttoi(s
);
142 if (calc
.sciMode
!= 0 &&
144 calc
.sciMode
= 1; // Standard Mode
146 r
= GetProfileString(TEXT("SciCalc"),
153 calc
.digitGrouping
= _ttoi(s
);
155 if (calc
.digitGrouping
!= 0 &&
156 calc
.digitGrouping
!= 1)
157 calc
.digitGrouping
= 1;
159 calc
.new = 1; // initialize struct values
161 if (!LoadString( hInst
, IDS_APPNAME
, appname
, sizeof(appname
) / sizeof(appname
[0])))
163 if (!LoadString( hInst
, IDS_ERR_INVALID_INPUT
, err_invalid
, sizeof(err_invalid
) / sizeof(err_invalid
[0])))
165 if (!LoadString( hInst
, IDS_ERR_DIVIDE_BY_ZERO
, err_divide_by_zero
, sizeof(err_divide_by_zero
) / sizeof(err_divide_by_zero
[0])))
167 if (!LoadString( hInst
, IDS_ERR_UNDEFINED
, err_undefined
, sizeof(err_undefined
) / sizeof(err_undefined
[0])))
170 wc
.style
= CS_HREDRAW
| CS_VREDRAW
;
171 wc
.lpfnWndProc
= MainProc
;
174 wc
.hInstance
= hInst
;
175 wc
.hIcon
= LoadIcon(hInst
, MAKEINTRESOURCE(IDI_CALCICON
));
176 wc
.hCursor
= LoadCursor( NULL
, IDI_APPLICATION
);
177 wc
.hbrBackground
= (HBRUSH
)(COLOR_BTNFACE
+1);
178 wc
.lpszMenuName
= NULL
;
179 wc
.lpszClassName
= appname
;
181 if (!RegisterClass(&wc
)) exit(1);
183 hWnd
= CreateWindow( appname
,
185 WS_CLIPSIBLINGS
| (WS_OVERLAPPEDWINDOW
& ~WS_THICKFRAME
& ~WS_MAXIMIZEBOX
),
188 calc
.sciMode
? CALC_STANDARD_WIDTH
: CALC_SCIENTIFIC_WIDTH
,
189 calc
.sciMode
? CALC_STANDARD_HEIGHT
: CALC_SCIENTIFIC_HEIGHT
,
198 ShowWindow( hWnd
, cmdshow
);
199 UpdateWindow( hWnd
);
201 if (!(haccel
= LoadAccelerators(hInst
, TEXT("MAIN_MENU"))))
204 while( GetMessage(&msg
, NULL
, 0, 0) ) {
205 if (hWndDlgStats
== 0 || !IsDialogMessage(hWndDlgStats
, &msg
)) {
206 if (!TranslateAccelerator( hWnd
, haccel
, &msg
)) {
207 TranslateMessage( &msg
);
208 DispatchMessage( &msg
);
216 LRESULT WINAPI
MainProc( HWND hWnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
224 calc
.hInst
= ((LPCREATESTRUCT
) lParam
)->hInstance
;
229 InitMenus(calc
.hInst
);
232 SetMenu(hWnd
, menus
[MENU_STD
]);
234 SetMenu(hWnd
, menus
[MENU_SCIMS
]);
236 calc_buffer_display(&calc
);
244 hdc
= BeginPaint( hWnd
, &ps
);
245 hMemDC
= CreateCompatibleDC( hdc
);
247 DrawCalc( hdc
, hMemDC
, &ps
, &calc
);
250 EndPaint( hWnd
, &ps
);
256 calc
.pos
.x
= (unsigned) LOWORD(lParam
);
257 calc
.pos
.y
= (unsigned) HIWORD(lParam
);
263 TCHAR s
[CALC_BUF_SIZE
];
265 _stprintf(s
, TEXT("%d"), calc
.sciMode
);
266 r
= WriteProfileString(TEXT("SciCalc"), TEXT("layout"), s
);
268 _stprintf(s
, TEXT("%d"), calc
.digitGrouping
);
269 r
= WriteProfileString(TEXT("SciCalc"), TEXT("UseSep"), s
);
272 DestroyCalc( &calc
);
274 PostQuitMessage( 0 );
282 MessageBox(hWnd
, TEXT("No Help Available"), TEXT("Windows Help"), MB_OK
);
289 if (calc
.numBase
== NBASE_DECIMAL
)
290 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_MS_DEGREES
, lParam
);
292 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_WS_DWORD
, lParam
);
300 if (calc
.numBase
== NBASE_DECIMAL
)
301 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_MS_RADIANS
, lParam
);
303 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_WS_WORD
, lParam
);
312 if (calc
.numBase
== NBASE_DECIMAL
)
313 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_MS_GRADS
, lParam
);
315 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_WS_BYTE
, lParam
);
323 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_NS_HEX
, lParam
);
326 case VK_F6
: // Decimal
330 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_NS_DEC
, lParam
);
337 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_NS_OCT
, lParam
);
340 case VK_F8
: // Binary
344 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_NS_BIN
, lParam
);
347 case VK_F12
: // QWORD
351 SendMessage(hWnd
, WM_COMMAND
, ID_CALC_WS_QWORD
, lParam
);
357 SendMessage(hWnd
, WM_CHAR
, 'Z', lParam
);
360 case VK_INSERT
: // Dat
362 SendMessage(hWndListBox
, LB_INSERTSTRING
, -1, (LPARAM
)calc
.buffer
);
363 InvalidateRect(hWndDlgStats
, NULL
, TRUE
); // update list count at bottom edge of dialog
364 UpdateWindow(hWndDlgStats
);
370 calc
.buffer
[0] = TEXT('\0');
371 calc_buffer_display(&calc
);
382 show_debug(&calc
, TEXT("Start WM_CHAR"), wParam
, lParam
);
386 case TEXT('\x13'): // Ctrl+S Sta Statistics
388 if (hWndDlgStats
) { // Statistics Box already displayed, focus but don't create another one
389 // SetFocus(hWndDlgStats);
390 // SendMessage(hWndDlgStats, WM_SETFOCUS, 0, 0);
397 EnableWindow((HWND
)calc
.cb
[sta
[i
]].hBtn
, FALSE
);
401 EnableWindow((HWND
)calc
.cb
[sta
[i
]].hBtn
, TRUE
);
403 hWndDlgStats
= CreateDialog( // modeless dialog
404 calc
.hInst
, // handle to application instance
405 TEXT("DLG_STATS"), // identifies dialog box template name
406 hWnd
, // handle to owner window
407 StatsDlgProc
); // pointer to dialog box procedure
412 SendMessage(hWndDlgStats
, WM_SETFOCUS
, 0, 0);
418 case TEXT('\x01'): // Ctrl+A Ave Statistics
419 case TEXT('\x04'): // Ctrl+D s Standard Deviation Statistics
420 case TEXT('\x14'): // Ctrl+T Sum Statistics
425 TCHAR s
[CALC_BUF_SIZE
];
431 // This is all lame. Here we are querying the list control for items and calculating the total.
432 // We should have an array of intermediate results to work with to avoid roundoff errors, etc.
434 n
= SendMessage(hWndListBox
, LB_GETCOUNT
, 0, 0);
437 SendMessage(hWndListBox
, LB_GETTEXT
, i
, (LPARAM
)s
);
438 val
= calc_atof(s
,calc
.numBase
);
443 if (LOWORD(wParam
) != TEXT('\x14')) // not sum only
446 if (LOWORD(wParam
== TEXT('\x04'))) { // standard deviation is sqrt(sum( xbar - x )^2 / (n-1))
450 val
+= pow(x
[i
] - avg
, 2);
453 total
= sqrt(val
/ n
); // complete population
455 total
= sqrt(val
/ (n
- 1)); // sample of population
458 if (LOWORD(wParam
) == TEXT('\x01')) // average or mean
461 calc_ftoa(&calc
, total
, s
);
462 _tcscpy(calc
.buffer
, s
);
463 calc_buffer_display(&calc
);
468 case TEXT('\x03'): // Ctrl+C Copy
473 HGLOBAL hGlobalMemory
;
474 LPTSTR pGlobalMemory
;
476 if (!(len
= _tcslen(calc
.display
)))
479 if (!(s
= calc
.display
))
482 if (s
[len
- 1] == TEXT('.') || s
[len
- 1] == TEXT(','))
485 if (!(hGlobalMemory
= GlobalAlloc(GHND
, (len
+ 1) * sizeof(TCHAR
))))
488 if (!(pGlobalMemory
= GlobalLock(hGlobalMemory
)))
491 for (i
= 0; i
< len
; i
++)
492 *pGlobalMemory
++ = *s
++;
494 pGlobalMemory
[len
- 1] = 0;
496 GlobalUnlock(hGlobalMemory
); // call GetLastError() for exception handling
498 if (!OpenClipboard(hWnd
))
501 if (!EmptyClipboard())
504 if (!SetClipboardData(CF_TTEXT
, hGlobalMemory
))
507 if (!CloseClipboard())
512 case TEXT('\x16'): // Ctrl+V Paste
519 HGLOBAL hGlobalMemory
;
520 LPTSTR pGlobalMemory
;
522 if (IsClipboardFormatAvailable(CF_TTEXT
)) {
523 if (!OpenClipboard(hWnd
))
526 if (!(hGlobalMemory
= GetClipboardData(CF_TTEXT
)))
529 if (!(size
= GlobalSize(hGlobalMemory
)))
532 if (!(s
= (TCHAR
*)malloc(size
)))
535 if (!(pGlobalMemory
= GlobalLock(hGlobalMemory
)))
538 _tcscpy(s
, pGlobalMemory
);
540 GlobalUnlock(hGlobalMemory
);
542 if (!CloseClipboard())
545 // calc paste protocol
547 // :c clear memory WM_CHAR, 0x0c
548 // :e enable scientific notation WM_CHAR, 'v'
549 // :m store display in memory WM_CHAR, 0x0d
550 // :p add display to memory WM_CHAR, 0x10
551 // :q clear current calculation WM_CHAR, '\x1b'
552 // :r read memory into display WM_CHAR, 0x12
553 // \ Dat WM_CHAR, VK_INSERT
555 // parse the pasted data, validate and SendMessage it one character at a time.
556 // it would appear wincalc does it this way (slow), although very slow appearing on Wine.
558 while ((c
= *s
++) && (i
++ < size
/ sizeof(TCHAR
))) {
559 if (c
== TEXT(':')) {
562 else if (c
== TEXT('\\')) {
563 SendMessage(hWnd
, WM_KEYDOWN
, VK_INSERT
, lParam
);
570 case TEXT('c'): // clear memory
573 SendMessage(hWnd
, WM_CHAR
, 0x0c, lParam
);
575 case TEXT('e'): // enable scientific notation
578 SendMessage(hWnd
, WM_CHAR
, 'v', lParam
);
580 case TEXT('m'): // store display in memory
583 SendMessage(hWnd
, WM_CHAR
, 0x0d, NUMBER_OF_THE_BEAST
);
585 case TEXT('p'): // add display to memory
588 SendMessage(hWnd
, WM_CHAR
, 0x10, lParam
);
590 case TEXT('q'): // clear current calculation
593 SendMessage(hWnd
, WM_CHAR
, TEXT('\x1b'), lParam
);
595 case TEXT('r'): // read memory into display
598 SendMessage(hWnd
, WM_CHAR
, 0x12, lParam
);
600 default: // just eat it but complain
607 if ((calc
.numBase
== NBASE_HEX
) &&
608 ((c
>= TEXT('0') && c
<= TEXT('9')) ||
609 (c
>= TEXT('a') && c
<= TEXT('f')) ||
610 (c
>= TEXT('A') && c
<= TEXT('F')))) {
612 SendMessage(hWnd
, WM_CHAR
, c
, lParam
);
614 else if ((calc
.numBase
== NBASE_DECIMAL
) &&
615 (c
>= TEXT('0') && c
<= TEXT('9'))) {
616 SendMessage(hWnd
, WM_CHAR
, c
, lParam
);
618 else if ((calc
.numBase
== NBASE_OCTAL
) &&
619 (c
>= TEXT('0') && c
<= TEXT('7'))) {
620 SendMessage(hWnd
, WM_CHAR
, c
, lParam
);
622 else if ((calc
.numBase
== NBASE_BINARY
) &&
623 (c
== TEXT('0') || c
== TEXT('1'))) {
624 SendMessage(hWnd
, WM_CHAR
, c
, lParam
);
626 else if (c
== TEXT('.') || c
== TEXT(',') ||
627 c
== TEXT('e') || c
== TEXT('E') ||
628 c
== TEXT('+') || c
== TEXT('-')) {
629 SendMessage(hWnd
, WM_CHAR
, c
, lParam
);
631 else if (c
== TEXT(' ') || // eat harmless trash here
636 else { // extra spicy trash gets noticed
638 MessageBeep(0); // uh, beeps can get annoying. maybe rate limit.
649 parse(wParam
, lParam
);
653 calc_buffer_display(&calc
);
657 switch(LOWORD(wParam
)) {
660 SendMessage(hWnd
, WM_CHAR
, TEXT('\x03'), lParam
);
664 SendMessage(hWnd
, WM_CHAR
, TEXT('\x16'), lParam
);
667 case IDM_MODE_STANDARD
:
673 calc
.trigMode
= TRIGMODE_DEGREES
;
674 calc
.numBase
= NBASE_DECIMAL
;
676 EnableWindow(hWnd
, FALSE
);
679 for (i
=1;i
<COUNT_MENUS
;i
++) {
680 if (calc
.numBase
!= ID_CALC_NS_DEC
) {
681 CheckMenuItem(menus
[i
], ID_CALC_NS_HEX
, MF_UNCHECKED
);
682 CheckMenuItem(menus
[i
], ID_CALC_NS_DEC
, MF_CHECKED
);
683 CheckMenuItem(menus
[i
], ID_CALC_NS_OCT
, MF_UNCHECKED
);
684 CheckMenuItem(menus
[i
], ID_CALC_NS_BIN
, MF_UNCHECKED
);
688 for (i
=1;i
<COUNT_MENUS
;i
++) {
689 CheckMenuItem(menus
[i
], ID_CALC_MS_DEGREES
, MF_CHECKED
);
690 CheckMenuItem(menus
[i
], ID_CALC_MS_RADIANS
, MF_UNCHECKED
);
691 CheckMenuItem(menus
[i
], ID_CALC_MS_GRADS
, MF_UNCHECKED
);
694 SetMenu(hWnd
, menus
[MENU_STD
]);
696 // SendMessage(hWnd, WM_SIZE, SIZE_RESTORED, CALC_STANDARD_WIDTH | (CALC_STANDARD_HEIGHT << 8));
697 GetWindowRect(hWnd
, &lpRect
);
698 MoveWindow(hWnd
, lpRect
.left
, lpRect
.top
, CALC_STANDARD_WIDTH
, CALC_STANDARD_HEIGHT
, TRUE
);
702 EnableWindow(hWnd
, TRUE
);
707 case IDM_MODE_SCIENTIFIC
:
712 EnableWindow(hWnd
, FALSE
);
714 SetMenu(hWnd
, menus
[MENU_SCIMS
]);
716 GetWindowRect(hWnd
, &lpRect
);
717 MoveWindow(hWnd
, lpRect
.left
, lpRect
.top
, CALC_SCIENTIFIC_WIDTH
, CALC_SCIENTIFIC_HEIGHT
, TRUE
);
722 SendMessage(calc
.cb
[67].hBtn
, BM_SETCHECK
, TRUE
, 0);
725 SendMessage(calc
.cb
[68].hBtn
, BM_SETCHECK
, TRUE
, 0);
727 EnableWindow(hWnd
, TRUE
);
732 case IDM_DIGIT_GROUPING
:
737 calc
.digitGrouping
= !calc
.digitGrouping
;
739 n
= (calc
.digitGrouping
? MF_CHECKED
: MF_UNCHECKED
);
741 for (i
=0;i
<COUNT_MENUS
;i
++)
742 CheckMenuItem(menus
[i
], IDM_DIGIT_GROUPING
, n
);
744 calc_buffer_display(&calc
);
748 case IDM_HELP_TOPICS
:
749 MessageBox(hWnd
, TEXT("No Help Available"), TEXT("Windows Help"), MB_OK
);
753 DialogBox( calc
.hInst
, TEXT("DLG_ABOUT"), hWnd
, AboutDlgProc
);
762 int w
= LOWORD(wParam
);
764 if (w
== ID_CALC_NS_HEX
) {
765 if (calc
.numBase
== NBASE_HEX
)
768 calc
.numBase
= NBASE_HEX
;
770 else if (w
== ID_CALC_NS_DEC
) {
771 if (calc
.numBase
== NBASE_DECIMAL
)
774 calc
.numBase
= NBASE_DECIMAL
;
776 else if (w
== ID_CALC_NS_OCT
) {
777 if (calc
.numBase
== NBASE_OCTAL
)
780 calc
.numBase
= NBASE_OCTAL
;
782 else if (w
== ID_CALC_NS_BIN
) {
783 if (calc
.numBase
== NBASE_BINARY
)
786 calc
.numBase
= NBASE_BINARY
;
789 for (i
=0;i
<CALC_NS_COUNT
;i
++)
790 SendMessage(calc
.cb
[60+i
].hBtn
, BM_SETCHECK
, w
== (ID_CALC_NS_HEX
+ i
) ? 1 : 0, 0);
792 for (i
=2;i
<TOGGLE_COUNT
;i
++) { // skip 0 and 1, always valid
793 if (btn_toggle
[w
- ID_CALC_NS_HEX
][i
]) {
794 if (!IsWindowEnabled((HWND
)calc
.cb
[h
[i
]].hBtn
))
795 EnableWindow((HWND
)calc
.cb
[h
[i
]].hBtn
, TRUE
);
799 if (IsWindowEnabled((HWND
)calc
.cb
[h
[i
]].hBtn
))
800 EnableWindow((HWND
)calc
.cb
[h
[i
]].hBtn
, FALSE
);
804 if (w
== ID_CALC_NS_DEC
) {
805 for (i
=0;i
<CALC_WS_COUNT
;i
++) {
806 if (IsWindowEnabled((HWND
)calc
.cb
[hws
[i
]].hBtn
)) {
807 ShowWindow((HWND
)calc
.cb
[hws
[i
]].hBtn
, SW_HIDE
);
808 EnableWindow((HWND
)calc
.cb
[hws
[i
]].hBtn
, FALSE
);
811 for (i
=0;i
<CALC_MS_COUNT
;i
++) {
812 if (!IsWindowEnabled((HWND
)calc
.cb
[hms
[i
]].hBtn
)) {
813 ShowWindow((HWND
)calc
.cb
[hms
[i
]].hBtn
, SW_SHOWNORMAL
);
814 EnableWindow((HWND
)calc
.cb
[hms
[i
]].hBtn
, TRUE
);
819 for (i
=0;i
<CALC_MS_COUNT
;i
++) {
820 if (IsWindowEnabled((HWND
)calc
.cb
[hms
[i
]].hBtn
)) {
821 ShowWindow((HWND
)calc
.cb
[hms
[i
]].hBtn
, SW_HIDE
);
822 EnableWindow((HWND
)calc
.cb
[hms
[i
]].hBtn
, FALSE
);
825 for (i
=0;i
<CALC_WS_COUNT
;i
++) {
826 if (!IsWindowEnabled((HWND
)calc
.cb
[hws
[i
]].hBtn
)) {
827 ShowWindow((HWND
)calc
.cb
[hws
[i
]].hBtn
, SW_SHOWNORMAL
);
828 EnableWindow((HWND
)calc
.cb
[hws
[i
]].hBtn
, TRUE
);
833 CheckMenuItem(menus
[i
], ID_CALC_MS_DEGREES
, MF_CHECKED
);
835 for (i
=1;i
<COUNT_MENUS
;i
++) { // skip the simple Standard calculator mode
836 CheckMenuItem(menus
[i
], ID_CALC_NS_HEX
, (w
== ID_CALC_NS_HEX
? MF_CHECKED
: MF_UNCHECKED
) );
837 CheckMenuItem(menus
[i
], ID_CALC_NS_DEC
, (w
== ID_CALC_NS_DEC
? MF_CHECKED
: MF_UNCHECKED
) );
838 CheckMenuItem(menus
[i
], ID_CALC_NS_OCT
, (w
== ID_CALC_NS_OCT
? MF_CHECKED
: MF_UNCHECKED
) );
839 CheckMenuItem(menus
[i
], ID_CALC_NS_BIN
, (w
== ID_CALC_NS_BIN
? MF_CHECKED
: MF_UNCHECKED
) );
842 if (wParam
== ID_CALC_NS_DEC
) {
843 SetMenu(hWnd
, menus
[MENU_SCIMS
]);
847 calc
.displayMode
= 0;
848 SetMenu(hWnd
, menus
[MENU_SCIWS
]);
851 calc_buffer_display(&calc
);
855 case ID_CALC_MS_DEGREES
:
856 case ID_CALC_MS_RADIANS
:
857 case ID_CALC_MS_GRADS
:
860 int w
= LOWORD(wParam
);
862 if (w
== ID_CALC_MS_DEGREES
)
863 calc
.trigMode
= TRIGMODE_DEGREES
;
864 else if (w
== ID_CALC_MS_RADIANS
)
865 calc
.trigMode
= TRIGMODE_RADIANS
;
866 else if (w
== ID_CALC_MS_GRADS
)
867 calc
.trigMode
= TRIGMODE_GRADS
;
871 for (i
=0;i
<CALC_MS_COUNT
;i
++)
872 SendMessage(calc
.cb
[64+i
].hBtn
, BM_SETCHECK
, w
== (ID_CALC_MS_DEGREES
+ i
) ? 1 : 0, 0);
874 for (i
=1;i
<COUNT_MENUS
;i
++) { // skip the simple Standard calculator mode
875 CheckMenuItem(menus
[i
], ID_CALC_MS_DEGREES
, (wParam
== ID_CALC_MS_DEGREES
) ? MF_CHECKED
: MF_UNCHECKED
);
876 CheckMenuItem(menus
[i
], ID_CALC_MS_RADIANS
, (wParam
== ID_CALC_MS_RADIANS
) ? MF_CHECKED
: MF_UNCHECKED
);
877 CheckMenuItem(menus
[i
], ID_CALC_MS_GRADS
, (wParam
== ID_CALC_MS_GRADS
) ? MF_CHECKED
: MF_UNCHECKED
);
884 case ID_CALC_WS_QWORD
:
885 case ID_CALC_WS_DWORD
:
886 case ID_CALC_WS_WORD
:
887 case ID_CALC_WS_BYTE
:
890 int w
= LOWORD(wParam
);
894 for (i
=0;i
<CALC_WS_COUNT
;i
++)
895 SendMessage(calc
.cb
[69+i
].hBtn
, BM_SETCHECK
, LOWORD(wParam
) == (ID_CALC_WS_QWORD
+ i
) ? 1 : 0, 0);
897 for (i
=1; i
<COUNT_MENUS
; i
++) { // skip the simple Standard calculator mode
898 CheckMenuItem(menus
[i
], ID_CALC_WS_QWORD
, (w
== ID_CALC_WS_QWORD
? MF_CHECKED
: MF_UNCHECKED
) );
899 CheckMenuItem(menus
[i
], ID_CALC_WS_DWORD
, (w
== ID_CALC_WS_DWORD
? MF_CHECKED
: MF_UNCHECKED
) );
900 CheckMenuItem(menus
[i
], ID_CALC_WS_WORD
, (w
== ID_CALC_WS_WORD
? MF_CHECKED
: MF_UNCHECKED
) );
901 CheckMenuItem(menus
[i
], ID_CALC_WS_BYTE
, (w
== ID_CALC_WS_BYTE
? MF_CHECKED
: MF_UNCHECKED
) );
914 SendMessage(calc
.cb
[67].hBtn
, BM_SETCHECK
, calc
.invMode
? TRUE
: FALSE
, 0);
924 SendMessage(calc
.cb
[68].hBtn
, BM_SETCHECK
, calc
.hypMode
? TRUE
: FALSE
, 0);
929 if (HIWORD(wParam
) == BN_CLICKED
) {
932 LOWORD(wParam
) != ID_CALC_CLEAR_ENTRY
&&
933 LOWORD(wParam
) != ID_CALC_CLEAR_ALL
) {
942 switch (LOWORD(wParam
)) {
954 SendMessage(hWnd
, WM_CHAR
, LOWORD(wParam
)+TEXT('0') , lParam
);
958 SendMessage(hWnd
, WM_CHAR
, TEXT('a'), lParam
);
962 SendMessage(hWnd
, WM_CHAR
, TEXT('b'), lParam
);
966 SendMessage(hWnd
, WM_CHAR
, TEXT('c'), lParam
);
970 SendMessage(hWnd
, WM_CHAR
, TEXT('d'), lParam
);
974 SendMessage(hWnd
, WM_CHAR
, TEXT('e'), lParam
);
978 SendMessage(hWnd
, WM_CHAR
, TEXT('f'), lParam
);
981 case ID_CALC_DECIMAL
:
982 SendMessage(hWnd
, WM_CHAR
, TEXT('.'), lParam
);
985 case ID_CALC_BACKSPACE
:
986 SendMessage(hWnd
, WM_CHAR
, TEXT('\b'), lParam
);
989 case ID_CALC_CLEAR_ENTRY
:
990 SendMessage(hWnd
, WM_KEYDOWN
, VK_DELETE
, lParam
);
993 case ID_CALC_CLEAR_ALL
:
994 SendMessage(hWnd
, WM_CHAR
, TEXT('\x1b'), lParam
);
997 case ID_CALC_MEM_CLEAR
:
998 SendMessage(hWnd
, WM_CHAR
, 0x0c, lParam
);
1001 case ID_CALC_MEM_RECALL
:
1002 SendMessage(hWnd
, WM_CHAR
, 0x12, lParam
);
1005 case ID_CALC_MEM_STORE
:
1006 SendMessage(hWnd
, WM_CHAR
, 0x0d, NUMBER_OF_THE_BEAST
); // trying to tell between Return and Ctrl+M
1009 case ID_CALC_MEM_PLUS
:
1010 SendMessage(hWnd
, WM_CHAR
, 0x10, lParam
);
1014 SendMessage(hWnd
, WM_CHAR
, TEXT('?'), lParam
); // this is not a wincalc keystroke
1017 case ID_CALC_SQUARE
:
1018 SendMessage(hWnd
, WM_CHAR
, TEXT('@'), lParam
);
1022 SendMessage(hWnd
, WM_CHAR
, TEXT('p'), lParam
);
1026 SendMessage(hWnd
, WM_CHAR
, TEXT('n'), lParam
);
1030 SendMessage(hWnd
, WM_CHAR
, TEXT('l'), lParam
);
1034 SendMessage(hWnd
, WM_CHAR
, TEXT('#'), lParam
);
1038 SendMessage(hWnd
, WM_CHAR
, TEXT('y'), lParam
);
1042 SendMessage(hWnd
, WM_CHAR
, TEXT('s'), lParam
);
1046 SendMessage(hWnd
, WM_CHAR
, TEXT('o'), lParam
);
1050 SendMessage(hWnd
, WM_CHAR
, TEXT('t'), lParam
);
1054 SendMessage(hWnd
, WM_CHAR
, TEXT('<'), lParam
);
1058 SendMessage(hWnd
, WM_CHAR
, TEXT('~'), lParam
);
1062 SendMessage(hWnd
, WM_CHAR
, TEXT('&'), lParam
);
1066 SendMessage(hWnd
, WM_CHAR
, TEXT('|'), lParam
);
1070 SendMessage(hWnd
, WM_CHAR
, TEXT('^'), lParam
);
1074 SendMessage(hWnd
, WM_CHAR
, TEXT(';'), lParam
);
1077 case ID_CALC_FACTORIAL
:
1078 SendMessage(hWnd
, WM_CHAR
, TEXT('!'), lParam
);
1081 case ID_CALC_RECIPROCAL
:
1082 SendMessage(hWnd
, WM_CHAR
, TEXT('r'), lParam
);
1086 SendMessage(hWnd
, WM_KEYDOWN
, VK_F9
, lParam
);
1090 SendMessage(hWnd
, WM_CHAR
, TEXT('+'), lParam
);
1094 SendMessage(hWnd
, WM_CHAR
, TEXT('-'), lParam
);
1097 case ID_CALC_MULTIPLY
:
1098 SendMessage(hWnd
, WM_CHAR
, TEXT('*'), lParam
);
1101 case ID_CALC_DIVIDE
:
1102 SendMessage(hWnd
, WM_CHAR
, TEXT('/'), lParam
);
1105 case ID_CALC_EQUALS
:
1106 SendMessage(hWnd
, WM_CHAR
, TEXT('='), lParam
);
1109 case ID_CALC_PERCENT
:
1110 SendMessage(hWnd
, WM_CHAR
, TEXT('%'), lParam
);
1114 SendMessage(hWnd
, WM_CHAR
, TEXT('x'), lParam
);
1118 SendMessage(hWnd
, WM_CHAR
, TEXT('v'), lParam
);
1121 case ID_CALC_LEFTPAREN
:
1122 SendMessage(hWnd
, WM_CHAR
, TEXT('('), lParam
);
1125 case ID_CALC_RIGHTPAREN
:
1126 SendMessage(hWnd
, WM_CHAR
, TEXT(')'), lParam
);
1130 SendMessage(hWnd
, WM_CHAR
, TEXT('%'), lParam
);
1134 SendMessage(hWnd
, WM_KEYDOWN
, VK_INSERT
, lParam
);
1138 SendMessage(hWnd
, WM_CHAR
, TEXT('\x01'), lParam
); // Ctrl+A
1142 SendMessage(hWnd
, WM_CHAR
, TEXT('\x04'), lParam
); // Ctrl+D
1146 SendMessage(hWnd
, WM_CHAR
, TEXT('\x13'), lParam
); // Ctrl+S
1150 SendMessage(hWnd
, WM_CHAR
, TEXT('\x14'), lParam
); // Ctrl+T
1154 SendMessage(hWnd
, WM_CHAR
, TEXT('m'), lParam
);
1160 } // button message switch
1166 show_debug(&calc
, TEXT("After WM_CHAR"), wParam
, lParam
);
1171 } // WM_COMMAND switch
1172 } // Main Message switch
1173 return( DefWindowProc( hWnd
, msg
, wParam
, lParam
));
1180 // initialize keys lut for validating keystrokes in various number bases
1182 for (i
=TEXT('0');i
<=TEXT('9');i
++) {
1183 keys
[NBASE_HEX
][i
] = 1;
1184 keys
[NBASE_DECIMAL
][i
] = 1;
1187 keys
[NBASE_OCTAL
][i
] = 1;
1190 keys
[NBASE_BINARY
][i
] = 1;
1193 for (i
=TEXT('a');i
<=TEXT('f');i
++)
1194 keys
[NBASE_HEX
][i
] = 1;
1196 for (i
=TEXT('A');i
<=TEXT('F');i
++)
1197 keys
[NBASE_HEX
][i
] = 1;
1200 void InitMenus(HINSTANCE hInst
)
1202 if (!(menus
[MENU_STD
] = LoadMenu(hInst
,TEXT("MAIN_MENU"))))
1205 if (!(menus
[MENU_SCIMS
] = LoadMenu(hInst
,TEXT("SCIMS_MENU"))))
1208 if (!(menus
[MENU_SCIWS
] = LoadMenu(hInst
,TEXT("SCIWS_MENU"))))
1211 CheckMenuItem(menus
[MENU_STD
], IDM_MODE_STANDARD
, MF_CHECKED
);
1212 if (calc
.digitGrouping
) {
1213 CheckMenuItem(menus
[MENU_STD
], IDM_DIGIT_GROUPING
, MF_CHECKED
);
1214 CheckMenuItem(menus
[MENU_SCIMS
], IDM_DIGIT_GROUPING
, MF_CHECKED
);
1215 CheckMenuItem(menus
[MENU_SCIWS
], IDM_DIGIT_GROUPING
, MF_CHECKED
);
1218 calc_setmenuitem_radio(menus
[MENU_STD
], IDM_MODE_STANDARD
);
1219 calc_setmenuitem_radio(menus
[MENU_STD
], IDM_MODE_SCIENTIFIC
);
1222 calc_setmenuitem_radio(menus
[MENU_SCIMS
], IDM_MODE_STANDARD
);
1223 calc_setmenuitem_radio(menus
[MENU_SCIMS
], IDM_MODE_SCIENTIFIC
);
1225 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_NS_HEX
);
1226 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_NS_DEC
);
1227 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_NS_OCT
);
1228 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_NS_BIN
);
1230 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_MS_DEGREES
);
1231 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_MS_RADIANS
);
1232 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_MS_GRADS
);
1233 CheckMenuItem(menus
[MENU_SCIMS
], IDM_MODE_SCIENTIFIC
, MF_CHECKED
);
1234 CheckMenuItem(menus
[MENU_SCIMS
], ID_CALC_NS_DEC
, MF_CHECKED
);
1235 CheckMenuItem(menus
[MENU_SCIMS
], ID_CALC_MS_DEGREES
, MF_CHECKED
);
1238 calc_setmenuitem_radio(menus
[MENU_SCIWS
], IDM_MODE_STANDARD
);
1239 calc_setmenuitem_radio(menus
[MENU_SCIWS
], IDM_MODE_SCIENTIFIC
);
1241 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_NS_HEX
);
1242 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_NS_DEC
);
1243 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_NS_OCT
);
1244 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_NS_BIN
);
1246 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_WS_QWORD
);
1247 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_WS_DWORD
);
1248 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_WS_WORD
);
1249 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_WS_BYTE
);
1250 CheckMenuItem(menus
[MENU_SCIWS
], IDM_MODE_SCIENTIFIC
, MF_CHECKED
);
1251 CheckMenuItem(menus
[MENU_SCIWS
], ID_CALC_NS_DEC
, MF_CHECKED
);
1252 CheckMenuItem(menus
[MENU_SCIWS
], ID_CALC_WS_QWORD
, MF_CHECKED
);
1255 void InitCalc (CALC
*calc
)
1262 HINSTANCE hInst
= calc
->hInst
;
1263 HFONT hFont
= GetStockObject(DEFAULT_GUI_FONT
);
1265 calc
->trigMode
= TRIGMODE_DEGREES
;
1266 calc
->numBase
= NBASE_DECIMAL
;
1273 calc
->displayMode
= 0;
1274 calc
->buffer
[0] = TEXT('\0');
1275 _tcscpy(calc
->display
, TEXT("0."));
1278 calc
->next
= TEXT('\0');
1280 calc
->wordSize
= WORDSIZE_QWORD
;
1285 if (calc
->sciMode
) {
1286 calc
->numButtons
= CALC_BUTTONS_STANDARD
;
1290 skipx
= MARGIN_LEFT
;
1291 skipy
= CALC_STANDARD_MARGIN_TOP
+ CALC_EDIT_HEIGHT
;
1294 _tcscpy(calc
->cb
[0].label
,TEXT("FILLER"));
1295 calc
->cb
[0].color
= CALC_COLOR_BLUE
;
1296 calc
->cb
[0].r
.left
= skipx
+ 4;
1297 calc
->cb
[0].r
.top
= skipy
+ 2;
1298 calc
->cb
[0].r
.right
= skipx
+ SZ_FILLER_X
- 2;
1299 calc
->cb
[0].r
.bottom
= skipy
+ SZ_FILLER_Y
- 2;
1300 calc
->cb
[0].enable
= 1;
1302 skipx
= SZ_FILLER_X
+ MARGIN_STANDARD_BIG_X
+ 11;
1304 calc
->cb
[1].id
= ID_CALC_BACKSPACE
;
1305 LoadString( hInst
, IDS_BTN_BACKSPACE
, calc
->cb
[1].label
, sizeof(calc
->cb
[1].label
) / sizeof(calc
->cb
[1].label
[0]));
1306 calc
->cb
[1].color
= CALC_COLOR_RED
;
1307 calc
->cb
[1].r
.left
= skipx
;
1308 calc
->cb
[1].r
.top
= skipy
;
1309 calc
->cb
[1].r
.right
= SZ_BIGBTN_X
;
1310 calc
->cb
[1].r
.bottom
= SZ_BIGBTN_Y
;
1311 calc
->cb
[1].enable
= 1;
1313 skipx
+= SZ_BIGBTN_X
+ MARGIN_SMALL_X
;
1315 calc
->cb
[2].id
= ID_CALC_CLEAR_ENTRY
;
1316 LoadString( hInst
, IDS_BTN_CLEAR_ENTRY
, calc
->cb
[2].label
, sizeof(calc
->cb
[2].label
) / sizeof(calc
->cb
[2].label
[0]));
1317 calc
->cb
[2].color
= CALC_COLOR_RED
;
1318 calc
->cb
[2].r
.left
= skipx
;
1319 calc
->cb
[2].r
.top
= skipy
;
1320 calc
->cb
[2].r
.right
= SZ_BIGBTN_X
;
1321 calc
->cb
[2].r
.bottom
= SZ_BIGBTN_Y
;
1322 calc
->cb
[2].enable
= 1;
1324 skipx
+= SZ_BIGBTN_X
+ MARGIN_SMALL_X
;
1326 calc
->cb
[3].id
= ID_CALC_CLEAR_ALL
;
1327 LoadString( hInst
, IDS_BTN_CLEAR_ALL
, calc
->cb
[3].label
, sizeof(calc
->cb
[3].label
) / sizeof(calc
->cb
[3].label
[0]));
1328 calc
->cb
[3].color
= CALC_COLOR_RED
;
1329 calc
->cb
[3].r
.left
= skipx
;
1330 calc
->cb
[3].r
.top
= skipy
;
1331 calc
->cb
[3].r
.right
= SZ_BIGBTN_X
;
1332 calc
->cb
[3].r
.bottom
= SZ_BIGBTN_Y
;
1333 calc
->cb
[3].enable
= 1;
1337 skipx
= MARGIN_LEFT
;
1338 skipy
+= SZ_BIGBTN_Y
+ MARGIN_BIG_Y
;
1340 calc
->cb
[4].id
= ID_CALC_MEM_CLEAR
;
1341 LoadString( hInst
, IDS_BTN_MEM_CLEAR
, calc
->cb
[4].label
, sizeof(calc
->cb
[4].label
) / sizeof(calc
->cb
[4].label
[0]));
1342 calc
->cb
[4].color
= CALC_COLOR_RED
;
1343 calc
->cb
[4].r
.left
= skipx
;
1344 calc
->cb
[4].r
.top
= skipy
;
1345 calc
->cb
[4].r
.right
= SZ_MEDBTN_X
;
1346 calc
->cb
[4].r
.bottom
= SZ_MEDBTN_Y
;
1347 calc
->cb
[4].enable
= 1;
1349 skipx
+= SZ_MEDBTN_X
+ MARGIN_STANDARD_BIG_X
;
1351 calc
->cb
[5].id
= ID_CALC_SEVEN
;
1352 _tcscpy(calc
->cb
[5].label
,TEXT("7"));
1353 calc
->cb
[5].color
= CALC_COLOR_BLUE
;
1354 calc
->cb
[5].r
.left
= skipx
;
1355 calc
->cb
[5].r
.top
= skipy
;
1356 calc
->cb
[5].r
.right
= SZ_MEDBTN_X
;
1357 calc
->cb
[5].r
.bottom
= SZ_MEDBTN_Y
;
1358 calc
->cb
[5].enable
= 1;
1360 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1362 calc
->cb
[6].id
= ID_CALC_EIGHT
;
1363 _tcscpy(calc
->cb
[6].label
,TEXT("8"));
1364 calc
->cb
[6].color
= CALC_COLOR_BLUE
;
1365 calc
->cb
[6].r
.left
= skipx
;
1366 calc
->cb
[6].r
.top
= skipy
;
1367 calc
->cb
[6].r
.right
= SZ_MEDBTN_X
;
1368 calc
->cb
[6].r
.bottom
= SZ_MEDBTN_Y
;
1369 calc
->cb
[6].enable
= 1;
1371 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1373 calc
->cb
[7].id
= ID_CALC_NINE
;
1374 _tcscpy(calc
->cb
[7].label
,TEXT("9"));
1375 calc
->cb
[7].color
= CALC_COLOR_BLUE
;
1376 calc
->cb
[7].r
.left
= skipx
;
1377 calc
->cb
[7].r
.top
= skipy
;
1378 calc
->cb
[7].r
.right
= SZ_MEDBTN_X
;
1379 calc
->cb
[7].r
.bottom
= SZ_MEDBTN_Y
;
1380 calc
->cb
[7].enable
= 1;
1382 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1384 calc
->cb
[8].id
= ID_CALC_DIVIDE
;
1385 _tcscpy(calc
->cb
[8].label
,TEXT("/"));
1386 calc
->cb
[8].color
= CALC_COLOR_RED
;
1387 calc
->cb
[8].r
.left
= skipx
;
1388 calc
->cb
[8].r
.top
= skipy
;
1389 calc
->cb
[8].r
.right
= SZ_MEDBTN_X
;
1390 calc
->cb
[8].r
.bottom
= SZ_MEDBTN_Y
;
1391 calc
->cb
[8].enable
= 1;
1393 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1395 calc
->cb
[9].id
= ID_CALC_SQRT
;
1396 LoadString( hInst
, IDS_BTN_SQRT
, calc
->cb
[9].label
, sizeof(calc
->cb
[9].label
) / sizeof(calc
->cb
[9].label
[0]));
1397 calc
->cb
[9].color
= CALC_COLOR_BLUE
;
1398 calc
->cb
[9].r
.left
= skipx
;
1399 calc
->cb
[9].r
.top
= skipy
;
1400 calc
->cb
[9].r
.right
= SZ_MEDBTN_X
;
1401 calc
->cb
[9].r
.bottom
= SZ_MEDBTN_Y
;
1402 calc
->cb
[9].enable
= 1;
1406 skipx
= MARGIN_LEFT
;
1407 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1409 calc
->cb
[10].id
= ID_CALC_MEM_RECALL
;
1410 LoadString( hInst
, IDS_BTN_MEM_RECALL
, calc
->cb
[10].label
, sizeof(calc
->cb
[10].label
) / sizeof(calc
->cb
[10].label
[0]));
1411 calc
->cb
[10].color
= CALC_COLOR_RED
;
1412 calc
->cb
[10].r
.left
= skipx
;
1413 calc
->cb
[10].r
.top
= skipy
;
1414 calc
->cb
[10].r
.right
= SZ_MEDBTN_X
;
1415 calc
->cb
[10].r
.bottom
= SZ_MEDBTN_Y
;
1416 calc
->cb
[10].enable
= 1;
1418 skipx
+= SZ_MEDBTN_X
+ MARGIN_STANDARD_BIG_X
;
1420 calc
->cb
[11].id
= ID_CALC_FOUR
;
1421 _tcscpy(calc
->cb
[11].label
,TEXT("4"));
1422 calc
->cb
[11].color
= CALC_COLOR_BLUE
;
1423 calc
->cb
[11].r
.left
= skipx
;
1424 calc
->cb
[11].r
.top
= skipy
;
1425 calc
->cb
[11].r
.right
= SZ_MEDBTN_X
;
1426 calc
->cb
[11].r
.bottom
= SZ_MEDBTN_Y
;
1427 calc
->cb
[11].enable
= 1;
1429 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1431 calc
->cb
[12].id
= ID_CALC_FIVE
;
1432 _tcscpy(calc
->cb
[12].label
,TEXT("5"));
1433 calc
->cb
[12].color
= CALC_COLOR_BLUE
;
1434 calc
->cb
[12].r
.left
= skipx
;
1435 calc
->cb
[12].r
.top
= skipy
;
1436 calc
->cb
[12].r
.right
= SZ_MEDBTN_X
;
1437 calc
->cb
[12].r
.bottom
= SZ_MEDBTN_Y
;
1438 calc
->cb
[12].enable
= 1;
1440 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1442 calc
->cb
[13].id
= ID_CALC_SIX
;
1443 _tcscpy(calc
->cb
[13].label
,TEXT("6"));
1444 calc
->cb
[13].color
= CALC_COLOR_BLUE
;
1445 calc
->cb
[13].r
.left
= skipx
;
1446 calc
->cb
[13].r
.top
= skipy
;
1447 calc
->cb
[13].r
.right
= SZ_MEDBTN_X
;
1448 calc
->cb
[13].r
.bottom
= SZ_MEDBTN_Y
;
1449 calc
->cb
[13].enable
= 1;
1451 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1453 calc
->cb
[14].id
= ID_CALC_MULTIPLY
;
1454 _tcscpy(calc
->cb
[14].label
,TEXT("*"));
1455 calc
->cb
[14].color
= CALC_COLOR_RED
;
1456 calc
->cb
[14].r
.left
= skipx
;
1457 calc
->cb
[14].r
.top
= skipy
;
1458 calc
->cb
[14].r
.right
= SZ_MEDBTN_X
;
1459 calc
->cb
[14].r
.bottom
= SZ_MEDBTN_Y
;
1460 calc
->cb
[14].enable
= 1;
1462 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1464 calc
->cb
[15].id
= ID_CALC_PERCENT
;
1465 _tcscpy(calc
->cb
[15].label
,TEXT("%"));
1466 calc
->cb
[15].color
= CALC_COLOR_BLUE
;
1467 calc
->cb
[15].r
.left
= skipx
;
1468 calc
->cb
[15].r
.top
= skipy
;
1469 calc
->cb
[15].r
.right
= SZ_MEDBTN_X
;
1470 calc
->cb
[15].r
.bottom
= SZ_MEDBTN_Y
;
1471 calc
->cb
[15].enable
= 1;
1475 skipx
= MARGIN_LEFT
;
1476 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1478 calc
->cb
[16].id
= ID_CALC_MEM_STORE
;
1479 LoadString( hInst
, IDS_BTN_MEM_STORE
, calc
->cb
[16].label
, sizeof(calc
->cb
[16].label
) / sizeof(calc
->cb
[16].label
[0]));
1480 calc
->cb
[16].color
= CALC_COLOR_RED
;
1481 calc
->cb
[16].r
.left
= skipx
;
1482 calc
->cb
[16].r
.top
= skipy
;
1483 calc
->cb
[16].r
.right
= SZ_MEDBTN_X
;
1484 calc
->cb
[16].r
.bottom
= SZ_MEDBTN_Y
;
1485 calc
->cb
[16].enable
= 1;
1487 skipx
+= SZ_MEDBTN_X
+ MARGIN_STANDARD_BIG_X
;
1489 calc
->cb
[17].id
= ID_CALC_ONE
;
1490 _tcscpy(calc
->cb
[17].label
,TEXT("1"));
1491 calc
->cb
[17].color
= CALC_COLOR_BLUE
;
1492 calc
->cb
[17].r
.left
= skipx
;
1493 calc
->cb
[17].r
.top
= skipy
;
1494 calc
->cb
[17].r
.right
= SZ_MEDBTN_X
;
1495 calc
->cb
[17].r
.bottom
= SZ_MEDBTN_Y
;
1496 calc
->cb
[17].enable
= 1;
1498 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1500 calc
->cb
[18].id
= ID_CALC_TWO
;
1501 _tcscpy(calc
->cb
[18].label
,TEXT("2"));
1502 calc
->cb
[18].color
= CALC_COLOR_BLUE
;
1503 calc
->cb
[18].r
.left
= skipx
;
1504 calc
->cb
[18].r
.top
= skipy
;
1505 calc
->cb
[18].r
.right
= SZ_MEDBTN_X
;
1506 calc
->cb
[18].r
.bottom
= SZ_MEDBTN_Y
;
1507 calc
->cb
[18].enable
= 1;
1509 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1511 calc
->cb
[19].id
= ID_CALC_THREE
;
1512 _tcscpy(calc
->cb
[19].label
,TEXT("3"));
1513 calc
->cb
[19].color
= CALC_COLOR_BLUE
;
1514 calc
->cb
[19].r
.left
= skipx
;
1515 calc
->cb
[19].r
.top
= skipy
;
1516 calc
->cb
[19].r
.right
= SZ_MEDBTN_X
;
1517 calc
->cb
[19].r
.bottom
= SZ_MEDBTN_Y
;
1518 calc
->cb
[19].enable
= 1;
1520 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1522 calc
->cb
[20].id
= ID_CALC_MINUS
;
1523 _tcscpy(calc
->cb
[20].label
,TEXT("-"));
1524 calc
->cb
[20].color
= CALC_COLOR_RED
;
1525 calc
->cb
[20].r
.left
= skipx
;
1526 calc
->cb
[20].r
.top
= skipy
;
1527 calc
->cb
[20].r
.right
= SZ_MEDBTN_X
;
1528 calc
->cb
[20].r
.bottom
= SZ_MEDBTN_Y
;
1529 calc
->cb
[20].enable
= 1;
1531 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1533 calc
->cb
[21].id
= ID_CALC_RECIPROCAL
;
1534 _tcscpy(calc
->cb
[21].label
,TEXT("1/x"));
1535 calc
->cb
[21].color
= CALC_COLOR_RED
;
1536 calc
->cb
[21].r
.left
= skipx
;
1537 calc
->cb
[21].r
.top
= skipy
;
1538 calc
->cb
[21].r
.right
= SZ_MEDBTN_X
;
1539 calc
->cb
[21].r
.bottom
= SZ_MEDBTN_Y
;
1540 calc
->cb
[21].enable
= 1;
1544 skipx
= MARGIN_LEFT
;
1545 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1547 calc
->cb
[22].id
= ID_CALC_MEM_PLUS
;
1548 LoadString( hInst
, IDS_BTN_MEM_PLUS
, calc
->cb
[22].label
, sizeof(calc
->cb
[22].label
) / sizeof(calc
->cb
[22].label
[0]));
1549 calc
->cb
[22].color
= CALC_COLOR_RED
;
1550 calc
->cb
[22].r
.left
= skipx
;
1551 calc
->cb
[22].r
.top
= skipy
;
1552 calc
->cb
[22].r
.right
= SZ_MEDBTN_X
;
1553 calc
->cb
[22].r
.bottom
= SZ_MEDBTN_Y
;
1554 calc
->cb
[22].enable
= 1;
1556 skipx
+= SZ_MEDBTN_X
+ MARGIN_STANDARD_BIG_X
;
1558 calc
->cb
[23].id
= ID_CALC_ZERO
;
1559 _tcscpy(calc
->cb
[23].label
,TEXT("0"));
1560 calc
->cb
[23].color
= CALC_COLOR_BLUE
;
1561 calc
->cb
[23].r
.left
= skipx
;
1562 calc
->cb
[23].r
.top
= skipy
;
1563 calc
->cb
[23].r
.right
= SZ_MEDBTN_X
;
1564 calc
->cb
[23].r
.bottom
= SZ_MEDBTN_Y
;
1565 calc
->cb
[23].enable
= 1;
1567 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1569 calc
->cb
[24].id
= ID_CALC_SIGN
;
1570 _tcscpy(calc
->cb
[24].label
,TEXT("+/-"));
1571 calc
->cb
[24].color
= CALC_COLOR_RED
;
1572 calc
->cb
[24].r
.left
= skipx
;
1573 calc
->cb
[24].r
.top
= skipy
;
1574 calc
->cb
[24].r
.right
= SZ_MEDBTN_X
;
1575 calc
->cb
[24].r
.bottom
= SZ_MEDBTN_Y
;
1576 calc
->cb
[24].enable
= 1;
1578 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1580 calc
->cb
[25].id
= ID_CALC_DECIMAL
;
1581 _tcscpy(calc
->cb
[25].label
,TEXT("."));
1582 calc
->cb
[25].color
= CALC_COLOR_BLUE
;
1583 calc
->cb
[25].r
.left
= skipx
;
1584 calc
->cb
[25].r
.top
= skipy
;
1585 calc
->cb
[25].r
.right
= SZ_MEDBTN_X
;
1586 calc
->cb
[25].r
.bottom
= SZ_MEDBTN_Y
;
1587 calc
->cb
[25].enable
= 1;
1589 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1591 calc
->cb
[26].id
= ID_CALC_PLUS
;
1592 _tcscpy(calc
->cb
[26].label
,TEXT("+"));
1593 calc
->cb
[26].color
= CALC_COLOR_RED
;
1594 calc
->cb
[26].r
.left
= skipx
;
1595 calc
->cb
[26].r
.top
= skipy
;
1596 calc
->cb
[26].r
.right
= SZ_MEDBTN_X
;
1597 calc
->cb
[26].r
.bottom
= SZ_MEDBTN_Y
;
1598 calc
->cb
[26].enable
= 1;
1600 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1602 calc
->cb
[27].id
= ID_CALC_EQUALS
;
1603 _tcscpy(calc
->cb
[27].label
,TEXT("="));
1604 calc
->cb
[27].color
= CALC_COLOR_RED
;
1605 calc
->cb
[27].r
.left
= skipx
;
1606 calc
->cb
[27].r
.top
= skipy
;
1607 calc
->cb
[27].r
.right
= SZ_MEDBTN_X
;
1608 calc
->cb
[27].r
.bottom
= SZ_MEDBTN_Y
;
1609 calc
->cb
[27].enable
= 1;
1612 calc
->numButtons
= CALC_BUTTONS_SCIENTIFIC
;
1616 skipx
= MARGIN_LEFT
;
1617 skipy
= CALC_SCIENTIFIC_MARGIN_TOP
+ CALC_EDIT_HEIGHT
- 1;
1620 _tcscpy(calc
->cb
[0].label
,TEXT("FILLER"));
1621 calc
->cb
[0].color
= CALC_COLOR_BLUE
;
1622 calc
->cb
[0].r
.left
= skipx
+ 4 * SZ_MEDBTN_X
+ 2 * SZ_SPACER_X
+ 2 * MARGIN_SMALL_X
+ 12;
1623 calc
->cb
[0].r
.top
= skipy
;
1624 calc
->cb
[0].r
.right
= skipx
+ 4 * SZ_MEDBTN_X
+ 2 * SZ_SPACER_X
+ 2 * MARGIN_SMALL_X
+ SZ_FILLER_X
+ 4;
1625 calc
->cb
[0].r
.bottom
= skipy
+ SZ_FILLER_Y
- 6;
1626 calc
->cb
[0].enable
= 1;
1629 _tcscpy(calc
->cb
[1].label
,TEXT("FILLER"));
1630 calc
->cb
[1].color
= CALC_COLOR_BLUE
;
1631 calc
->cb
[1].r
.left
= skipx
+ 3 * SZ_MEDBTN_X
+ SZ_SPACER_X
+ 2 * MARGIN_SMALL_X
+ 8;
1632 calc
->cb
[1].r
.top
= skipy
;
1633 calc
->cb
[1].r
.right
= skipx
+ 3 * SZ_MEDBTN_X
+ SZ_SPACER_X
+ 2 * MARGIN_SMALL_X
+ SZ_FILLER_X
+ 0;
1634 calc
->cb
[1].r
.bottom
= skipy
+ SZ_FILLER_Y
- 6;
1635 calc
->cb
[1].enable
= 1;
1637 skipx
+= SZ_FILLER_X
+ MARGIN_SMALL_X
;
1639 skipx
= MARGIN_BIG_X
;
1641 calc
->cb
[2].id
= ID_CALC_BACKSPACE
;
1642 LoadString( hInst
, IDS_BTN_BACKSPACE
, calc
->cb
[2].label
, sizeof(calc
->cb
[2].label
) / sizeof(calc
->cb
[2].label
[0]));
1643 calc
->cb
[2].color
= CALC_COLOR_RED
;
1644 calc
->cb
[2].r
.left
= skipx
;
1645 calc
->cb
[2].r
.top
= skipy
;
1646 calc
->cb
[2].r
.right
= SZ_BIGBTN_X
;
1647 calc
->cb
[2].r
.bottom
= SZ_BIGBTN_Y
;
1648 calc
->cb
[2].enable
= 1;
1650 skipx
+= SZ_BIGBTN_X
+ MARGIN_SMALL_X
;
1652 calc
->cb
[3].id
= ID_CALC_CLEAR_ENTRY
;
1653 LoadString( hInst
, IDS_BTN_CLEAR_ENTRY
, calc
->cb
[3].label
, sizeof(calc
->cb
[3].label
) / sizeof(calc
->cb
[3].label
[0]));
1654 calc
->cb
[3].color
= CALC_COLOR_RED
;
1655 calc
->cb
[3].r
.left
= skipx
;
1656 calc
->cb
[3].r
.top
= skipy
;
1657 calc
->cb
[3].r
.right
= SZ_BIGBTN_X
;
1658 calc
->cb
[3].r
.bottom
= SZ_BIGBTN_Y
;
1659 calc
->cb
[3].enable
= 1;
1661 skipx
+= SZ_BIGBTN_X
+ MARGIN_SMALL_X
;
1663 calc
->cb
[4].id
= ID_CALC_CLEAR_ALL
;
1664 LoadString( hInst
, IDS_BTN_CLEAR_ALL
, calc
->cb
[4].label
, sizeof(calc
->cb
[4].label
) / sizeof(calc
->cb
[4].label
[0]));
1665 calc
->cb
[4].color
= CALC_COLOR_RED
;
1666 calc
->cb
[4].r
.left
= skipx
;
1667 calc
->cb
[4].r
.top
= skipy
;
1668 calc
->cb
[4].r
.right
= SZ_BIGBTN_X
;
1669 calc
->cb
[4].r
.bottom
= SZ_BIGBTN_Y
;
1670 calc
->cb
[4].enable
= 1;
1674 skipx
= MARGIN_LEFT
;
1675 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1677 calc
->cb
[5].id
= ID_CALC_STA
;
1678 _tcscpy(calc
->cb
[5].label
,TEXT("Sta"));
1679 calc
->cb
[5].color
= CALC_COLOR_GRAY
;
1680 calc
->cb
[5].r
.left
= skipx
;
1681 calc
->cb
[5].r
.top
= skipy
;
1682 calc
->cb
[5].r
.right
= SZ_MEDBTN_X
;
1683 calc
->cb
[5].r
.bottom
= SZ_MEDBTN_Y
;
1684 calc
->cb
[5].enable
= 1;
1686 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1688 calc
->cb
[6].id
= ID_CALC_FE
;
1689 _tcscpy(calc
->cb
[6].label
,TEXT("F-E"));
1690 calc
->cb
[6].color
= CALC_COLOR_MAGENTA
;
1691 calc
->cb
[6].r
.left
= skipx
;
1692 calc
->cb
[6].r
.top
= skipy
;
1693 calc
->cb
[6].r
.right
= SZ_MEDBTN_X
;
1694 calc
->cb
[6].r
.bottom
= SZ_MEDBTN_Y
;
1695 calc
->cb
[6].enable
= 1;
1697 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1699 calc
->cb
[7].id
= ID_CALC_LEFTPAREN
;
1700 _tcscpy(calc
->cb
[7].label
,TEXT("("));
1701 calc
->cb
[7].color
= CALC_COLOR_MAGENTA
;
1702 calc
->cb
[7].r
.left
= skipx
;
1703 calc
->cb
[7].r
.top
= skipy
;
1704 calc
->cb
[7].r
.right
= SZ_MEDBTN_X
;
1705 calc
->cb
[7].r
.bottom
= SZ_MEDBTN_Y
;
1706 calc
->cb
[7].enable
= 0;
1708 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1710 calc
->cb
[8].id
= ID_CALC_RIGHTPAREN
;
1711 _tcscpy(calc
->cb
[8].label
,TEXT(")"));
1712 calc
->cb
[8].color
= CALC_COLOR_MAGENTA
;
1713 calc
->cb
[8].r
.left
= skipx
;
1714 calc
->cb
[8].r
.top
= skipy
;
1715 calc
->cb
[8].r
.right
= SZ_MEDBTN_X
;
1716 calc
->cb
[8].r
.bottom
= SZ_MEDBTN_Y
;
1717 calc
->cb
[8].enable
= 0;
1719 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1721 calc
->cb
[9].id
= ID_CALC_MEM_CLEAR
;
1722 LoadString( hInst
, IDS_BTN_MEM_CLEAR
, calc
->cb
[9].label
, sizeof(calc
->cb
[9].label
) / sizeof(calc
->cb
[9].label
[0]));
1723 calc
->cb
[9].color
= CALC_COLOR_RED
;
1724 calc
->cb
[9].r
.left
= skipx
;
1725 calc
->cb
[9].r
.top
= skipy
;
1726 calc
->cb
[9].r
.right
= SZ_MEDBTN_X
;
1727 calc
->cb
[9].r
.bottom
= SZ_MEDBTN_Y
;
1728 calc
->cb
[9].enable
= 1;
1730 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1732 calc
->cb
[10].id
= ID_CALC_SEVEN
;
1733 _tcscpy(calc
->cb
[10].label
,TEXT("7"));
1734 calc
->cb
[10].color
= CALC_COLOR_BLUE
;
1735 calc
->cb
[10].r
.left
= skipx
;
1736 calc
->cb
[10].r
.top
= skipy
;
1737 calc
->cb
[10].r
.right
= SZ_MEDBTN_X
;
1738 calc
->cb
[10].r
.bottom
= SZ_MEDBTN_Y
;
1739 calc
->cb
[10].enable
= 1;
1741 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1743 calc
->cb
[11].id
= ID_CALC_EIGHT
;
1744 _tcscpy(calc
->cb
[11].label
,TEXT("8"));
1745 calc
->cb
[11].color
= CALC_COLOR_BLUE
;
1746 calc
->cb
[11].r
.left
= skipx
;
1747 calc
->cb
[11].r
.top
= skipy
;
1748 calc
->cb
[11].r
.right
= SZ_MEDBTN_X
;
1749 calc
->cb
[11].r
.bottom
= SZ_MEDBTN_Y
;
1750 calc
->cb
[11].enable
= 1;
1752 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1754 calc
->cb
[12].id
= ID_CALC_NINE
;
1755 _tcscpy(calc
->cb
[12].label
,TEXT("9"));
1756 calc
->cb
[12].color
= CALC_COLOR_BLUE
;
1757 calc
->cb
[12].r
.left
= skipx
;
1758 calc
->cb
[12].r
.top
= skipy
;
1759 calc
->cb
[12].r
.right
= SZ_MEDBTN_X
;
1760 calc
->cb
[12].r
.bottom
= SZ_MEDBTN_Y
;
1761 calc
->cb
[12].enable
= 1;
1763 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1765 calc
->cb
[13].id
= ID_CALC_DIVIDE
;
1766 _tcscpy(calc
->cb
[13].label
,TEXT("/"));
1767 calc
->cb
[13].color
= CALC_COLOR_RED
;
1768 calc
->cb
[13].r
.left
= skipx
;
1769 calc
->cb
[13].r
.top
= skipy
;
1770 calc
->cb
[13].r
.right
= SZ_MEDBTN_X
;
1771 calc
->cb
[13].r
.bottom
= SZ_MEDBTN_Y
;
1772 calc
->cb
[13].enable
= 1;
1774 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1776 calc
->cb
[14].id
= ID_CALC_MOD
;
1777 _tcscpy(calc
->cb
[14].label
,TEXT("Mod"));
1778 calc
->cb
[14].color
= CALC_COLOR_RED
;
1779 calc
->cb
[14].r
.left
= skipx
;
1780 calc
->cb
[14].r
.top
= skipy
;
1781 calc
->cb
[14].r
.right
= SZ_MEDBTN_X
;
1782 calc
->cb
[14].r
.bottom
= SZ_MEDBTN_Y
;
1783 calc
->cb
[14].enable
= 1;
1785 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1787 calc
->cb
[15].id
= ID_CALC_AND
;
1788 _tcscpy(calc
->cb
[15].label
,TEXT("And"));
1789 calc
->cb
[15].color
= CALC_COLOR_RED
;
1790 calc
->cb
[15].r
.left
= skipx
;
1791 calc
->cb
[15].r
.top
= skipy
;
1792 calc
->cb
[15].r
.right
= SZ_MEDBTN_X
;
1793 calc
->cb
[15].r
.bottom
= SZ_MEDBTN_Y
;
1794 calc
->cb
[15].enable
= 1;
1798 skipx
= MARGIN_LEFT
;
1799 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1801 calc
->cb
[16].id
= ID_CALC_AVE
;
1802 _tcscpy(calc
->cb
[16].label
,TEXT("Ave"));
1803 calc
->cb
[16].color
= CALC_COLOR_GRAY
;
1804 calc
->cb
[16].r
.left
= skipx
;
1805 calc
->cb
[16].r
.top
= skipy
;
1806 calc
->cb
[16].r
.right
= SZ_MEDBTN_X
;
1807 calc
->cb
[16].r
.bottom
= SZ_MEDBTN_Y
;
1808 calc
->cb
[16].enable
= 0;
1810 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1812 calc
->cb
[17].id
= ID_CALC_DMS
;
1813 _tcscpy(calc
->cb
[17].label
,TEXT("dms"));
1814 calc
->cb
[17].color
= CALC_COLOR_MAGENTA
;
1815 calc
->cb
[17].r
.left
= skipx
;
1816 calc
->cb
[17].r
.top
= skipy
;
1817 calc
->cb
[17].r
.right
= SZ_MEDBTN_X
;
1818 calc
->cb
[17].r
.bottom
= SZ_MEDBTN_Y
;
1819 calc
->cb
[17].enable
= 1;
1821 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1823 calc
->cb
[18].id
= ID_CALC_EXP
;
1824 _tcscpy(calc
->cb
[18].label
,TEXT("Exp"));
1825 calc
->cb
[18].color
= CALC_COLOR_MAGENTA
;
1826 calc
->cb
[18].r
.left
= skipx
;
1827 calc
->cb
[18].r
.top
= skipy
;
1828 calc
->cb
[18].r
.right
= SZ_MEDBTN_X
;
1829 calc
->cb
[18].r
.bottom
= SZ_MEDBTN_Y
;
1830 calc
->cb
[18].enable
= 1;
1832 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1834 calc
->cb
[19].id
= ID_CALC_LN
;
1835 _tcscpy(calc
->cb
[19].label
,TEXT("ln"));
1836 calc
->cb
[19].color
= CALC_COLOR_MAGENTA
;
1837 calc
->cb
[19].r
.left
= skipx
;
1838 calc
->cb
[19].r
.top
= skipy
;
1839 calc
->cb
[19].r
.right
= SZ_MEDBTN_X
;
1840 calc
->cb
[19].r
.bottom
= SZ_MEDBTN_Y
;
1841 calc
->cb
[19].enable
= 1;
1843 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1845 calc
->cb
[20].id
= ID_CALC_MEM_RECALL
;
1846 _tcscpy(calc
->cb
[20].label
,TEXT("MR"));
1847 calc
->cb
[20].color
= CALC_COLOR_RED
;
1848 calc
->cb
[20].r
.left
= skipx
;
1849 calc
->cb
[20].r
.top
= skipy
;
1850 calc
->cb
[20].r
.right
= SZ_MEDBTN_X
;
1851 calc
->cb
[20].r
.bottom
= SZ_MEDBTN_Y
;
1852 calc
->cb
[20].enable
= 1;
1854 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1856 calc
->cb
[21].id
= ID_CALC_FOUR
;
1857 _tcscpy(calc
->cb
[21].label
,TEXT("4"));
1858 calc
->cb
[21].color
= CALC_COLOR_BLUE
;
1859 calc
->cb
[21].r
.left
= skipx
;
1860 calc
->cb
[21].r
.top
= skipy
;
1861 calc
->cb
[21].r
.right
= SZ_MEDBTN_X
;
1862 calc
->cb
[21].r
.bottom
= SZ_MEDBTN_Y
;
1863 calc
->cb
[21].enable
= 1;
1865 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1867 calc
->cb
[22].id
= ID_CALC_FIVE
;
1868 _tcscpy(calc
->cb
[22].label
,TEXT("5"));
1869 calc
->cb
[22].color
= CALC_COLOR_BLUE
;
1870 calc
->cb
[22].r
.left
= skipx
;
1871 calc
->cb
[22].r
.top
= skipy
;
1872 calc
->cb
[22].r
.right
= SZ_MEDBTN_X
;
1873 calc
->cb
[22].r
.bottom
= SZ_MEDBTN_Y
;
1874 calc
->cb
[22].enable
= 1;
1876 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1878 calc
->cb
[23].id
= ID_CALC_SIX
;
1879 _tcscpy(calc
->cb
[23].label
,TEXT("6"));
1880 calc
->cb
[23].color
= CALC_COLOR_BLUE
;
1881 calc
->cb
[23].r
.left
= skipx
;
1882 calc
->cb
[23].r
.top
= skipy
;
1883 calc
->cb
[23].r
.right
= SZ_MEDBTN_X
;
1884 calc
->cb
[23].r
.bottom
= SZ_MEDBTN_Y
;
1885 calc
->cb
[23].enable
= 1;
1887 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1889 calc
->cb
[24].id
= ID_CALC_MULTIPLY
;
1890 _tcscpy(calc
->cb
[24].label
,TEXT("*"));
1891 calc
->cb
[24].color
= CALC_COLOR_RED
;
1892 calc
->cb
[24].r
.left
= skipx
;
1893 calc
->cb
[24].r
.top
= skipy
;
1894 calc
->cb
[24].r
.right
= SZ_MEDBTN_X
;
1895 calc
->cb
[24].r
.bottom
= SZ_MEDBTN_Y
;
1896 calc
->cb
[24].enable
= 1;
1898 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1900 calc
->cb
[25].id
= ID_CALC_OR
;
1901 _tcscpy(calc
->cb
[25].label
,TEXT("Or"));
1902 calc
->cb
[25].color
= CALC_COLOR_RED
;
1903 calc
->cb
[25].r
.left
= skipx
;
1904 calc
->cb
[25].r
.top
= skipy
;
1905 calc
->cb
[25].r
.right
= SZ_MEDBTN_X
;
1906 calc
->cb
[25].r
.bottom
= SZ_MEDBTN_Y
;
1907 calc
->cb
[25].enable
= 1;
1909 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1911 calc
->cb
[26].id
= ID_CALC_XOR
;
1912 _tcscpy(calc
->cb
[26].label
,TEXT("Xor"));
1913 calc
->cb
[26].color
= CALC_COLOR_RED
;
1914 calc
->cb
[26].r
.left
= skipx
;
1915 calc
->cb
[26].r
.top
= skipy
;
1916 calc
->cb
[26].r
.right
= SZ_MEDBTN_X
;
1917 calc
->cb
[26].r
.bottom
= SZ_MEDBTN_Y
;
1918 calc
->cb
[26].enable
= 1;
1922 skipx
= MARGIN_LEFT
;
1923 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1925 calc
->cb
[27].id
= ID_CALC_SUM
;
1926 _tcscpy(calc
->cb
[27].label
,TEXT("Sum"));
1927 calc
->cb
[27].color
= CALC_COLOR_GRAY
;
1928 calc
->cb
[27].r
.left
= skipx
;
1929 calc
->cb
[27].r
.top
= skipy
;
1930 calc
->cb
[27].r
.right
= SZ_MEDBTN_X
;
1931 calc
->cb
[27].r
.bottom
= SZ_MEDBTN_Y
;
1932 calc
->cb
[27].enable
= 0;
1934 skipx
+= MARGIN_SMALL_X
+ SZ_MEDBTN_X
+ SZ_SPACER_X
;
1936 calc
->cb
[28].id
= ID_CALC_SIN
;
1937 _tcscpy(calc
->cb
[28].label
,TEXT("sin"));
1938 calc
->cb
[28].color
= CALC_COLOR_MAGENTA
;
1939 calc
->cb
[28].r
.left
= skipx
;
1940 calc
->cb
[28].r
.top
= skipy
;
1941 calc
->cb
[28].r
.right
= SZ_MEDBTN_X
;
1942 calc
->cb
[28].r
.bottom
= SZ_MEDBTN_Y
;
1943 calc
->cb
[28].enable
= 1;
1945 skipx
+= MARGIN_SMALL_X
+ SZ_MEDBTN_X
;
1947 calc
->cb
[29].id
= ID_CALC_POWER
;
1948 _tcscpy(calc
->cb
[29].label
,TEXT("x^y"));
1949 calc
->cb
[29].color
= CALC_COLOR_MAGENTA
;
1950 calc
->cb
[29].r
.left
= skipx
;
1951 calc
->cb
[29].r
.top
= skipy
;
1952 calc
->cb
[29].r
.right
= SZ_MEDBTN_X
;
1953 calc
->cb
[29].r
.bottom
= SZ_MEDBTN_Y
;
1954 calc
->cb
[29].enable
= 1;
1956 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1958 calc
->cb
[30].id
= ID_CALC_LOG10
;
1959 _tcscpy(calc
->cb
[30].label
,TEXT("log"));
1960 calc
->cb
[30].color
= CALC_COLOR_MAGENTA
;
1961 calc
->cb
[30].r
.left
= skipx
;
1962 calc
->cb
[30].r
.top
= skipy
;
1963 calc
->cb
[30].r
.right
= SZ_MEDBTN_X
;
1964 calc
->cb
[30].r
.bottom
= SZ_MEDBTN_Y
;
1965 calc
->cb
[30].enable
= 1;
1967 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1969 calc
->cb
[31].id
= ID_CALC_MEM_STORE
;
1970 LoadString( hInst
, IDS_BTN_MEM_STORE
, calc
->cb
[31].label
, sizeof(calc
->cb
[31].label
) / sizeof(calc
->cb
[31].label
[0]));
1971 calc
->cb
[31].color
= CALC_COLOR_RED
;
1972 calc
->cb
[31].r
.left
= skipx
;
1973 calc
->cb
[31].r
.top
= skipy
;
1974 calc
->cb
[31].r
.right
= SZ_MEDBTN_X
;
1975 calc
->cb
[31].r
.bottom
= SZ_MEDBTN_Y
;
1976 calc
->cb
[31].enable
= 1;
1978 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1980 calc
->cb
[32].id
= ID_CALC_ONE
;
1981 _tcscpy(calc
->cb
[32].label
,TEXT("1"));
1982 calc
->cb
[32].color
= CALC_COLOR_BLUE
;
1983 calc
->cb
[32].r
.left
= skipx
;
1984 calc
->cb
[32].r
.top
= skipy
;
1985 calc
->cb
[32].r
.right
= SZ_MEDBTN_X
;
1986 calc
->cb
[32].r
.bottom
= SZ_MEDBTN_Y
;
1987 calc
->cb
[32].enable
= 1;
1989 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1991 calc
->cb
[33].id
= ID_CALC_TWO
;
1992 _tcscpy(calc
->cb
[33].label
,TEXT("2"));
1993 calc
->cb
[33].color
= CALC_COLOR_BLUE
;
1994 calc
->cb
[33].r
.left
= skipx
;
1995 calc
->cb
[33].r
.top
= skipy
;
1996 calc
->cb
[33].r
.right
= SZ_MEDBTN_X
;
1997 calc
->cb
[33].r
.bottom
= SZ_MEDBTN_Y
;
1998 calc
->cb
[33].enable
= 1;
2000 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2002 calc
->cb
[34].id
= ID_CALC_THREE
;
2003 _tcscpy(calc
->cb
[34].label
,TEXT("3"));
2004 calc
->cb
[34].color
= CALC_COLOR_BLUE
;
2005 calc
->cb
[34].r
.left
= skipx
;
2006 calc
->cb
[34].r
.top
= skipy
;
2007 calc
->cb
[34].r
.right
= SZ_MEDBTN_X
;
2008 calc
->cb
[34].r
.bottom
= SZ_MEDBTN_Y
;
2009 calc
->cb
[34].enable
= 1;
2011 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2013 calc
->cb
[35].id
= ID_CALC_MINUS
;
2014 _tcscpy(calc
->cb
[35].label
,TEXT("-"));
2015 calc
->cb
[35].color
= CALC_COLOR_RED
;
2016 calc
->cb
[35].r
.left
= skipx
;
2017 calc
->cb
[35].r
.top
= skipy
;
2018 calc
->cb
[35].r
.right
= SZ_MEDBTN_X
;
2019 calc
->cb
[35].r
.bottom
= SZ_MEDBTN_Y
;
2020 calc
->cb
[35].enable
= 1;
2022 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2024 calc
->cb
[36].id
= ID_CALC_LSH
;
2025 _tcscpy(calc
->cb
[36].label
,TEXT("Lsh"));
2026 calc
->cb
[36].color
= CALC_COLOR_RED
;
2027 calc
->cb
[36].r
.left
= skipx
;
2028 calc
->cb
[36].r
.top
= skipy
;
2029 calc
->cb
[36].r
.right
= SZ_MEDBTN_X
;
2030 calc
->cb
[36].r
.bottom
= SZ_MEDBTN_Y
;
2031 calc
->cb
[36].enable
= 1;
2033 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2035 calc
->cb
[37].id
= ID_CALC_NOT
;
2036 _tcscpy(calc
->cb
[37].label
,TEXT("Not"));
2037 calc
->cb
[37].color
= CALC_COLOR_RED
;
2038 calc
->cb
[37].r
.left
= skipx
;
2039 calc
->cb
[37].r
.top
= skipy
;
2040 calc
->cb
[37].r
.right
= SZ_MEDBTN_X
;
2041 calc
->cb
[37].r
.bottom
= SZ_MEDBTN_Y
;
2042 calc
->cb
[37].enable
= 1;
2046 skipx
= MARGIN_LEFT
;
2047 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
2049 calc
->cb
[38].id
= ID_CALC_S
;
2050 _tcscpy(calc
->cb
[38].label
,TEXT("s"));
2051 calc
->cb
[38].color
= CALC_COLOR_GRAY
;
2052 calc
->cb
[38].r
.left
= skipx
;
2053 calc
->cb
[38].r
.top
= skipy
;
2054 calc
->cb
[38].r
.right
= SZ_MEDBTN_X
;
2055 calc
->cb
[38].r
.bottom
= SZ_MEDBTN_Y
;
2056 calc
->cb
[38].enable
= 0;
2058 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2060 calc
->cb
[39].id
= ID_CALC_COS
;
2061 _tcscpy(calc
->cb
[39].label
,TEXT("cos"));
2062 calc
->cb
[39].color
= CALC_COLOR_MAGENTA
;
2063 calc
->cb
[39].r
.left
= skipx
;
2064 calc
->cb
[39].r
.top
= skipy
;
2065 calc
->cb
[39].r
.right
= SZ_MEDBTN_X
;
2066 calc
->cb
[39].r
.bottom
= SZ_MEDBTN_Y
;
2067 calc
->cb
[39].enable
= 1;
2069 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2071 calc
->cb
[40].id
= ID_CALC_CUBE
;
2072 _tcscpy(calc
->cb
[40].label
,TEXT("x^3"));
2073 calc
->cb
[40].color
= CALC_COLOR_MAGENTA
;
2074 calc
->cb
[40].r
.left
= skipx
;
2075 calc
->cb
[40].r
.top
= skipy
;
2076 calc
->cb
[40].r
.right
= SZ_MEDBTN_X
;
2077 calc
->cb
[40].r
.bottom
= SZ_MEDBTN_Y
;
2078 calc
->cb
[40].enable
= 1;
2080 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2082 calc
->cb
[41].id
= ID_CALC_FACTORIAL
;
2083 _tcscpy(calc
->cb
[41].label
,TEXT("n!"));
2084 calc
->cb
[41].color
= CALC_COLOR_MAGENTA
;
2085 calc
->cb
[41].r
.left
= skipx
;
2086 calc
->cb
[41].r
.top
= skipy
;
2087 calc
->cb
[41].r
.right
= SZ_MEDBTN_X
;
2088 calc
->cb
[41].r
.bottom
= SZ_MEDBTN_Y
;
2089 calc
->cb
[41].enable
= 1;
2091 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2093 calc
->cb
[42].id
= ID_CALC_MEM_PLUS
;
2094 LoadString( hInst
, IDS_BTN_MEM_PLUS
, calc
->cb
[42].label
, sizeof(calc
->cb
[42].label
) / sizeof(calc
->cb
[42].label
[0]));
2095 calc
->cb
[42].color
= CALC_COLOR_RED
;
2096 calc
->cb
[42].r
.left
= skipx
;
2097 calc
->cb
[42].r
.top
= skipy
;
2098 calc
->cb
[42].r
.right
= SZ_MEDBTN_X
;
2099 calc
->cb
[42].r
.bottom
= SZ_MEDBTN_Y
;
2100 calc
->cb
[42].enable
= 1;
2102 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2104 calc
->cb
[43].id
= ID_CALC_ZERO
;
2105 _tcscpy(calc
->cb
[43].label
,TEXT("0"));
2106 calc
->cb
[43].color
= CALC_COLOR_BLUE
;
2107 calc
->cb
[43].r
.left
= skipx
;
2108 calc
->cb
[43].r
.top
= skipy
;
2109 calc
->cb
[43].r
.right
= SZ_MEDBTN_X
;
2110 calc
->cb
[43].r
.bottom
= SZ_MEDBTN_Y
;
2111 calc
->cb
[43].enable
= 1;
2113 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2115 calc
->cb
[44].id
= ID_CALC_SIGN
;
2116 _tcscpy(calc
->cb
[44].label
,TEXT("+/-"));
2117 calc
->cb
[44].color
= CALC_COLOR_RED
;
2118 calc
->cb
[44].r
.left
= skipx
;
2119 calc
->cb
[44].r
.top
= skipy
;
2120 calc
->cb
[44].r
.right
= SZ_MEDBTN_X
;
2121 calc
->cb
[44].r
.bottom
= SZ_MEDBTN_Y
;
2122 calc
->cb
[44].enable
= 1;
2124 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2126 calc
->cb
[45].id
= ID_CALC_DECIMAL
;
2127 _tcscpy(calc
->cb
[45].label
,TEXT("."));
2128 calc
->cb
[45].color
= CALC_COLOR_BLUE
;
2129 calc
->cb
[45].r
.left
= skipx
;
2130 calc
->cb
[45].r
.top
= skipy
;
2131 calc
->cb
[45].r
.right
= SZ_MEDBTN_X
;
2132 calc
->cb
[45].r
.bottom
= SZ_MEDBTN_Y
;
2133 calc
->cb
[45].enable
= 1;
2135 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2137 calc
->cb
[46].id
= ID_CALC_PLUS
;
2138 _tcscpy(calc
->cb
[46].label
,TEXT("+"));
2139 calc
->cb
[46].color
= CALC_COLOR_RED
;
2140 calc
->cb
[46].r
.left
= skipx
;
2141 calc
->cb
[46].r
.top
= skipy
;
2142 calc
->cb
[46].r
.right
= SZ_MEDBTN_X
;
2143 calc
->cb
[46].r
.bottom
= SZ_MEDBTN_Y
;
2144 calc
->cb
[46].enable
= 1;
2146 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2148 calc
->cb
[47].id
= ID_CALC_EQUALS
;
2149 _tcscpy(calc
->cb
[47].label
,TEXT("="));
2150 calc
->cb
[47].color
= CALC_COLOR_RED
;
2151 calc
->cb
[47].r
.left
= skipx
;
2152 calc
->cb
[47].r
.top
= skipy
;
2153 calc
->cb
[47].r
.right
= SZ_MEDBTN_X
;
2154 calc
->cb
[47].r
.bottom
= SZ_MEDBTN_Y
;
2155 calc
->cb
[47].enable
= 1;
2157 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2159 calc
->cb
[48].id
= ID_CALC_INT
;
2160 _tcscpy(calc
->cb
[48].label
,TEXT("Int"));
2161 calc
->cb
[48].color
= CALC_COLOR_RED
;
2162 calc
->cb
[48].r
.left
= skipx
;
2163 calc
->cb
[48].r
.top
= skipy
;
2164 calc
->cb
[48].r
.right
= SZ_MEDBTN_X
;
2165 calc
->cb
[48].r
.bottom
= SZ_MEDBTN_Y
;
2166 calc
->cb
[48].enable
= 1;
2171 skipx
= MARGIN_LEFT
;
2172 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
2174 calc
->cb
[49].id
= ID_CALC_DAT
;
2175 _tcscpy(calc
->cb
[49].label
,TEXT("Dat"));
2176 calc
->cb
[49].color
= CALC_COLOR_GRAY
;
2177 calc
->cb
[49].r
.left
= skipx
;
2178 calc
->cb
[49].r
.top
= skipy
;
2179 calc
->cb
[49].r
.right
= SZ_MEDBTN_X
;
2180 calc
->cb
[49].r
.bottom
= SZ_MEDBTN_Y
;
2181 calc
->cb
[49].enable
= 0;
2183 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2185 calc
->cb
[50].id
= ID_CALC_TAN
;
2186 _tcscpy(calc
->cb
[50].label
,TEXT("tan"));
2187 calc
->cb
[50].color
= CALC_COLOR_MAGENTA
;
2188 calc
->cb
[50].r
.left
= skipx
;
2189 calc
->cb
[50].r
.top
= skipy
;
2190 calc
->cb
[50].r
.right
= SZ_MEDBTN_X
;
2191 calc
->cb
[50].r
.bottom
= SZ_MEDBTN_Y
;
2192 calc
->cb
[50].enable
= 1;
2194 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2196 calc
->cb
[51].id
= ID_CALC_SQUARE
;
2197 _tcscpy(calc
->cb
[51].label
,TEXT("x^2"));
2198 calc
->cb
[51].color
= CALC_COLOR_MAGENTA
;
2199 calc
->cb
[51].r
.left
= skipx
;
2200 calc
->cb
[51].r
.top
= skipy
;
2201 calc
->cb
[51].r
.right
= SZ_MEDBTN_X
;
2202 calc
->cb
[51].r
.bottom
= SZ_MEDBTN_Y
;
2203 calc
->cb
[51].enable
= 1;
2205 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2207 calc
->cb
[52].id
= ID_CALC_RECIPROCAL
;
2208 _tcscpy(calc
->cb
[52].label
,TEXT("1/x"));
2209 calc
->cb
[52].color
= CALC_COLOR_MAGENTA
;
2210 calc
->cb
[52].r
.left
= skipx
;
2211 calc
->cb
[52].r
.top
= skipy
;
2212 calc
->cb
[52].r
.right
= SZ_MEDBTN_X
;
2213 calc
->cb
[52].r
.bottom
= SZ_MEDBTN_Y
;
2214 calc
->cb
[52].enable
= 1;
2216 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2218 calc
->cb
[53].id
= ID_CALC_PI
;
2219 _tcscpy(calc
->cb
[53].label
,TEXT("pi"));
2220 calc
->cb
[53].color
= CALC_COLOR_BLUE
;
2221 calc
->cb
[53].r
.left
= skipx
;
2222 calc
->cb
[53].r
.top
= skipy
;
2223 calc
->cb
[53].r
.right
= SZ_MEDBTN_X
;
2224 calc
->cb
[53].r
.bottom
= SZ_MEDBTN_Y
;
2225 calc
->cb
[53].enable
= 1;
2227 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2229 calc
->cb
[54].id
= ID_CALC_A
;
2230 _tcscpy(calc
->cb
[54].label
,TEXT("A"));
2231 calc
->cb
[54].color
= CALC_COLOR_GRAY
;
2232 calc
->cb
[54].r
.left
= skipx
;
2233 calc
->cb
[54].r
.top
= skipy
;
2234 calc
->cb
[54].r
.right
= SZ_MEDBTN_X
;
2235 calc
->cb
[54].r
.bottom
= SZ_MEDBTN_Y
;
2236 calc
->cb
[54].enable
= 0;
2238 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2240 calc
->cb
[55].id
= ID_CALC_B
;
2241 _tcscpy(calc
->cb
[55].label
,TEXT("B"));
2242 calc
->cb
[55].color
= CALC_COLOR_GRAY
;
2243 calc
->cb
[55].r
.left
= skipx
;
2244 calc
->cb
[55].r
.top
= skipy
;
2245 calc
->cb
[55].r
.right
= SZ_MEDBTN_X
;
2246 calc
->cb
[55].r
.bottom
= SZ_MEDBTN_Y
;
2247 calc
->cb
[55].enable
= 0;
2249 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2251 calc
->cb
[56].id
= ID_CALC_C
;
2252 _tcscpy(calc
->cb
[56].label
,TEXT("C"));
2253 calc
->cb
[56].color
= CALC_COLOR_GRAY
;
2254 calc
->cb
[56].r
.left
= skipx
;
2255 calc
->cb
[56].r
.top
= skipy
;
2256 calc
->cb
[56].r
.right
= SZ_MEDBTN_X
;
2257 calc
->cb
[56].r
.bottom
= SZ_MEDBTN_Y
;
2258 calc
->cb
[56].enable
= 0;
2260 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2262 calc
->cb
[57].id
= ID_CALC_D
;
2263 _tcscpy(calc
->cb
[57].label
,TEXT("D"));
2264 calc
->cb
[57].color
= CALC_COLOR_GRAY
;
2265 calc
->cb
[57].r
.left
= skipx
;
2266 calc
->cb
[57].r
.top
= skipy
;
2267 calc
->cb
[57].r
.right
= SZ_MEDBTN_X
;
2268 calc
->cb
[57].r
.bottom
= SZ_MEDBTN_Y
;
2269 calc
->cb
[57].enable
= 0;
2271 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2273 calc
->cb
[58].id
= ID_CALC_E
;
2274 _tcscpy(calc
->cb
[58].label
,TEXT("E"));
2275 calc
->cb
[58].color
= CALC_COLOR_GRAY
;
2276 calc
->cb
[58].r
.left
= skipx
;
2277 calc
->cb
[58].r
.top
= skipy
;
2278 calc
->cb
[58].r
.right
= SZ_MEDBTN_X
;
2279 calc
->cb
[58].r
.bottom
= SZ_MEDBTN_Y
;
2280 calc
->cb
[58].enable
= 0;
2282 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2284 calc
->cb
[59].id
= ID_CALC_F
;
2285 _tcscpy(calc
->cb
[59].label
,TEXT("F"));
2286 calc
->cb
[59].color
= CALC_COLOR_GRAY
;
2287 calc
->cb
[59].r
.left
= skipx
;
2288 calc
->cb
[59].r
.top
= skipy
;
2289 calc
->cb
[59].r
.right
= SZ_MEDBTN_X
;
2290 calc
->cb
[59].r
.bottom
= SZ_MEDBTN_Y
;
2291 calc
->cb
[59].enable
= 0;
2295 calc
->cb
[60].id
= ID_CALC_NS_HEX
;
2296 _tcscpy(calc
->cb
[60].label
,TEXT("Hex"));
2297 calc
->cb
[60].color
= CALC_COLOR_GRAY
;
2298 calc
->cb
[60].r
.left
= CALC_NS_HEX_LEFT
;
2299 calc
->cb
[60].r
.top
= CALC_NS_HEX_TOP
;
2300 calc
->cb
[60].r
.right
= SZ_RADIO_NS_X
;
2301 calc
->cb
[60].r
.bottom
= SZ_RADIO_NS_Y
;
2302 calc
->cb
[60].enable
= 1;
2304 calc
->cb
[61].id
= ID_CALC_NS_DEC
;
2305 _tcscpy(calc
->cb
[61].label
,TEXT("Dec"));
2306 calc
->cb
[61].color
= CALC_COLOR_GRAY
;
2307 calc
->cb
[61].r
.left
= CALC_NS_DEC_LEFT
;
2308 calc
->cb
[61].r
.top
= CALC_NS_DEC_TOP
;
2309 calc
->cb
[61].r
.right
= SZ_RADIO_NS_X
;
2310 calc
->cb
[61].r
.bottom
= SZ_RADIO_NS_Y
;
2311 calc
->cb
[61].enable
= 1;
2313 calc
->cb
[62].id
= ID_CALC_NS_OCT
;
2314 _tcscpy(calc
->cb
[62].label
,TEXT("Oct"));
2315 calc
->cb
[62].color
= CALC_COLOR_GRAY
;
2316 calc
->cb
[62].r
.left
= CALC_NS_OCT_LEFT
;
2317 calc
->cb
[62].r
.top
= CALC_NS_OCT_TOP
;
2318 calc
->cb
[62].r
.right
= SZ_RADIO_NS_X
;
2319 calc
->cb
[62].r
.bottom
= SZ_RADIO_NS_Y
;
2320 calc
->cb
[62].enable
= 1;
2322 calc
->cb
[63].id
= ID_CALC_NS_BIN
;
2323 _tcscpy(calc
->cb
[63].label
,TEXT("Bin"));
2324 calc
->cb
[63].color
= CALC_COLOR_GRAY
;
2325 calc
->cb
[63].r
.left
= CALC_NS_BIN_LEFT
;
2326 calc
->cb
[63].r
.top
= CALC_NS_BIN_TOP
;
2327 calc
->cb
[63].r
.right
= SZ_RADIO_NS_X
;
2328 calc
->cb
[63].r
.bottom
= SZ_RADIO_NS_Y
;
2329 calc
->cb
[63].enable
= 1;
2331 calc
->cb
[64].id
= ID_CALC_MS_DEGREES
;
2332 _tcscpy(calc
->cb
[64].label
,TEXT("Degrees"));
2333 calc
->cb
[64].color
= CALC_COLOR_GRAY
;
2334 calc
->cb
[64].r
.left
= CALC_MS_DEGREES_LEFT
;
2335 calc
->cb
[64].r
.top
= CALC_MS_DEGREES_TOP
;
2336 calc
->cb
[64].r
.right
= SZ_RADIO_MS_X
;
2337 calc
->cb
[64].r
.bottom
= SZ_RADIO_MS_Y
;
2338 calc
->cb
[64].enable
= 1;
2340 calc
->cb
[65].id
= ID_CALC_MS_RADIANS
;
2341 _tcscpy(calc
->cb
[65].label
,TEXT("Radians"));
2342 calc
->cb
[65].color
= CALC_COLOR_GRAY
;
2343 calc
->cb
[65].r
.left
= CALC_MS_RADIANS_LEFT
;
2344 calc
->cb
[65].r
.top
= CALC_MS_RADIANS_TOP
;
2345 calc
->cb
[65].r
.right
= SZ_RADIO_MS_X
;
2346 calc
->cb
[65].r
.bottom
= SZ_RADIO_MS_Y
;
2347 calc
->cb
[65].enable
= 1;
2349 calc
->cb
[66].id
= ID_CALC_MS_GRADS
;
2350 _tcscpy(calc
->cb
[66].label
,TEXT("Grads"));
2351 calc
->cb
[66].color
= CALC_COLOR_GRAY
;
2352 calc
->cb
[66].r
.left
= CALC_MS_GRADS_LEFT
;
2353 calc
->cb
[66].r
.top
= CALC_MS_GRADS_TOP
;
2354 calc
->cb
[66].r
.right
= SZ_RADIO_MS_X
;
2355 calc
->cb
[66].r
.bottom
= SZ_RADIO_MS_Y
;
2356 calc
->cb
[66].enable
= 1;
2358 calc
->cb
[67].id
= ID_CALC_CB_INV
;
2359 _tcscpy(calc
->cb
[67].label
,TEXT("Inv"));
2360 calc
->cb
[67].color
= CALC_COLOR_GRAY
;
2361 calc
->cb
[67].r
.left
= CALC_CB_INV_LEFT
;
2362 calc
->cb
[67].r
.top
= CALC_CB_INV_TOP
;
2363 calc
->cb
[67].r
.right
= SZ_RADIO_CB_X
;
2364 calc
->cb
[67].r
.bottom
= SZ_RADIO_CB_Y
;
2365 calc
->cb
[67].enable
= 1;
2367 calc
->cb
[68].id
= ID_CALC_CB_HYP
;
2368 _tcscpy(calc
->cb
[68].label
,TEXT("Hyp"));
2369 calc
->cb
[68].color
= CALC_COLOR_GRAY
;
2370 calc
->cb
[68].r
.left
= CALC_CB_HYP_LEFT
;
2371 calc
->cb
[68].r
.top
= CALC_CB_HYP_TOP
;
2372 calc
->cb
[68].r
.right
= SZ_RADIO_CB_X
;
2373 calc
->cb
[68].r
.bottom
= SZ_RADIO_CB_Y
;
2374 calc
->cb
[68].enable
= 1;
2376 calc
->cb
[69].id
= ID_CALC_WS_QWORD
;
2377 _tcscpy(calc
->cb
[69].label
,TEXT("Qword"));
2378 calc
->cb
[69].color
= CALC_COLOR_GRAY
;
2379 calc
->cb
[69].r
.left
= CALC_WS_QWORD_LEFT
;
2380 calc
->cb
[69].r
.top
= CALC_WS_QWORD_TOP
;
2381 calc
->cb
[69].r
.right
= SZ_RADIO_WS_X
;
2382 calc
->cb
[69].r
.bottom
= SZ_RADIO_WS_Y
;
2383 calc
->cb
[69].enable
= 1;
2385 calc
->cb
[70].id
= ID_CALC_WS_DWORD
;
2386 _tcscpy(calc
->cb
[70].label
,TEXT("Dword"));
2387 calc
->cb
[70].color
= CALC_COLOR_GRAY
;
2388 calc
->cb
[70].r
.left
= CALC_WS_DWORD_LEFT
;
2389 calc
->cb
[70].r
.top
= CALC_WS_DWORD_TOP
;
2390 calc
->cb
[70].r
.right
= SZ_RADIO_WS_X
;
2391 calc
->cb
[70].r
.bottom
= SZ_RADIO_WS_Y
;
2392 calc
->cb
[70].enable
= 1;
2394 calc
->cb
[71].id
= ID_CALC_WS_WORD
;
2395 _tcscpy(calc
->cb
[71].label
,TEXT("Word"));
2396 calc
->cb
[71].color
= CALC_COLOR_GRAY
;
2397 calc
->cb
[71].r
.left
= CALC_WS_WORD_LEFT
;
2398 calc
->cb
[71].r
.top
= CALC_WS_WORD_TOP
;
2399 calc
->cb
[71].r
.right
= SZ_RADIO_WS_X
;
2400 calc
->cb
[71].r
.bottom
= SZ_RADIO_WS_Y
;
2401 calc
->cb
[71].enable
= 1;
2403 calc
->cb
[72].id
= ID_CALC_WS_BYTE
;
2404 _tcscpy(calc
->cb
[72].label
,TEXT("Byte"));
2405 calc
->cb
[72].color
= CALC_COLOR_GRAY
;
2406 calc
->cb
[72].r
.left
= CALC_WS_BYTE_LEFT
;
2407 calc
->cb
[72].r
.top
= CALC_WS_BYTE_TOP
;
2408 calc
->cb
[72].r
.right
= SZ_RADIO_WS_X
;
2409 calc
->cb
[72].r
.bottom
= SZ_RADIO_WS_Y
;
2410 calc
->cb
[72].enable
= 1;
2413 // preload clip region for filler squares
2415 if (calc
->sciMode
) {
2418 rFiller
.left
= calc
->cb
[0].r
.left
;
2419 rFiller
.top
= calc
->cb
[0].r
.top
;
2420 rFiller
.right
= calc
->cb
[0].r
.right
;
2421 rFiller
.bottom
= calc
->cb
[0].r
.bottom
;
2426 rFiller
.left
= calc
->cb
[1].r
.left
;
2427 rFiller
.top
= calc
->cb
[1].r
.top
;
2428 rFiller
.right
= calc
->cb
[0].r
.right
;
2429 rFiller
.bottom
= calc
->cb
[0].r
.bottom
;
2432 top_button
= calc
->numButtons
- 1;
2434 top_button
-= CALC_NS_COUNT
+ CALC_MS_COUNT
+ CALC_CB_COUNT
+ CALC_WS_COUNT
;
2436 for (; n
<= top_button
; n
++) {
2439 calc
->cb
[n
].hBtn
= CreateWindow(
2442 WS_VISIBLE
| WS_CHILD
| WS_BORDER
| BS_CENTER
| BS_VCENTER
| BS_TEXT
|
2443 (calc
->cb
[n
].enable
? 0 : WS_DISABLED
), // BS_FLAT
2446 calc
->cb
[n
].r
.right
,
2447 calc
->cb
[n
].r
.bottom
,
2449 (HMENU
)calc
->cb
[n
].id
,
2454 if (!calc
->cb
[n
].hBtn
)
2457 SendMessage(calc
->cb
[n
].hBtn
, WM_SETFONT
, (WPARAM
)hFont
, TRUE
);
2460 if (!calc
->sciMode
) {
2461 top_button
+= CALC_NS_COUNT
;
2462 for (; n
<=top_button
; n
++) {
2463 int j
= ID_CALC_NS_HEX
+ n
- top_button
+ CALC_NS_COUNT
- 1;
2464 calc
->cb
[n
].hBtn
= CreateWindow(
2467 WS_VISIBLE
| WS_CHILD
| BS_LEFT
| BS_VCENTER
| BS_TEXT
| BS_RADIOBUTTON
,
2468 CALC_NS_OFFSET_X
+ calc
->cb
[n
].r
.left
,
2469 CALC_NS_OFFSET_Y
+ calc
->cb
[n
].r
.top
,
2470 calc
->cb
[n
].r
.right
,
2471 calc
->cb
[n
].r
.bottom
,
2478 if (!calc
->cb
[n
].hBtn
)
2481 SendMessage(calc
->cb
[n
].hBtn
, WM_SETFONT
, (WPARAM
)hFont
, TRUE
);
2484 top_button
+= CALC_MS_COUNT
;
2486 for (; n
<=top_button
; n
++) {
2487 calc
->cb
[n
].hBtn
= CreateWindow(
2490 WS_VISIBLE
| WS_CHILD
| BS_LEFT
| BS_VCENTER
| BS_TEXT
| BS_RADIOBUTTON
,
2491 CALC_MS_OFFSET_X
+ calc
->cb
[n
].r
.left
,
2492 CALC_MS_OFFSET_Y
+ calc
->cb
[n
].r
.top
,
2493 calc
->cb
[n
].r
.right
,
2494 calc
->cb
[n
].r
.bottom
,
2496 (HMENU
)(ID_CALC_MS_DEGREES
+ n
- top_button
+ CALC_MS_COUNT
- 1),
2501 if (!calc
->cb
[n
].hBtn
)
2504 SendMessage(calc
->cb
[n
].hBtn
, WM_SETFONT
, (WPARAM
)hFont
, TRUE
);
2507 top_button
+= CALC_CB_COUNT
;
2509 for (; n
<=top_button
; n
++) {
2510 calc
->cb
[n
].hBtn
= CreateWindow(
2513 WS_VISIBLE
| WS_CHILD
| BS_LEFT
| BS_VCENTER
| BS_TEXT
| BS_CHECKBOX
,
2514 CALC_CB_OFFSET_X
+ calc
->cb
[n
].r
.left
,
2515 CALC_CB_OFFSET_Y
+ calc
->cb
[n
].r
.top
,
2516 calc
->cb
[n
].r
.right
,
2517 calc
->cb
[n
].r
.bottom
,
2519 (HMENU
)(ID_CALC_CB_INV
+ n
- top_button
+ CALC_CB_COUNT
- 1),
2524 if (!calc
->cb
[n
].hBtn
)
2527 SendMessage(calc
->cb
[n
].hBtn
, WM_SETFONT
, (WPARAM
)hFont
, TRUE
);
2530 top_button
+= CALC_WS_COUNT
;
2532 for (; n
<=top_button
; n
++) {
2533 calc
->cb
[n
].hBtn
= CreateWindow(
2536 WS_CHILD
| BS_LEFT
| BS_VCENTER
| BS_TEXT
| BS_RADIOBUTTON
,
2537 CALC_WS_OFFSET_X
+ calc
->cb
[n
].r
.left
,
2538 CALC_WS_OFFSET_Y
+ calc
->cb
[n
].r
.top
,
2539 calc
->cb
[n
].r
.right
,
2540 calc
->cb
[n
].r
.bottom
,
2542 (HMENU
)(ID_CALC_WS_QWORD
+ n
- top_button
+ CALC_WS_COUNT
- 1),
2547 if (!calc
->cb
[n
].hBtn
)
2550 EnableWindow(calc
->cb
[n
].hBtn
, FALSE
);
2551 SendMessage(calc
->cb
[n
].hBtn
, WM_SETFONT
, (WPARAM
)hFont
, TRUE
);
2556 SendMessage(calc
->cb
[61].hBtn
, BM_SETCHECK
, 1, 0); // decimal
2557 SendMessage(calc
->cb
[64].hBtn
, BM_SETCHECK
, 1, 0); // degrees
2558 SendMessage(calc
->cb
[69].hBtn
, BM_SETCHECK
, 1, 0); // qword
2562 void DrawCalcRect (HDC hdc
, HDC hMemDC
, PAINTSTRUCT
*ps
, CALC
*calc
, int object
)
2573 int WDISPLAY_BOTTOM
;
2575 if (!calc
->sciMode
) {
2576 WDISPLAY_LEFT
= WDISPLAY_SCIENTIFIC_LEFT
;
2577 WDISPLAY_TOP
= WDISPLAY_SCIENTIFIC_TOP
;
2578 WDISPLAY_RIGHT
= WDISPLAY_SCIENTIFIC_RIGHT
;
2579 WDISPLAY_BOTTOM
= WDISPLAY_SCIENTIFIC_BOTTOM
;
2582 WDISPLAY_LEFT
= WDISPLAY_STANDARD_LEFT
;
2583 WDISPLAY_TOP
= WDISPLAY_STANDARD_TOP
;
2584 WDISPLAY_RIGHT
= WDISPLAY_STANDARD_RIGHT
;
2585 WDISPLAY_BOTTOM
= WDISPLAY_STANDARD_BOTTOM
;
2588 // never delete the active pen!
2592 hPenGray
= CreatePen(PS_SOLID
, 1, RGB(CALC_GRAY
,CALC_GRAY
,CALC_GRAY
));
2593 hPenBlack
= CreatePen(PS_SOLID
, 1, RGB(0,0,0));
2594 hPenWhite
= CreatePen(PS_SOLID
, 1, RGB(255,255,255));
2596 hPenOrg
= SelectObject(hdc
, hPenGray
);
2599 calc
->cb
[object
].r
.left
,
2600 calc
->cb
[object
].r
.bottom
,
2603 LineTo(hdc
, calc
->cb
[object
].r
.left
, calc
->cb
[object
].r
.top
);
2604 LineTo(hdc
, calc
->cb
[object
].r
.right
, calc
->cb
[object
].r
.top
);
2608 SelectObject(hdc
, hPenBlack
);
2611 calc
->cb
[object
].r
.right
-2,
2612 calc
->cb
[object
].r
.top
+1,
2615 LineTo(hdc
, calc
->cb
[object
].r
.left
+1, calc
->cb
[object
].r
.top
+1);
2616 LineTo(hdc
, calc
->cb
[object
].r
.left
+1, calc
->cb
[object
].r
.bottom
-1);
2618 SelectObject(hdc
, hPenBlack
);
2625 LineTo(hdc
, WDISPLAY_LEFT
- 1, WDISPLAY_TOP
- 1);
2626 LineTo(hdc
, WDISPLAY_RIGHT
+ 1, WDISPLAY_TOP
- 1);
2628 SelectObject(hdc
, hPenGray
);
2635 LineTo(hdc
, WDISPLAY_LEFT
- 2, WDISPLAY_TOP
- 2);
2636 LineTo(hdc
, WDISPLAY_LEFT
- 2, WDISPLAY_BOTTOM
+ 1);
2640 SelectObject(hdc
, hPenWhite
);
2643 calc
->cb
[object
].r
.left
,
2644 calc
->cb
[object
].r
.bottom
,
2647 LineTo(hdc
, calc
->cb
[object
].r
.right
, calc
->cb
[object
].r
.bottom
);
2648 LineTo(hdc
, calc
->cb
[object
].r
.right
, calc
->cb
[object
].r
.top
);
2650 SelectObject(hdc
, hPenOrg
);
2651 DeleteObject(hPenGray
);
2652 DeleteObject(hPenBlack
);
2653 DeleteObject(hPenWhite
);
2656 void DrawCalcRectSci(HDC hdc
, HDC hMemDC
, PAINTSTRUCT
*ps
, CALC
*calc
, RECT
*r
)
2662 // never delete the active pen!
2666 hPen
= CreatePen(PS_SOLID
, 1, RGB(255,255,255));
2667 hPenOrg
= SelectObject(hdc
, hPen
);
2674 LineTo(hdc
, r
->left
+ 1, r
->top
+ 1);
2675 LineTo(hdc
, r
->right
+ 1, r
->top
+ 1);
2676 LineTo(hdc
, r
->right
+ 1, r
->bottom
+ 1);
2677 LineTo(hdc
, r
->left
+ 1, r
->bottom
+ 1);
2679 SelectObject(hdc
, hPenOrg
);
2684 hPen
= CreatePen(PS_SOLID
, 1, RGB(CALC_GRAY
,CALC_GRAY
,CALC_GRAY
));
2685 hPenOrg
= SelectObject(hdc
, hPen
);
2692 LineTo(hdc
, r
->left
, r
->top
);
2693 LineTo(hdc
, r
->right
, r
->top
);
2694 LineTo(hdc
, r
->right
, r
->bottom
);
2695 LineTo(hdc
, r
->left
, r
->bottom
);
2697 SelectObject(hdc
, hPenOrg
);
2701 static RECT scirect1
= {
2702 WDISPLAY_SCIENTIFIC_LEFT
- 2,
2703 WDISPLAY_SCIENTIFIC_TOP
+ 25,
2704 WDISPLAY_SCIENTIFIC_LEFT
+ 202,
2705 WDISPLAY_SCIENTIFIC_TOP
+ 51
2708 static RECT scirect2
= {
2709 WDISPLAY_SCIENTIFIC_LEFT
+ 205,
2710 WDISPLAY_SCIENTIFIC_TOP
+ 25,
2711 WDISPLAY_SCIENTIFIC_RIGHT
,
2712 WDISPLAY_SCIENTIFIC_TOP
+ 51
2715 static RECT scirect3
= {
2716 WDISPLAY_SCIENTIFIC_LEFT
- 2,
2717 WDISPLAY_SCIENTIFIC_TOP
+ 57,
2718 WDISPLAY_SCIENTIFIC_LEFT
+ 102,
2719 WDISPLAY_SCIENTIFIC_TOP
+ 81
2722 void DrawCalc (HDC hdc
, HDC hMemDC
, PAINTSTRUCT
*ps
, CALC
*calc
)
2724 TCHAR s
[CALC_BUF_SIZE
];
2726 scirect1
.right
= calc
->cb
[0].r
.right
+ 2;
2727 scirect2
.left
= calc
->cb
[0].r
.right
+ 5;
2728 scirect3
.right
= calc
->cb
[1].r
.left
- 10;
2730 DrawCalcRect (hdc
, hMemDC
, ps
, calc
, 0);
2732 if (!calc
->sciMode
) {
2733 DrawCalcRect (hdc
, hMemDC
, ps
, calc
, 1);
2734 DrawCalcRectSci(hdc
, hMemDC
, ps
, calc
, &scirect1
);
2735 DrawCalcRectSci(hdc
, hMemDC
, ps
, calc
, &scirect2
);
2736 DrawCalcRectSci(hdc
, hMemDC
, ps
, calc
, &scirect3
);
2739 LoadString(calc
->hInst
, IDS_BTN_MEM_STATUS_M
, s
, sizeof(s
) / sizeof(s
[0]));
2741 DrawCalcText(hdc
, hMemDC
, ps
, calc
, 0, s
);
2744 void DrawCalcText (HDC hdc
, HDC hMemDC
, PAINTSTRUCT
*ps
, CALC
*calc
, int object
, TCHAR
*s
)
2754 TCHAR s2
[CALC_BUF_SIZE
];
2759 int WDISPLAY_BOTTOM
;
2761 if (!calc
->sciMode
) {
2762 WDISPLAY_LEFT
= WDISPLAY_SCIENTIFIC_LEFT
;
2763 WDISPLAY_TOP
= WDISPLAY_SCIENTIFIC_TOP
;
2764 WDISPLAY_RIGHT
= WDISPLAY_SCIENTIFIC_RIGHT
;
2765 WDISPLAY_BOTTOM
= WDISPLAY_SCIENTIFIC_BOTTOM
;
2768 WDISPLAY_LEFT
= WDISPLAY_STANDARD_LEFT
;
2769 WDISPLAY_TOP
= WDISPLAY_STANDARD_TOP
;
2770 WDISPLAY_RIGHT
= WDISPLAY_STANDARD_RIGHT
;
2771 WDISPLAY_BOTTOM
= WDISPLAY_STANDARD_BOTTOM
;
2774 // DEFAULT_GUI_FONT is Tahoma on 2000 and XP?
2775 // SYSTEM_FONT is MS Sans Serif?
2777 hFont
= GetStockObject(DEFAULT_GUI_FONT
);
2779 hFontOrg
= SelectObject(hdc
, hFont
);
2782 SetBkMode(hdc
, TRANSPARENT
);
2785 calc
->cb
[object
].r
.left
+ 9,
2786 calc
->cb
[object
].r
.top
+ 7,
2791 SetBkMode(hdc
, OPAQUE
);
2795 _stprintf(s2
, TEXT("(=%d"),calc
->paren
);
2797 SetBkMode(hdc
, TRANSPARENT
);
2799 SetTextAlign(hdc
, TA_CENTER
);
2802 calc
->cb
[object
+1].r
.left
+ 13,
2803 calc
->cb
[object
+1].r
.top
+ 6,
2808 SetBkMode(hdc
, OPAQUE
);
2811 hPen
= CreatePen(PS_SOLID
, 1, RGB(255,255,255));
2812 hPenOrg
= SelectObject(hdc
, hPen
);
2813 hBrush
= GetSysColorBrush(COLOR_WINDOW
);
2814 hBrushOrg
= SelectObject(hdc
, hBrush
);
2818 WDISPLAY_BOTTOM
+ 1,
2822 LineTo(hdc
, WDISPLAY_RIGHT
+ 1, WDISPLAY_BOTTOM
+ 1);
2823 LineTo(hdc
, WDISPLAY_RIGHT
+ 1, WDISPLAY_TOP
- 2);
2825 Rectangle(hdc
, WDISPLAY_LEFT
, WDISPLAY_TOP
, WDISPLAY_RIGHT
, WDISPLAY_BOTTOM
);
2827 SelectObject(hdc
, hPenOrg
);
2828 SelectObject(hdc
, hBrushOrg
);
2831 SetBkMode(hdc
, TRANSPARENT
);
2833 SetTextAlign(hdc
, TA_RIGHT
);
2839 _tcslen(calc
->display
)
2842 SelectObject(hdc
, hFontOrg
);
2845 void DestroyCalc (CALC
*calc
)
2849 for (i
=0;i
<calc
->numButtons
;i
++)
2850 DestroyWindow(calc
->cb
[i
].hBtn
);
2855 if (menus
[MENU_STD
] != 0)
2856 DestroyMenu(menus
[MENU_STD
]);
2858 if (menus
[MENU_SCIMS
] != 0)
2859 DestroyMenu(menus
[MENU_SCIMS
]);
2861 if (menus
[MENU_SCIWS
] != 0)
2862 DestroyMenu(menus
[MENU_SCIWS
]);
2865 void calc_buffer_format(CALC
*calc
) {
2871 // calc_buffer_format: enforce buffer content rules
2873 // disallow more than one point (beep)
2874 // remove leading zeros
2875 // remove trailing zeros after point (sprintf can cause this)
2876 // remove trailing points
2877 // chop at 32 digits. Though there could also be a point, and 10 separator characters.
2881 if (*p
++ == TEXT('.'))
2886 calc
->buffer
[_tcslen(calc
->buffer
)-1] = TEXT('\0');
2891 // p = calc->buffer;
2892 // n = _tcslen(p) - 1;
2894 // *(p+n) != TEXT('.') &&
2895 // *(p+n) == TEXT('0')) {
2896 // calc->buffer[n] = TEXT('\0');
2901 // remove leading zeros
2905 if (*p
!= TEXT('0'))
2910 // remove trailing points
2915 if (*(p
+n
-1) == TEXT('.')) {
2917 *(p
+ n
) = TEXT('\0');
2930 // _tcscpy(p, TEXT("0"));
2932 // chop at 32 digits
2934 *(p
+33) = TEXT('\0');
2936 *(p
+32) = TEXT('\0');
2940 *(calc
->buffer
+ n
++) = *(p
++);
2941 *(calc
->buffer
+ n
) = TEXT('\0');
2944 void calc_buffer_display(CALC
*calc
) {
2946 TCHAR s
[CALC_BUF_SIZE
];
2949 static int old_base
= NBASE_DECIMAL
;
2952 switch (calc
->numBase
) {
2954 real
= calc_atof(calc
->buffer
, old_base
);
2955 _stprintf(calc
->display
, _T("%lx"), (long)real
);
2956 _stprintf(calc
->buffer
, _T("%lx"), (long)real
);
2957 old_base
= NBASE_HEX
;
2961 real
= calc_atof(calc
->buffer
, old_base
);
2962 _stprintf(calc
->display
, TEXT("%lo"), (long)real
);
2963 _stprintf(calc
->buffer
, TEXT("%lo"), (long)real
);
2964 old_base
= NBASE_OCTAL
;
2972 if (calc
->buffer
[0]==_T('\0'))
2978 real
= calc_atof(calc
->buffer
, old_base
);
2981 calc
->display
[buf
]=_T('0');
2982 calc
->buffer
[buf
]=_T('0');
2985 if (((((long)real
)>>t
) & ~0xFFFFFFFE)==0)
2987 calc
->display
[buf
]=_T('0');
2988 calc
->buffer
[buf
]=_T('0');
2993 calc
->display
[buf
]=_T('1');
2994 calc
->buffer
[buf
]=_T('1');
3005 calc
->buffer
[buf
]=_T('\0');
3006 calc
->display
[buf
]=_T('\0');
3007 old_base
= NBASE_BINARY
;
3013 calc_buffer_format(calc
);
3015 if (calc
->displayMode
) {
3016 if (!_tcscmp(calc
->buffer
, TEXT("0")) || !calc
->buffer
[0]) {
3017 _tcscpy(calc
->display
, TEXT("0.e+0"));
3026 real
= calc_atof(calc
->buffer
,old_base
);
3027 _stprintf(s
, FMT_DESC_EXP
, real
);
3028 // remove leading zeros in exponent
3031 if (*p
== TEXT('e')) { // starting exponent parsing
3035 else if (exp
) { // inside exponent, and haven't seen a digit, so could be a leading zero
3037 if (*p
== TEXT('0'))
3041 if (exp
&& (*p
!= TEXT('e')) && (*p
!= TEXT('0')) && (*p
!= TEXT('+')) && (*p
!= TEXT('-'))) {
3047 calc
->display
[i
++] = *p
;
3052 if (calc
->display
[i
-1] == TEXT('+')) // all trailing zeros
3054 calc
->display
[i
++] = TEXT('0');
3056 calc
->display
[i
] = 0;
3060 // calc_buffer_display: display buffer after formatting
3062 // if digitGrouping, embed separators
3063 // add point if missing
3066 if (old_base
!= calc
->numBase
)
3068 if (calc
->buffer
[0]==_T('\0'))
3074 real
= calc_atof(calc
->buffer
, old_base
);
3076 _stprintf(calc
->display
, _T("%.f"), real
);
3077 _stprintf(calc
->buffer
, _T("%.f"), real
);
3080 _tcscpy(s
,calc
->buffer
);
3084 if (*p
++ == TEXT('.'))
3089 _tcscpy(s
, TEXT("0"));
3091 if (calc
->digitGrouping
)
3094 if (!point
&& calc
->numBase
== NBASE_DECIMAL
)
3095 _tcscat(s
, TEXT("."));
3097 if (*s
== TEXT('.'))
3098 _tcscpy(calc
->display
, TEXT("0"));
3100 calc
->display
[0] = 0;
3101 _tcscat(calc
->display
, s
);
3103 old_base
= NBASE_DECIMAL
;
3106 InvalidateRect(calc
->hWnd
, NULL
, FALSE
);
3107 UpdateWindow(calc
->hWnd
);
3110 TCHAR
*calc_sep(TCHAR
*s
)
3118 TCHAR r
[CALC_BUF_SIZE
];
3127 // need to handle leading minus sign!
3129 // see if there is a point character
3132 if (*p
++ == TEXT('.')) {
3138 // if there is a point character, skip over decimal places
3147 // commify the integer part now
3149 while ((c
= *(s
+ --n
))) {
3157 if (r
[i
-1] == TEXT(','))
3158 r
[--i
] = TEXT('\0');
3162 _tcscpy(s
, _tcsrev(r
));
3167 long factorial(long n
)
3172 return n
* factorial(n
- 1);
3175 void calc_setmenuitem_radio(HMENU hMenu
, UINT id
)
3177 MENUITEMINFO menuItem
;
3179 menuItem
.fMask
= MIIM_FTYPE
;
3180 menuItem
.fType
= MFT_STRING
| MFT_RADIOCHECK
;
3181 // menuItem.fState = MFS_ENABLED;
3182 // menuItem.wID = id;
3183 // menuItem.hSubMenu = NULL;
3184 // menuItem.hbmpChecked = NULL;
3185 // menuItem.hbmpUnchecked = NULL;
3186 // menuItem.dwItemData = 0;
3187 // menuItem.dwTypeData = "Hex\tF5";
3188 // menuItem.cch = sizeof("Hex\tF5");
3189 menuItem
.cbSize
= sizeof(MENUITEMINFO
);
3191 SetMenuItemInfo(hMenu
, id
, FALSE
, &menuItem
);
3194 calcfloat
calc_convert_to_radians(CALC
*calc
)
3196 calcfloat r
= calc_atof(calc
->buffer
, calc
->numBase
);
3198 if (calc
->trigMode
== TRIGMODE_RADIANS
)
3200 if (calc
->trigMode
== TRIGMODE_DEGREES
)
3201 return r
* CONST_PI
/ 180;
3202 else if (calc
->trigMode
== TRIGMODE_GRADS
)
3203 return r
* CONST_PI
/ 200; // 90 degrees == 100 grads
3208 calcfloat
calc_convert_from_radians(CALC
*calc
)
3210 calcfloat r
= calc_atof(calc
->buffer
, calc
->numBase
);
3212 if (calc
->trigMode
== TRIGMODE_RADIANS
)
3214 if (calc
->trigMode
== TRIGMODE_DEGREES
)
3215 return r
* 180 / CONST_PI
;
3216 else if (calc
->trigMode
== TRIGMODE_GRADS
)
3217 return r
* 200 / CONST_PI
; // 90 degrees == 100 grads
3222 void show_debug(CALC
*calc
, TCHAR
*title
, long w
, long l
)
3228 TEXT("wParam = (%C) %d:%d, %x:%xh\n \
3229 lParam = %d:%d, %x:%x\n \
3233 display = \"%s\"\n \
3262 MessageBox(calc
->hWnd
, s
, title
, MB_OK
);
3265 calcfloat
calc_atof(const TCHAR
*s
, int base
)
3271 // converts from another base to decimal calcfloat
3274 wcstombs(s_ansi
, s
, sizeof(s_ansi
));
3275 return CALC_ATOF(s_ansi
);
3277 return (calcfloat
)_tcstol(s
, NULL
, 16);
3279 return (calcfloat
)_tcstol(s
, NULL
, 8);
3281 return (calcfloat
)_tcstol(s
, NULL
, 2);
3289 void calc_ftoa(CALC
*calc
, calcfloat r
, TCHAR
*buf
)
3291 // converts from decimal calcfloat to another base
3293 switch (calc
->numBase
) {
3295 _stprintf(buf
, FMT_DESC_FLOAT
, r
);
3298 _stprintf(buf
, TEXT("%lX"), (long)r
);
3301 _stprintf(buf
, TEXT("%lo"), (long)r
);
3303 case NBASE_BINARY
: // 911 - need routine here
3311 int parse(int wParam
, int lParam
)
3314 case TEXT('\b'): // backspace
3317 calc
.buffer
[_tcslen(calc
.buffer
)-1] = TEXT('\0');
3320 case TEXT('\x1b'): // ESC
3323 calc
.buffer
[0] = TEXT('\0');
3351 TCHAR s22
[CALC_BUF_SIZE
];
3352 TCHAR w
= (TCHAR
)LOWORD(wParam
);
3354 if (!keys
[calc
.numBase
][(WORD
)w
]) {
3359 if (calc
.next
) { // user first digit indicates new buffer needed after previous UI event
3361 calc
.buffer
[0] = TEXT('\0');
3365 _stprintf(s22
,TEXT("%C"), w
);
3366 _tcscat(calc
.buffer
, s22
);
3367 //MessageBox(NULL, s22, NULL, 0);
3372 case TEXT(','): // 911 - need to handle this, i18n
3374 if (calc
.numBase
== NBASE_DECIMAL
) {
3375 if (calc
.next
) { // first digit indicates new buffer needed after previous UI event
3377 calc
.buffer
[0] = TEXT('\0');
3380 _tcscat(calc
.buffer
, TEXT("."));
3389 case TEXT('X'): // exp, e(1)=2.718
3391 if (calc
.numBase
== NBASE_DECIMAL
) {
3393 calc
.value
= exp(calc_atof(calc
.buffer
, calc
.numBase
));
3394 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3405 if (calc_atof(calc
.buffer
, calc
.numBase
) == 0.0L) {
3406 _tcscpy(calc
.buffer
, err_invalid
);
3409 calc
.value
= log10(calc_atof(calc
.buffer
, calc
.numBase
));
3410 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3415 case TEXT('n'): // ln is natural logarithm
3418 if (calc_atof(calc
.buffer
, calc
.numBase
) == 0.0L) {
3419 _tcscpy(calc
.buffer
, err_invalid
);
3422 calc
.value
= log(calc_atof(calc
.buffer
, calc
.numBase
));
3423 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3429 if (calc
.numBase
== NBASE_DECIMAL
) {
3431 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, CONST_PI
);
3439 case TEXT('\x0c'): // Ctrl+L MC (only need to invalid rectangle if wasn't already zero, no need to update display)
3444 InvalidateRect(calc
.hWnd
, &rFiller
, TRUE
);
3445 UpdateWindow(calc
.hWnd
);
3451 case TEXT('\x12'): // Ctrl+R MR (value doesn't change, so no invalid rectangle. but display is updated.)
3454 if (calc
.memory
!= calc_atof(calc
.buffer
, calc
.numBase
))
3455 _stprintf(calc
.buffer
,FMT_DESC_FLOAT
,calc
.memory
);
3460 case TEXT('\x10'): // Ctrl+P M+ (need to invalidate rectangle in many cases but not display)
3463 InvalidateRect(calc
.hWnd
, &rFiller
, TRUE
);
3464 calc
.memory
+= calc_atof(calc
.buffer
, calc
.numBase
);
3468 case TEXT('\x0d'): // Ctrl+M MS (only need to invalid rectangle if was zero and now not,
3470 // or was not zero and now is, not display)
3473 int x
= GetKeyState(VK_CONTROL
);
3475 if (x
< 0 || lParam
== NUMBER_OF_THE_BEAST
) {
3476 if ((!calc
.memory
&& calc_atof(calc
.buffer
, calc
.numBase
)) ||
3477 (calc
.memory
&& !calc_atof(calc
.buffer
, calc
.numBase
))) {
3479 calc
.memory
= calc_atof(calc
.buffer
, calc
.numBase
);
3480 InvalidateRect(calc
.hWnd
, &rFiller
, FALSE
);
3481 UpdateWindow(calc
.hWnd
);
3484 calc
.memory
= calc_atof(calc
.buffer
, calc
.numBase
);
3489 // fall through for Enter processing
3493 calcfloat r
= calc
.operand
;
3495 if (calc
.newenter
) {
3497 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3498 r
= calc_atof(calc
.buffer
, calc
.numBase
); // convert buffer from whatever base to decimal real
3501 if (calc
.oper
== TEXT('+')) {
3504 else if (calc
.oper
== TEXT('-')) {
3507 else if (calc
.oper
== TEXT('*')) {
3510 else if (calc
.oper
== TEXT('%')) {
3511 calc
.value
= (long)calc
.value
% (long)r
;
3513 else if (calc
.oper
== TEXT('/')) {
3514 if (!calc_atof(calc
.buffer
, calc
.numBase
)) {
3515 _tcscpy(calc
.buffer
, err_undefined
);
3522 else if (calc
.oper
== TEXT('&')) {
3523 calc
.value
= (calcfloat
)((long)calc
.value
& (long)r
);
3525 else if (calc
.oper
== TEXT('|')) {
3526 calc
.value
= (calcfloat
)((long)calc
.value
| (long)r
);
3528 else if (calc
.oper
== TEXT('^')) {
3529 calc
.value
= (calcfloat
)((long)calc
.value
^ (long)r
);
3531 else if (calc
.oper
== TEXT('y')) {
3532 calc
.value
= (calcfloat
)pow(calc
.value
, r
);
3534 else if (calc
.oper
== TEXT('<')) {
3536 calc
.value
= (calcfloat
)((long)calc
.value
>> (long)calc_atof(calc
.buffer
, calc
.numBase
));
3538 calc
.value
= (calcfloat
)((long)calc
.value
<< (long)calc_atof(calc
.buffer
, calc
.numBase
));
3540 else { // must have been a gratuitous user =
3542 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3545 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3554 case TEXT('r'): // 1/x
3557 if (calc_atof(calc
.buffer
, calc
.numBase
) == 0) {
3559 _tcscpy(calc
.buffer
, err_divide_by_zero
);
3562 calc
.value
= 1/calc_atof(calc
.buffer
, calc
.numBase
);
3563 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3567 case TEXT('@'): // ^2 - sqrt in standard mode, squared in sci mode
3570 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3573 calc
.value
*= calc
.value
;
3575 calc
.value
= sqrt(calc
.value
);
3577 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3580 case TEXT('#'): // ^3
3583 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3584 calc
.value
*= calc
.value
* calc
.value
;
3585 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3589 case TEXT('y'): // x^y
3592 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3593 calc
.oper
= TEXT('y');
3597 case TEXT('<'): // Lsh
3600 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3601 calc
.oper
= TEXT('<');
3605 case TEXT(';'): // INT
3608 calc
.value
= (long)calc_atof(calc
.buffer
, calc
.numBase
);
3609 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3612 case TEXT('!'): // factorial, need to use gamma function for reals t^(z-1)*e^t dt
3615 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3616 calc
.value
= (calcfloat
)factorial((long)calc
.value
);
3617 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3620 case TEXT('&'): // bitwise and
3624 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3627 case TEXT('|'): // bitwise or
3629 calc
.oper
= TEXT('|');
3631 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3634 case TEXT('^'): // bitwise xor
3636 calc
.oper
= TEXT('^');
3638 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3641 case TEXT('~'): // bitwise not
3644 calc
.value
= ~ (long) calc_atof(calc
.buffer
, calc
.numBase
);
3645 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3649 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3650 calc
.value
+= calc
.operand
;
3651 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3652 calc
.oper
= TEXT('+');
3660 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3661 calc
.value
= calc
.operand
;
3664 calc
.value
-= calc
.operand
;
3665 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3668 calc
.oper
= TEXT('-');
3676 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3677 calc
.value
= calc
.operand
;
3680 calc
.value
*= calc
.operand
;
3681 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3683 calc
.oper
= TEXT('*');
3691 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3692 calc
.value
= calc
.operand
;
3695 calc
.value
/= calc
.operand
;
3696 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3698 calc
.oper
= TEXT('/');
3704 if (!calc
.sciMode
) {
3707 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3708 calc
.value
= calc
.operand
;
3711 calc
.value
= (long)calc_atof(calc
.buffer
, calc
.numBase
) % (long)calc
.operand
;
3712 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3717 r
= calc_atof(calc
.buffer
, calc
.numBase
);
3719 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, r
* calc
.value
/ (calcfloat
)100.0);
3722 calc
.oper
= TEXT('%');
3727 case TEXT('O'): // cos
3730 if (calc
.numBase
== NBASE_DECIMAL
) {
3734 r
= calc_convert_to_radians(&calc
);
3735 if (calc
.hypMode
&& calc
.invMode
)
3736 calc
.value
= acosh(r
);
3737 else if (calc
.invMode
)
3738 calc
.value
= acos(r
);
3739 else if (calc
.hypMode
)
3740 calc
.value
= cosh(r
);
3742 calc
.value
= cos(calc_atof(calc
.buffer
, calc
.numBase
));
3743 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3751 case TEXT('S'): // sin
3754 if (calc
.numBase
== NBASE_DECIMAL
) {
3756 calcfloat r
= calc_convert_to_radians(&calc
);
3758 if (calc
.hypMode
&& calc
.invMode
)
3759 calc
.value
= asinh(r
);
3760 else if (calc
.invMode
)
3761 calc
.value
= asin(r
);
3762 else if (calc
.hypMode
)
3763 calc
.value
= sinh(r
);
3765 calc
.value
= sin(r
);
3767 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3775 case TEXT('T'): // tan
3778 if (calc
.numBase
== NBASE_DECIMAL
) {
3779 calcfloat r
= calc_convert_to_radians(&calc
);
3781 if (calc
.hypMode
&& calc
.invMode
)
3782 calc
.value
= atanh(r
);
3783 else if (calc
.invMode
)
3784 calc
.value
= atan(r
);
3785 else if (calc
.hypMode
)
3786 calc
.value
= tanh(r
);
3788 calc
.value
= tan(r
);
3790 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3798 case TEXT('M'): // dms = Degrees Minutes Seconds
3801 if (calc
.numBase
== NBASE_DECIMAL
) {
3803 calcfloat r
= calc_atof(calc
.buffer
, calc
.numBase
);
3807 r
= (long)r
+ r2
* 0.6; // multiply by 60 and divide by 100
3809 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3817 case TEXT('V'): // toggle scientic notation like 1.e+2 or 100
3820 calc
.displayMode
= !calc
.displayMode
;
3823 // non-standard keystrokes ...
3828 if (calc_atof(calc
.buffer
, calc
.numBase
) < 0) {
3830 _tcscpy(calc
.buffer
, err_invalid
);
3833 calc
.value
= sqrt(calc_atof(calc
.buffer
, calc
.numBase
));
3834 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3838 case TEXT('Z'): // +/-
3841 TCHAR s
[CALC_BUF_SIZE
] = TEXT("-");
3843 if (!_tcscmp(calc
.buffer
, TEXT("0")))
3846 if (calc
.buffer
[0] == TEXT('-'))
3847 _tcscpy(s
, calc
.buffer
+1);
3849 _tcscpy(s
+1, calc
.buffer
);
3851 _tcscpy(calc
.buffer
, s
);
3855 case TEXT('G'): // debug mode
3872 case WM_CONTEXTMENU: // need to subclass control and just call WinHelp!
3873 WinHelp((HWND) wParam, "c:/windows/help/calc.hlp", HELP_CONTEXTMENU, (DWORD)(LPVOID)2);