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
, appname
);
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 (!(hGlobalMemory
= GlobalAlloc(GHND
, (len
+ 1) * sizeof(TCHAR
))))
482 if (!(pGlobalMemory
= GlobalLock(hGlobalMemory
)))
485 if (!(s
= calc
.display
))
488 for (i
= 0; i
< len
; i
++)
489 *pGlobalMemory
++ = *s
++;
491 GlobalUnlock(hGlobalMemory
); // call GetLastError() for exception handling
493 if (!OpenClipboard(hWnd
))
496 if (!EmptyClipboard())
499 if (!SetClipboardData(CF_TEXT
, hGlobalMemory
))
502 if (!CloseClipboard())
507 case TEXT('\x16'): // Ctrl+V Paste
514 HGLOBAL hGlobalMemory
;
515 LPTSTR pGlobalMemory
;
517 if (IsClipboardFormatAvailable(CF_TEXT
)) {
518 if (!OpenClipboard(hWnd
))
521 if (!(hGlobalMemory
= GetClipboardData(CF_TEXT
)))
524 if (!(size
= GlobalSize(hGlobalMemory
)))
527 if (!(s
= (TCHAR
*)malloc(size
)))
530 if (!(pGlobalMemory
= GlobalLock(hGlobalMemory
)))
533 _tcscpy(s
, pGlobalMemory
);
535 GlobalUnlock(hGlobalMemory
);
537 if (!CloseClipboard())
540 // calc paste protocol
542 // :c clear memory WM_CHAR, 0x0c
543 // :e enable scientific notation WM_CHAR, 'v'
544 // :m store display in memory WM_CHAR, 0x0d
545 // :p add display to memory WM_CHAR, 0x10
546 // :q clear current calculation WM_CHAR, '\x1b'
547 // :r read memory into display WM_CHAR, 0x12
548 // \ Dat WM_CHAR, VK_INSERT
550 // parse the pasted data, validate and SendMessage it one character at a time.
551 // it would appear wincalc does it this way (slow), although very slow appearing on Wine.
553 while ((c
= *s
++) && (i
++ < size
/ sizeof(TCHAR
))) {
554 if (c
== TEXT(':')) {
557 else if (c
== TEXT('\\')) {
558 SendMessage(hWnd
, WM_KEYDOWN
, VK_INSERT
, lParam
);
565 case TEXT('c'): // clear memory
568 SendMessage(hWnd
, WM_CHAR
, 0x0c, lParam
);
570 case TEXT('e'): // enable scientific notation
573 SendMessage(hWnd
, WM_CHAR
, 'v', lParam
);
575 case TEXT('m'): // store display in memory
578 SendMessage(hWnd
, WM_CHAR
, 0x0d, NUMBER_OF_THE_BEAST
);
580 case TEXT('p'): // add display to memory
583 SendMessage(hWnd
, WM_CHAR
, 0x10, lParam
);
585 case TEXT('q'): // clear current calculation
588 SendMessage(hWnd
, WM_CHAR
, TEXT('\x1b'), lParam
);
590 case TEXT('r'): // read memory into display
593 SendMessage(hWnd
, WM_CHAR
, 0x12, lParam
);
595 default: // just eat it but complain
602 if ((calc
.numBase
== NBASE_HEX
) &&
603 ((c
>= TEXT('0') && c
<= TEXT('9')) ||
604 (c
>= TEXT('a') && c
<= TEXT('f')) ||
605 (c
>= TEXT('A') && c
<= TEXT('F')))) {
607 SendMessage(hWnd
, WM_CHAR
, c
, lParam
);
609 else if ((calc
.numBase
== NBASE_DECIMAL
) &&
610 (c
>= TEXT('0') && c
<= TEXT('9'))) {
611 SendMessage(hWnd
, WM_CHAR
, c
, lParam
);
613 else if ((calc
.numBase
== NBASE_OCTAL
) &&
614 (c
>= TEXT('0') && c
<= TEXT('7'))) {
615 SendMessage(hWnd
, WM_CHAR
, c
, lParam
);
617 else if ((calc
.numBase
== NBASE_BINARY
) &&
618 (c
== TEXT('0') || c
== TEXT('1'))) {
619 SendMessage(hWnd
, WM_CHAR
, c
, lParam
);
621 else if (c
== TEXT('.') || c
== TEXT(',') ||
622 c
== TEXT('e') || c
== TEXT('E') ||
623 c
== TEXT('+') || c
== TEXT('-')) {
624 SendMessage(hWnd
, WM_CHAR
, c
, lParam
);
626 else if (c
== TEXT(' ') || // eat harmless trash here
631 else { // extra spicy trash gets noticed
633 MessageBeep(0); // uh, beeps can get annoying. maybe rate limit.
644 parse(wParam
, lParam
);
648 calc_buffer_display(&calc
);
652 switch(LOWORD(wParam
)) {
655 SendMessage(hWnd
, WM_CHAR
, TEXT('\x03'), lParam
);
659 SendMessage(hWnd
, WM_CHAR
, TEXT('\x16'), lParam
);
662 case IDM_MODE_STANDARD
:
668 calc
.trigMode
= TRIGMODE_DEGREES
;
669 calc
.numBase
= NBASE_DECIMAL
;
671 EnableWindow(hWnd
, FALSE
);
674 for (i
=1;i
<COUNT_MENUS
;i
++) {
675 if (calc
.numBase
!= ID_CALC_NS_DEC
) {
676 CheckMenuItem(menus
[i
], ID_CALC_NS_HEX
, MF_UNCHECKED
);
677 CheckMenuItem(menus
[i
], ID_CALC_NS_DEC
, MF_CHECKED
);
678 CheckMenuItem(menus
[i
], ID_CALC_NS_OCT
, MF_UNCHECKED
);
679 CheckMenuItem(menus
[i
], ID_CALC_NS_BIN
, MF_UNCHECKED
);
683 for (i
=1;i
<COUNT_MENUS
;i
++) {
684 CheckMenuItem(menus
[i
], ID_CALC_MS_DEGREES
, MF_CHECKED
);
685 CheckMenuItem(menus
[i
], ID_CALC_MS_RADIANS
, MF_UNCHECKED
);
686 CheckMenuItem(menus
[i
], ID_CALC_MS_GRADS
, MF_UNCHECKED
);
689 SetMenu(hWnd
, menus
[MENU_STD
]);
691 // SendMessage(hWnd, WM_SIZE, SIZE_RESTORED, CALC_STANDARD_WIDTH | (CALC_STANDARD_HEIGHT << 8));
692 GetWindowRect(hWnd
, &lpRect
);
693 MoveWindow(hWnd
, lpRect
.left
, lpRect
.top
, CALC_STANDARD_WIDTH
, CALC_STANDARD_HEIGHT
, TRUE
);
697 EnableWindow(hWnd
, TRUE
);
702 case IDM_MODE_SCIENTIFIC
:
707 EnableWindow(hWnd
, FALSE
);
709 SetMenu(hWnd
, menus
[MENU_SCIMS
]);
711 GetWindowRect(hWnd
, &lpRect
);
712 MoveWindow(hWnd
, lpRect
.left
, lpRect
.top
, CALC_SCIENTIFIC_WIDTH
, CALC_SCIENTIFIC_HEIGHT
, TRUE
);
717 SendMessage(calc
.cb
[67].hBtn
, BM_SETCHECK
, TRUE
, 0);
720 SendMessage(calc
.cb
[68].hBtn
, BM_SETCHECK
, TRUE
, 0);
722 EnableWindow(hWnd
, TRUE
);
727 case IDM_DIGIT_GROUPING
:
732 calc
.digitGrouping
= !calc
.digitGrouping
;
734 n
= (calc
.digitGrouping
? MF_CHECKED
: MF_UNCHECKED
);
736 for (i
=0;i
<COUNT_MENUS
;i
++)
737 CheckMenuItem(menus
[i
], IDM_DIGIT_GROUPING
, n
);
739 calc_buffer_display(&calc
);
743 case IDM_HELP_TOPICS
:
744 MessageBox(hWnd
, TEXT("No Help Available"), TEXT("Windows Help"), MB_OK
);
748 DialogBox( calc
.hInst
, TEXT("DLG_ABOUT"), hWnd
, AboutDlgProc
);
757 int w
= LOWORD(wParam
);
759 if (w
== ID_CALC_NS_HEX
) {
760 if (calc
.numBase
== NBASE_HEX
)
763 calc
.numBase
= NBASE_HEX
;
765 else if (w
== ID_CALC_NS_DEC
) {
766 if (calc
.numBase
== NBASE_DECIMAL
)
769 calc
.numBase
= NBASE_DECIMAL
;
771 else if (w
== ID_CALC_NS_OCT
) {
772 if (calc
.numBase
== NBASE_OCTAL
)
775 calc
.numBase
= NBASE_OCTAL
;
777 else if (w
== ID_CALC_NS_BIN
) {
778 if (calc
.numBase
== NBASE_BINARY
)
781 calc
.numBase
= NBASE_BINARY
;
784 for (i
=0;i
<CALC_NS_COUNT
;i
++)
785 SendMessage(calc
.cb
[60+i
].hBtn
, BM_SETCHECK
, w
== (ID_CALC_NS_HEX
+ i
) ? 1 : 0, 0);
787 for (i
=2;i
<TOGGLE_COUNT
;i
++) { // skip 0 and 1, always valid
788 if (btn_toggle
[w
- ID_CALC_NS_HEX
][i
]) {
789 if (!IsWindowEnabled((HWND
)calc
.cb
[h
[i
]].hBtn
))
790 EnableWindow((HWND
)calc
.cb
[h
[i
]].hBtn
, TRUE
);
794 if (IsWindowEnabled((HWND
)calc
.cb
[h
[i
]].hBtn
))
795 EnableWindow((HWND
)calc
.cb
[h
[i
]].hBtn
, FALSE
);
799 if (w
== ID_CALC_NS_DEC
) {
800 for (i
=0;i
<CALC_WS_COUNT
;i
++) {
801 if (IsWindowEnabled((HWND
)calc
.cb
[hws
[i
]].hBtn
)) {
802 ShowWindow((HWND
)calc
.cb
[hws
[i
]].hBtn
, SW_HIDE
);
803 EnableWindow((HWND
)calc
.cb
[hws
[i
]].hBtn
, FALSE
);
806 for (i
=0;i
<CALC_MS_COUNT
;i
++) {
807 if (!IsWindowEnabled((HWND
)calc
.cb
[hms
[i
]].hBtn
)) {
808 ShowWindow((HWND
)calc
.cb
[hms
[i
]].hBtn
, SW_SHOWNORMAL
);
809 EnableWindow((HWND
)calc
.cb
[hms
[i
]].hBtn
, TRUE
);
814 for (i
=0;i
<CALC_MS_COUNT
;i
++) {
815 if (IsWindowEnabled((HWND
)calc
.cb
[hms
[i
]].hBtn
)) {
816 ShowWindow((HWND
)calc
.cb
[hms
[i
]].hBtn
, SW_HIDE
);
817 EnableWindow((HWND
)calc
.cb
[hms
[i
]].hBtn
, FALSE
);
820 for (i
=0;i
<CALC_WS_COUNT
;i
++) {
821 if (!IsWindowEnabled((HWND
)calc
.cb
[hws
[i
]].hBtn
)) {
822 ShowWindow((HWND
)calc
.cb
[hws
[i
]].hBtn
, SW_SHOWNORMAL
);
823 EnableWindow((HWND
)calc
.cb
[hws
[i
]].hBtn
, TRUE
);
828 CheckMenuItem(menus
[i
], ID_CALC_MS_DEGREES
, MF_CHECKED
);
830 for (i
=1;i
<COUNT_MENUS
;i
++) { // skip the simple Standard calculator mode
831 CheckMenuItem(menus
[i
], ID_CALC_NS_HEX
, (w
== ID_CALC_NS_HEX
? MF_CHECKED
: MF_UNCHECKED
) );
832 CheckMenuItem(menus
[i
], ID_CALC_NS_DEC
, (w
== ID_CALC_NS_DEC
? MF_CHECKED
: MF_UNCHECKED
) );
833 CheckMenuItem(menus
[i
], ID_CALC_NS_OCT
, (w
== ID_CALC_NS_OCT
? MF_CHECKED
: MF_UNCHECKED
) );
834 CheckMenuItem(menus
[i
], ID_CALC_NS_BIN
, (w
== ID_CALC_NS_BIN
? MF_CHECKED
: MF_UNCHECKED
) );
837 if (wParam
== ID_CALC_NS_DEC
) {
838 SetMenu(hWnd
, menus
[MENU_SCIMS
]);
842 calc
.displayMode
= 0;
843 SetMenu(hWnd
, menus
[MENU_SCIWS
]);
846 calc_buffer_display(&calc
);
850 case ID_CALC_MS_DEGREES
:
851 case ID_CALC_MS_RADIANS
:
852 case ID_CALC_MS_GRADS
:
855 int w
= LOWORD(wParam
);
857 if (w
== ID_CALC_MS_DEGREES
)
858 calc
.trigMode
= TRIGMODE_DEGREES
;
859 else if (w
== ID_CALC_MS_RADIANS
)
860 calc
.trigMode
= TRIGMODE_RADIANS
;
861 else if (w
== ID_CALC_MS_GRADS
)
862 calc
.trigMode
= TRIGMODE_GRADS
;
866 for (i
=0;i
<CALC_MS_COUNT
;i
++)
867 SendMessage(calc
.cb
[64+i
].hBtn
, BM_SETCHECK
, w
== (ID_CALC_MS_DEGREES
+ i
) ? 1 : 0, 0);
869 for (i
=1;i
<COUNT_MENUS
;i
++) { // skip the simple Standard calculator mode
870 CheckMenuItem(menus
[i
], ID_CALC_MS_DEGREES
, (wParam
== ID_CALC_MS_DEGREES
) ? MF_CHECKED
: MF_UNCHECKED
);
871 CheckMenuItem(menus
[i
], ID_CALC_MS_RADIANS
, (wParam
== ID_CALC_MS_RADIANS
) ? MF_CHECKED
: MF_UNCHECKED
);
872 CheckMenuItem(menus
[i
], ID_CALC_MS_GRADS
, (wParam
== ID_CALC_MS_GRADS
) ? MF_CHECKED
: MF_UNCHECKED
);
879 case ID_CALC_WS_QWORD
:
880 case ID_CALC_WS_DWORD
:
881 case ID_CALC_WS_WORD
:
882 case ID_CALC_WS_BYTE
:
885 int w
= LOWORD(wParam
);
889 for (i
=0;i
<CALC_WS_COUNT
;i
++)
890 SendMessage(calc
.cb
[69+i
].hBtn
, BM_SETCHECK
, LOWORD(wParam
) == (ID_CALC_WS_QWORD
+ i
) ? 1 : 0, 0);
892 for (i
=1; i
<COUNT_MENUS
; i
++) { // skip the simple Standard calculator mode
893 CheckMenuItem(menus
[i
], ID_CALC_WS_QWORD
, (w
== ID_CALC_WS_QWORD
? MF_CHECKED
: MF_UNCHECKED
) );
894 CheckMenuItem(menus
[i
], ID_CALC_WS_DWORD
, (w
== ID_CALC_WS_DWORD
? MF_CHECKED
: MF_UNCHECKED
) );
895 CheckMenuItem(menus
[i
], ID_CALC_WS_WORD
, (w
== ID_CALC_WS_WORD
? MF_CHECKED
: MF_UNCHECKED
) );
896 CheckMenuItem(menus
[i
], ID_CALC_WS_BYTE
, (w
== ID_CALC_WS_BYTE
? MF_CHECKED
: MF_UNCHECKED
) );
909 SendMessage(calc
.cb
[67].hBtn
, BM_SETCHECK
, calc
.invMode
? TRUE
: FALSE
, 0);
919 SendMessage(calc
.cb
[68].hBtn
, BM_SETCHECK
, calc
.hypMode
? TRUE
: FALSE
, 0);
924 if (HIWORD(wParam
) == BN_CLICKED
) {
927 LOWORD(wParam
) != ID_CALC_CLEAR_ENTRY
&&
928 LOWORD(wParam
) != ID_CALC_CLEAR_ALL
) {
937 switch (LOWORD(wParam
)) {
949 SendMessage(hWnd
, WM_CHAR
, LOWORD(wParam
)+TEXT('0') , lParam
);
953 SendMessage(hWnd
, WM_CHAR
, TEXT('a'), lParam
);
957 SendMessage(hWnd
, WM_CHAR
, TEXT('b'), lParam
);
961 SendMessage(hWnd
, WM_CHAR
, TEXT('c'), lParam
);
965 SendMessage(hWnd
, WM_CHAR
, TEXT('d'), lParam
);
969 SendMessage(hWnd
, WM_CHAR
, TEXT('e'), lParam
);
973 SendMessage(hWnd
, WM_CHAR
, TEXT('f'), lParam
);
976 case ID_CALC_DECIMAL
:
977 SendMessage(hWnd
, WM_CHAR
, TEXT('.'), lParam
);
980 case ID_CALC_BACKSPACE
:
981 SendMessage(hWnd
, WM_CHAR
, TEXT('\b'), lParam
);
984 case ID_CALC_CLEAR_ENTRY
:
985 SendMessage(hWnd
, WM_KEYDOWN
, VK_DELETE
, lParam
);
988 case ID_CALC_CLEAR_ALL
:
989 SendMessage(hWnd
, WM_CHAR
, TEXT('\x1b'), lParam
);
992 case ID_CALC_MEM_CLEAR
:
993 SendMessage(hWnd
, WM_CHAR
, 0x0c, lParam
);
996 case ID_CALC_MEM_RECALL
:
997 SendMessage(hWnd
, WM_CHAR
, 0x12, lParam
);
1000 case ID_CALC_MEM_STORE
:
1001 SendMessage(hWnd
, WM_CHAR
, 0x0d, NUMBER_OF_THE_BEAST
); // trying to tell between Return and Ctrl+M
1004 case ID_CALC_MEM_PLUS
:
1005 SendMessage(hWnd
, WM_CHAR
, 0x10, lParam
);
1009 SendMessage(hWnd
, WM_CHAR
, TEXT('?'), lParam
); // this is not a wincalc keystroke
1012 case ID_CALC_SQUARE
:
1013 SendMessage(hWnd
, WM_CHAR
, TEXT('@'), lParam
);
1017 SendMessage(hWnd
, WM_CHAR
, TEXT('p'), lParam
);
1021 SendMessage(hWnd
, WM_CHAR
, TEXT('n'), lParam
);
1025 SendMessage(hWnd
, WM_CHAR
, TEXT('l'), lParam
);
1029 SendMessage(hWnd
, WM_CHAR
, TEXT('#'), lParam
);
1033 SendMessage(hWnd
, WM_CHAR
, TEXT('y'), lParam
);
1037 SendMessage(hWnd
, WM_CHAR
, TEXT('s'), lParam
);
1041 SendMessage(hWnd
, WM_CHAR
, TEXT('o'), lParam
);
1045 SendMessage(hWnd
, WM_CHAR
, TEXT('t'), lParam
);
1049 SendMessage(hWnd
, WM_CHAR
, TEXT('<'), lParam
);
1053 SendMessage(hWnd
, WM_CHAR
, TEXT('~'), lParam
);
1057 SendMessage(hWnd
, WM_CHAR
, TEXT('&'), lParam
);
1061 SendMessage(hWnd
, WM_CHAR
, TEXT('|'), lParam
);
1065 SendMessage(hWnd
, WM_CHAR
, TEXT('^'), lParam
);
1069 SendMessage(hWnd
, WM_CHAR
, TEXT(';'), lParam
);
1072 case ID_CALC_FACTORIAL
:
1073 SendMessage(hWnd
, WM_CHAR
, TEXT('!'), lParam
);
1076 case ID_CALC_RECIPROCAL
:
1077 SendMessage(hWnd
, WM_CHAR
, TEXT('r'), lParam
);
1081 SendMessage(hWnd
, WM_KEYDOWN
, VK_F9
, lParam
);
1085 SendMessage(hWnd
, WM_CHAR
, TEXT('+'), lParam
);
1089 SendMessage(hWnd
, WM_CHAR
, TEXT('-'), lParam
);
1092 case ID_CALC_MULTIPLY
:
1093 SendMessage(hWnd
, WM_CHAR
, TEXT('*'), lParam
);
1096 case ID_CALC_DIVIDE
:
1097 SendMessage(hWnd
, WM_CHAR
, TEXT('/'), lParam
);
1100 case ID_CALC_EQUALS
:
1101 SendMessage(hWnd
, WM_CHAR
, TEXT('='), lParam
);
1104 case ID_CALC_PERCENT
:
1105 SendMessage(hWnd
, WM_CHAR
, TEXT('%'), lParam
);
1109 SendMessage(hWnd
, WM_CHAR
, TEXT('x'), lParam
);
1113 SendMessage(hWnd
, WM_CHAR
, TEXT('v'), lParam
);
1116 case ID_CALC_LEFTPAREN
:
1117 SendMessage(hWnd
, WM_CHAR
, TEXT('('), lParam
);
1120 case ID_CALC_RIGHTPAREN
:
1121 SendMessage(hWnd
, WM_CHAR
, TEXT(')'), lParam
);
1125 SendMessage(hWnd
, WM_CHAR
, TEXT('%'), lParam
);
1129 SendMessage(hWnd
, WM_KEYDOWN
, VK_INSERT
, lParam
);
1133 SendMessage(hWnd
, WM_CHAR
, TEXT('\x01'), lParam
); // Ctrl+A
1137 SendMessage(hWnd
, WM_CHAR
, TEXT('\x04'), lParam
); // Ctrl+D
1141 SendMessage(hWnd
, WM_CHAR
, TEXT('\x13'), lParam
); // Ctrl+S
1145 SendMessage(hWnd
, WM_CHAR
, TEXT('\x14'), lParam
); // Ctrl+T
1149 SendMessage(hWnd
, WM_CHAR
, TEXT('m'), lParam
);
1155 } // button message switch
1161 show_debug(&calc
, TEXT("After WM_CHAR"), wParam
, lParam
);
1166 } // WM_COMMAND switch
1167 } // Main Message switch
1168 return( DefWindowProc( hWnd
, msg
, wParam
, lParam
));
1175 // initialize keys lut for validating keystrokes in various number bases
1177 for (i
=TEXT('0');i
<=TEXT('9');i
++) {
1178 keys
[NBASE_HEX
][i
] = 1;
1179 keys
[NBASE_DECIMAL
][i
] = 1;
1182 keys
[NBASE_OCTAL
][i
] = 1;
1185 keys
[NBASE_BINARY
][i
] = 1;
1188 for (i
=TEXT('a');i
<=TEXT('f');i
++)
1189 keys
[NBASE_HEX
][i
] = 1;
1191 for (i
=TEXT('A');i
<=TEXT('F');i
++)
1192 keys
[NBASE_HEX
][i
] = 1;
1195 void InitMenus(HINSTANCE hInst
)
1197 if (!(menus
[MENU_STD
] = LoadMenu(hInst
,TEXT("MAIN_MENU"))))
1200 if (!(menus
[MENU_SCIMS
] = LoadMenu(hInst
,TEXT("SCIMS_MENU"))))
1203 if (!(menus
[MENU_SCIWS
] = LoadMenu(hInst
,TEXT("SCIWS_MENU"))))
1206 CheckMenuItem(menus
[MENU_STD
], IDM_MODE_STANDARD
, MF_CHECKED
);
1207 if (calc
.digitGrouping
) {
1208 CheckMenuItem(menus
[MENU_STD
], IDM_DIGIT_GROUPING
, MF_CHECKED
);
1209 CheckMenuItem(menus
[MENU_SCIMS
], IDM_DIGIT_GROUPING
, MF_CHECKED
);
1210 CheckMenuItem(menus
[MENU_SCIWS
], IDM_DIGIT_GROUPING
, MF_CHECKED
);
1213 calc_setmenuitem_radio(menus
[MENU_STD
], IDM_MODE_STANDARD
);
1214 calc_setmenuitem_radio(menus
[MENU_STD
], IDM_MODE_SCIENTIFIC
);
1217 calc_setmenuitem_radio(menus
[MENU_SCIMS
], IDM_MODE_STANDARD
);
1218 calc_setmenuitem_radio(menus
[MENU_SCIMS
], IDM_MODE_SCIENTIFIC
);
1220 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_NS_HEX
);
1221 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_NS_DEC
);
1222 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_NS_OCT
);
1223 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_NS_BIN
);
1225 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_MS_DEGREES
);
1226 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_MS_RADIANS
);
1227 calc_setmenuitem_radio(menus
[MENU_SCIMS
], ID_CALC_MS_GRADS
);
1228 CheckMenuItem(menus
[MENU_SCIMS
], IDM_MODE_SCIENTIFIC
, MF_CHECKED
);
1229 CheckMenuItem(menus
[MENU_SCIMS
], ID_CALC_NS_DEC
, MF_CHECKED
);
1230 CheckMenuItem(menus
[MENU_SCIMS
], ID_CALC_MS_DEGREES
, MF_CHECKED
);
1233 calc_setmenuitem_radio(menus
[MENU_SCIWS
], IDM_MODE_STANDARD
);
1234 calc_setmenuitem_radio(menus
[MENU_SCIWS
], IDM_MODE_SCIENTIFIC
);
1236 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_NS_HEX
);
1237 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_NS_DEC
);
1238 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_NS_OCT
);
1239 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_NS_BIN
);
1241 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_WS_QWORD
);
1242 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_WS_DWORD
);
1243 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_WS_WORD
);
1244 calc_setmenuitem_radio(menus
[MENU_SCIWS
], ID_CALC_WS_BYTE
);
1245 CheckMenuItem(menus
[MENU_SCIWS
], IDM_MODE_SCIENTIFIC
, MF_CHECKED
);
1246 CheckMenuItem(menus
[MENU_SCIWS
], ID_CALC_NS_DEC
, MF_CHECKED
);
1247 CheckMenuItem(menus
[MENU_SCIWS
], ID_CALC_WS_QWORD
, MF_CHECKED
);
1250 void InitCalc (CALC
*calc
)
1257 HINSTANCE hInst
= calc
->hInst
;
1258 HFONT hFont
= GetStockObject(DEFAULT_GUI_FONT
);
1260 calc
->trigMode
= TRIGMODE_DEGREES
;
1261 calc
->numBase
= NBASE_DECIMAL
;
1268 calc
->displayMode
= 0;
1269 calc
->buffer
[0] = TEXT('\0');
1270 _tcscpy(calc
->display
, TEXT("0."));
1273 calc
->next
= TEXT('\0');
1275 calc
->wordSize
= WORDSIZE_QWORD
;
1280 if (calc
->sciMode
) {
1281 calc
->numButtons
= CALC_BUTTONS_STANDARD
;
1285 skipx
= MARGIN_LEFT
;
1286 skipy
= CALC_STANDARD_MARGIN_TOP
+ CALC_EDIT_HEIGHT
;
1289 _tcscpy(calc
->cb
[0].label
,TEXT("FILLER"));
1290 calc
->cb
[0].color
= CALC_COLOR_BLUE
;
1291 calc
->cb
[0].r
.left
= skipx
+ 4;
1292 calc
->cb
[0].r
.top
= skipy
+ 2;
1293 calc
->cb
[0].r
.right
= skipx
+ SZ_FILLER_X
- 2;
1294 calc
->cb
[0].r
.bottom
= skipy
+ SZ_FILLER_Y
- 2;
1295 calc
->cb
[0].enable
= 1;
1297 skipx
= SZ_FILLER_X
+ MARGIN_STANDARD_BIG_X
+ 11;
1299 calc
->cb
[1].id
= ID_CALC_BACKSPACE
;
1300 LoadString( hInst
, IDS_BTN_BACKSPACE
, calc
->cb
[1].label
, sizeof(calc
->cb
[1].label
) / sizeof(calc
->cb
[1].label
[0]));
1301 calc
->cb
[1].color
= CALC_COLOR_RED
;
1302 calc
->cb
[1].r
.left
= skipx
;
1303 calc
->cb
[1].r
.top
= skipy
;
1304 calc
->cb
[1].r
.right
= SZ_BIGBTN_X
;
1305 calc
->cb
[1].r
.bottom
= SZ_BIGBTN_Y
;
1306 calc
->cb
[1].enable
= 1;
1308 skipx
+= SZ_BIGBTN_X
+ MARGIN_SMALL_X
;
1310 calc
->cb
[2].id
= ID_CALC_CLEAR_ENTRY
;
1311 LoadString( hInst
, IDS_BTN_CLEAR_ENTRY
, calc
->cb
[2].label
, sizeof(calc
->cb
[2].label
) / sizeof(calc
->cb
[2].label
[0]));
1312 calc
->cb
[2].color
= CALC_COLOR_RED
;
1313 calc
->cb
[2].r
.left
= skipx
;
1314 calc
->cb
[2].r
.top
= skipy
;
1315 calc
->cb
[2].r
.right
= SZ_BIGBTN_X
;
1316 calc
->cb
[2].r
.bottom
= SZ_BIGBTN_Y
;
1317 calc
->cb
[2].enable
= 1;
1319 skipx
+= SZ_BIGBTN_X
+ MARGIN_SMALL_X
;
1321 calc
->cb
[3].id
= ID_CALC_CLEAR_ALL
;
1322 LoadString( hInst
, IDS_BTN_CLEAR_ALL
, calc
->cb
[3].label
, sizeof(calc
->cb
[3].label
) / sizeof(calc
->cb
[3].label
[0]));
1323 calc
->cb
[3].color
= CALC_COLOR_RED
;
1324 calc
->cb
[3].r
.left
= skipx
;
1325 calc
->cb
[3].r
.top
= skipy
;
1326 calc
->cb
[3].r
.right
= SZ_BIGBTN_X
;
1327 calc
->cb
[3].r
.bottom
= SZ_BIGBTN_Y
;
1328 calc
->cb
[3].enable
= 1;
1332 skipx
= MARGIN_LEFT
;
1333 skipy
+= SZ_BIGBTN_Y
+ MARGIN_BIG_Y
;
1335 calc
->cb
[4].id
= ID_CALC_MEM_CLEAR
;
1336 LoadString( hInst
, IDS_BTN_MEM_CLEAR
, calc
->cb
[4].label
, sizeof(calc
->cb
[4].label
) / sizeof(calc
->cb
[4].label
[0]));
1337 calc
->cb
[4].color
= CALC_COLOR_RED
;
1338 calc
->cb
[4].r
.left
= skipx
;
1339 calc
->cb
[4].r
.top
= skipy
;
1340 calc
->cb
[4].r
.right
= SZ_MEDBTN_X
;
1341 calc
->cb
[4].r
.bottom
= SZ_MEDBTN_Y
;
1342 calc
->cb
[4].enable
= 1;
1344 skipx
+= SZ_MEDBTN_X
+ MARGIN_STANDARD_BIG_X
;
1346 calc
->cb
[5].id
= ID_CALC_SEVEN
;
1347 _tcscpy(calc
->cb
[5].label
,TEXT("7"));
1348 calc
->cb
[5].color
= CALC_COLOR_BLUE
;
1349 calc
->cb
[5].r
.left
= skipx
;
1350 calc
->cb
[5].r
.top
= skipy
;
1351 calc
->cb
[5].r
.right
= SZ_MEDBTN_X
;
1352 calc
->cb
[5].r
.bottom
= SZ_MEDBTN_Y
;
1353 calc
->cb
[5].enable
= 1;
1355 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1357 calc
->cb
[6].id
= ID_CALC_EIGHT
;
1358 _tcscpy(calc
->cb
[6].label
,TEXT("8"));
1359 calc
->cb
[6].color
= CALC_COLOR_BLUE
;
1360 calc
->cb
[6].r
.left
= skipx
;
1361 calc
->cb
[6].r
.top
= skipy
;
1362 calc
->cb
[6].r
.right
= SZ_MEDBTN_X
;
1363 calc
->cb
[6].r
.bottom
= SZ_MEDBTN_Y
;
1364 calc
->cb
[6].enable
= 1;
1366 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1368 calc
->cb
[7].id
= ID_CALC_NINE
;
1369 _tcscpy(calc
->cb
[7].label
,TEXT("9"));
1370 calc
->cb
[7].color
= CALC_COLOR_BLUE
;
1371 calc
->cb
[7].r
.left
= skipx
;
1372 calc
->cb
[7].r
.top
= skipy
;
1373 calc
->cb
[7].r
.right
= SZ_MEDBTN_X
;
1374 calc
->cb
[7].r
.bottom
= SZ_MEDBTN_Y
;
1375 calc
->cb
[7].enable
= 1;
1377 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1379 calc
->cb
[8].id
= ID_CALC_DIVIDE
;
1380 _tcscpy(calc
->cb
[8].label
,TEXT("/"));
1381 calc
->cb
[8].color
= CALC_COLOR_RED
;
1382 calc
->cb
[8].r
.left
= skipx
;
1383 calc
->cb
[8].r
.top
= skipy
;
1384 calc
->cb
[8].r
.right
= SZ_MEDBTN_X
;
1385 calc
->cb
[8].r
.bottom
= SZ_MEDBTN_Y
;
1386 calc
->cb
[8].enable
= 1;
1388 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1390 calc
->cb
[9].id
= ID_CALC_SQRT
;
1391 LoadString( hInst
, IDS_BTN_SQRT
, calc
->cb
[9].label
, sizeof(calc
->cb
[9].label
) / sizeof(calc
->cb
[9].label
[0]));
1392 calc
->cb
[9].color
= CALC_COLOR_BLUE
;
1393 calc
->cb
[9].r
.left
= skipx
;
1394 calc
->cb
[9].r
.top
= skipy
;
1395 calc
->cb
[9].r
.right
= SZ_MEDBTN_X
;
1396 calc
->cb
[9].r
.bottom
= SZ_MEDBTN_Y
;
1397 calc
->cb
[9].enable
= 1;
1401 skipx
= MARGIN_LEFT
;
1402 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1404 calc
->cb
[10].id
= ID_CALC_MEM_RECALL
;
1405 LoadString( hInst
, IDS_BTN_MEM_RECALL
, calc
->cb
[10].label
, sizeof(calc
->cb
[10].label
) / sizeof(calc
->cb
[10].label
[0]));
1406 calc
->cb
[10].color
= CALC_COLOR_RED
;
1407 calc
->cb
[10].r
.left
= skipx
;
1408 calc
->cb
[10].r
.top
= skipy
;
1409 calc
->cb
[10].r
.right
= SZ_MEDBTN_X
;
1410 calc
->cb
[10].r
.bottom
= SZ_MEDBTN_Y
;
1411 calc
->cb
[10].enable
= 1;
1413 skipx
+= SZ_MEDBTN_X
+ MARGIN_STANDARD_BIG_X
;
1415 calc
->cb
[11].id
= ID_CALC_FOUR
;
1416 _tcscpy(calc
->cb
[11].label
,TEXT("4"));
1417 calc
->cb
[11].color
= CALC_COLOR_BLUE
;
1418 calc
->cb
[11].r
.left
= skipx
;
1419 calc
->cb
[11].r
.top
= skipy
;
1420 calc
->cb
[11].r
.right
= SZ_MEDBTN_X
;
1421 calc
->cb
[11].r
.bottom
= SZ_MEDBTN_Y
;
1422 calc
->cb
[11].enable
= 1;
1424 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1426 calc
->cb
[12].id
= ID_CALC_FIVE
;
1427 _tcscpy(calc
->cb
[12].label
,TEXT("5"));
1428 calc
->cb
[12].color
= CALC_COLOR_BLUE
;
1429 calc
->cb
[12].r
.left
= skipx
;
1430 calc
->cb
[12].r
.top
= skipy
;
1431 calc
->cb
[12].r
.right
= SZ_MEDBTN_X
;
1432 calc
->cb
[12].r
.bottom
= SZ_MEDBTN_Y
;
1433 calc
->cb
[12].enable
= 1;
1435 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1437 calc
->cb
[13].id
= ID_CALC_SIX
;
1438 _tcscpy(calc
->cb
[13].label
,TEXT("6"));
1439 calc
->cb
[13].color
= CALC_COLOR_BLUE
;
1440 calc
->cb
[13].r
.left
= skipx
;
1441 calc
->cb
[13].r
.top
= skipy
;
1442 calc
->cb
[13].r
.right
= SZ_MEDBTN_X
;
1443 calc
->cb
[13].r
.bottom
= SZ_MEDBTN_Y
;
1444 calc
->cb
[13].enable
= 1;
1446 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1448 calc
->cb
[14].id
= ID_CALC_MULTIPLY
;
1449 _tcscpy(calc
->cb
[14].label
,TEXT("*"));
1450 calc
->cb
[14].color
= CALC_COLOR_RED
;
1451 calc
->cb
[14].r
.left
= skipx
;
1452 calc
->cb
[14].r
.top
= skipy
;
1453 calc
->cb
[14].r
.right
= SZ_MEDBTN_X
;
1454 calc
->cb
[14].r
.bottom
= SZ_MEDBTN_Y
;
1455 calc
->cb
[14].enable
= 1;
1457 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1459 calc
->cb
[15].id
= ID_CALC_PERCENT
;
1460 _tcscpy(calc
->cb
[15].label
,TEXT("%"));
1461 calc
->cb
[15].color
= CALC_COLOR_BLUE
;
1462 calc
->cb
[15].r
.left
= skipx
;
1463 calc
->cb
[15].r
.top
= skipy
;
1464 calc
->cb
[15].r
.right
= SZ_MEDBTN_X
;
1465 calc
->cb
[15].r
.bottom
= SZ_MEDBTN_Y
;
1466 calc
->cb
[15].enable
= 1;
1470 skipx
= MARGIN_LEFT
;
1471 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1473 calc
->cb
[16].id
= ID_CALC_MEM_STORE
;
1474 LoadString( hInst
, IDS_BTN_MEM_STORE
, calc
->cb
[16].label
, sizeof(calc
->cb
[16].label
) / sizeof(calc
->cb
[16].label
[0]));
1475 calc
->cb
[16].color
= CALC_COLOR_RED
;
1476 calc
->cb
[16].r
.left
= skipx
;
1477 calc
->cb
[16].r
.top
= skipy
;
1478 calc
->cb
[16].r
.right
= SZ_MEDBTN_X
;
1479 calc
->cb
[16].r
.bottom
= SZ_MEDBTN_Y
;
1480 calc
->cb
[16].enable
= 1;
1482 skipx
+= SZ_MEDBTN_X
+ MARGIN_STANDARD_BIG_X
;
1484 calc
->cb
[17].id
= ID_CALC_ONE
;
1485 _tcscpy(calc
->cb
[17].label
,TEXT("1"));
1486 calc
->cb
[17].color
= CALC_COLOR_BLUE
;
1487 calc
->cb
[17].r
.left
= skipx
;
1488 calc
->cb
[17].r
.top
= skipy
;
1489 calc
->cb
[17].r
.right
= SZ_MEDBTN_X
;
1490 calc
->cb
[17].r
.bottom
= SZ_MEDBTN_Y
;
1491 calc
->cb
[17].enable
= 1;
1493 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1495 calc
->cb
[18].id
= ID_CALC_TWO
;
1496 _tcscpy(calc
->cb
[18].label
,TEXT("2"));
1497 calc
->cb
[18].color
= CALC_COLOR_BLUE
;
1498 calc
->cb
[18].r
.left
= skipx
;
1499 calc
->cb
[18].r
.top
= skipy
;
1500 calc
->cb
[18].r
.right
= SZ_MEDBTN_X
;
1501 calc
->cb
[18].r
.bottom
= SZ_MEDBTN_Y
;
1502 calc
->cb
[18].enable
= 1;
1504 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1506 calc
->cb
[19].id
= ID_CALC_THREE
;
1507 _tcscpy(calc
->cb
[19].label
,TEXT("3"));
1508 calc
->cb
[19].color
= CALC_COLOR_BLUE
;
1509 calc
->cb
[19].r
.left
= skipx
;
1510 calc
->cb
[19].r
.top
= skipy
;
1511 calc
->cb
[19].r
.right
= SZ_MEDBTN_X
;
1512 calc
->cb
[19].r
.bottom
= SZ_MEDBTN_Y
;
1513 calc
->cb
[19].enable
= 1;
1515 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1517 calc
->cb
[20].id
= ID_CALC_MINUS
;
1518 _tcscpy(calc
->cb
[20].label
,TEXT("-"));
1519 calc
->cb
[20].color
= CALC_COLOR_RED
;
1520 calc
->cb
[20].r
.left
= skipx
;
1521 calc
->cb
[20].r
.top
= skipy
;
1522 calc
->cb
[20].r
.right
= SZ_MEDBTN_X
;
1523 calc
->cb
[20].r
.bottom
= SZ_MEDBTN_Y
;
1524 calc
->cb
[20].enable
= 1;
1526 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1528 calc
->cb
[21].id
= ID_CALC_RECIPROCAL
;
1529 _tcscpy(calc
->cb
[21].label
,TEXT("1/x"));
1530 calc
->cb
[21].color
= CALC_COLOR_RED
;
1531 calc
->cb
[21].r
.left
= skipx
;
1532 calc
->cb
[21].r
.top
= skipy
;
1533 calc
->cb
[21].r
.right
= SZ_MEDBTN_X
;
1534 calc
->cb
[21].r
.bottom
= SZ_MEDBTN_Y
;
1535 calc
->cb
[21].enable
= 1;
1539 skipx
= MARGIN_LEFT
;
1540 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1542 calc
->cb
[22].id
= ID_CALC_MEM_PLUS
;
1543 LoadString( hInst
, IDS_BTN_MEM_PLUS
, calc
->cb
[22].label
, sizeof(calc
->cb
[22].label
) / sizeof(calc
->cb
[22].label
[0]));
1544 calc
->cb
[22].color
= CALC_COLOR_RED
;
1545 calc
->cb
[22].r
.left
= skipx
;
1546 calc
->cb
[22].r
.top
= skipy
;
1547 calc
->cb
[22].r
.right
= SZ_MEDBTN_X
;
1548 calc
->cb
[22].r
.bottom
= SZ_MEDBTN_Y
;
1549 calc
->cb
[22].enable
= 1;
1551 skipx
+= SZ_MEDBTN_X
+ MARGIN_STANDARD_BIG_X
;
1553 calc
->cb
[23].id
= ID_CALC_ZERO
;
1554 _tcscpy(calc
->cb
[23].label
,TEXT("0"));
1555 calc
->cb
[23].color
= CALC_COLOR_BLUE
;
1556 calc
->cb
[23].r
.left
= skipx
;
1557 calc
->cb
[23].r
.top
= skipy
;
1558 calc
->cb
[23].r
.right
= SZ_MEDBTN_X
;
1559 calc
->cb
[23].r
.bottom
= SZ_MEDBTN_Y
;
1560 calc
->cb
[23].enable
= 1;
1562 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1564 calc
->cb
[24].id
= ID_CALC_SIGN
;
1565 _tcscpy(calc
->cb
[24].label
,TEXT("+/-"));
1566 calc
->cb
[24].color
= CALC_COLOR_RED
;
1567 calc
->cb
[24].r
.left
= skipx
;
1568 calc
->cb
[24].r
.top
= skipy
;
1569 calc
->cb
[24].r
.right
= SZ_MEDBTN_X
;
1570 calc
->cb
[24].r
.bottom
= SZ_MEDBTN_Y
;
1571 calc
->cb
[24].enable
= 1;
1573 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1575 calc
->cb
[25].id
= ID_CALC_DECIMAL
;
1576 _tcscpy(calc
->cb
[25].label
,TEXT("."));
1577 calc
->cb
[25].color
= CALC_COLOR_BLUE
;
1578 calc
->cb
[25].r
.left
= skipx
;
1579 calc
->cb
[25].r
.top
= skipy
;
1580 calc
->cb
[25].r
.right
= SZ_MEDBTN_X
;
1581 calc
->cb
[25].r
.bottom
= SZ_MEDBTN_Y
;
1582 calc
->cb
[25].enable
= 1;
1584 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1586 calc
->cb
[26].id
= ID_CALC_PLUS
;
1587 _tcscpy(calc
->cb
[26].label
,TEXT("+"));
1588 calc
->cb
[26].color
= CALC_COLOR_RED
;
1589 calc
->cb
[26].r
.left
= skipx
;
1590 calc
->cb
[26].r
.top
= skipy
;
1591 calc
->cb
[26].r
.right
= SZ_MEDBTN_X
;
1592 calc
->cb
[26].r
.bottom
= SZ_MEDBTN_Y
;
1593 calc
->cb
[26].enable
= 1;
1595 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1597 calc
->cb
[27].id
= ID_CALC_EQUALS
;
1598 _tcscpy(calc
->cb
[27].label
,TEXT("="));
1599 calc
->cb
[27].color
= CALC_COLOR_RED
;
1600 calc
->cb
[27].r
.left
= skipx
;
1601 calc
->cb
[27].r
.top
= skipy
;
1602 calc
->cb
[27].r
.right
= SZ_MEDBTN_X
;
1603 calc
->cb
[27].r
.bottom
= SZ_MEDBTN_Y
;
1604 calc
->cb
[27].enable
= 1;
1607 calc
->numButtons
= CALC_BUTTONS_SCIENTIFIC
;
1611 skipx
= MARGIN_LEFT
;
1612 skipy
= CALC_SCIENTIFIC_MARGIN_TOP
+ CALC_EDIT_HEIGHT
- 1;
1615 _tcscpy(calc
->cb
[0].label
,TEXT("FILLER"));
1616 calc
->cb
[0].color
= CALC_COLOR_BLUE
;
1617 calc
->cb
[0].r
.left
= skipx
+ 4 * SZ_MEDBTN_X
+ 2 * SZ_SPACER_X
+ 2 * MARGIN_SMALL_X
+ 12;
1618 calc
->cb
[0].r
.top
= skipy
;
1619 calc
->cb
[0].r
.right
= skipx
+ 4 * SZ_MEDBTN_X
+ 2 * SZ_SPACER_X
+ 2 * MARGIN_SMALL_X
+ SZ_FILLER_X
+ 4;
1620 calc
->cb
[0].r
.bottom
= skipy
+ SZ_FILLER_Y
- 6;
1621 calc
->cb
[0].enable
= 1;
1624 _tcscpy(calc
->cb
[1].label
,TEXT("FILLER"));
1625 calc
->cb
[1].color
= CALC_COLOR_BLUE
;
1626 calc
->cb
[1].r
.left
= skipx
+ 3 * SZ_MEDBTN_X
+ SZ_SPACER_X
+ 2 * MARGIN_SMALL_X
+ 8;
1627 calc
->cb
[1].r
.top
= skipy
;
1628 calc
->cb
[1].r
.right
= skipx
+ 3 * SZ_MEDBTN_X
+ SZ_SPACER_X
+ 2 * MARGIN_SMALL_X
+ SZ_FILLER_X
+ 0;
1629 calc
->cb
[1].r
.bottom
= skipy
+ SZ_FILLER_Y
- 6;
1630 calc
->cb
[1].enable
= 1;
1632 skipx
+= SZ_FILLER_X
+ MARGIN_SMALL_X
;
1634 skipx
= MARGIN_BIG_X
;
1636 calc
->cb
[2].id
= ID_CALC_BACKSPACE
;
1637 LoadString( hInst
, IDS_BTN_BACKSPACE
, calc
->cb
[2].label
, sizeof(calc
->cb
[2].label
) / sizeof(calc
->cb
[2].label
[0]));
1638 calc
->cb
[2].color
= CALC_COLOR_RED
;
1639 calc
->cb
[2].r
.left
= skipx
;
1640 calc
->cb
[2].r
.top
= skipy
;
1641 calc
->cb
[2].r
.right
= SZ_BIGBTN_X
;
1642 calc
->cb
[2].r
.bottom
= SZ_BIGBTN_Y
;
1643 calc
->cb
[2].enable
= 1;
1645 skipx
+= SZ_BIGBTN_X
+ MARGIN_SMALL_X
;
1647 calc
->cb
[3].id
= ID_CALC_CLEAR_ENTRY
;
1648 LoadString( hInst
, IDS_BTN_CLEAR_ENTRY
, calc
->cb
[3].label
, sizeof(calc
->cb
[3].label
) / sizeof(calc
->cb
[3].label
[0]));
1649 calc
->cb
[3].color
= CALC_COLOR_RED
;
1650 calc
->cb
[3].r
.left
= skipx
;
1651 calc
->cb
[3].r
.top
= skipy
;
1652 calc
->cb
[3].r
.right
= SZ_BIGBTN_X
;
1653 calc
->cb
[3].r
.bottom
= SZ_BIGBTN_Y
;
1654 calc
->cb
[3].enable
= 1;
1656 skipx
+= SZ_BIGBTN_X
+ MARGIN_SMALL_X
;
1658 calc
->cb
[4].id
= ID_CALC_CLEAR_ALL
;
1659 LoadString( hInst
, IDS_BTN_CLEAR_ALL
, calc
->cb
[4].label
, sizeof(calc
->cb
[4].label
) / sizeof(calc
->cb
[4].label
[0]));
1660 calc
->cb
[4].color
= CALC_COLOR_RED
;
1661 calc
->cb
[4].r
.left
= skipx
;
1662 calc
->cb
[4].r
.top
= skipy
;
1663 calc
->cb
[4].r
.right
= SZ_BIGBTN_X
;
1664 calc
->cb
[4].r
.bottom
= SZ_BIGBTN_Y
;
1665 calc
->cb
[4].enable
= 1;
1669 skipx
= MARGIN_LEFT
;
1670 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1672 calc
->cb
[5].id
= ID_CALC_STA
;
1673 _tcscpy(calc
->cb
[5].label
,TEXT("Sta"));
1674 calc
->cb
[5].color
= CALC_COLOR_GRAY
;
1675 calc
->cb
[5].r
.left
= skipx
;
1676 calc
->cb
[5].r
.top
= skipy
;
1677 calc
->cb
[5].r
.right
= SZ_MEDBTN_X
;
1678 calc
->cb
[5].r
.bottom
= SZ_MEDBTN_Y
;
1679 calc
->cb
[5].enable
= 1;
1681 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1683 calc
->cb
[6].id
= ID_CALC_FE
;
1684 _tcscpy(calc
->cb
[6].label
,TEXT("F-E"));
1685 calc
->cb
[6].color
= CALC_COLOR_MAGENTA
;
1686 calc
->cb
[6].r
.left
= skipx
;
1687 calc
->cb
[6].r
.top
= skipy
;
1688 calc
->cb
[6].r
.right
= SZ_MEDBTN_X
;
1689 calc
->cb
[6].r
.bottom
= SZ_MEDBTN_Y
;
1690 calc
->cb
[6].enable
= 1;
1692 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1694 calc
->cb
[7].id
= ID_CALC_LEFTPAREN
;
1695 _tcscpy(calc
->cb
[7].label
,TEXT("("));
1696 calc
->cb
[7].color
= CALC_COLOR_MAGENTA
;
1697 calc
->cb
[7].r
.left
= skipx
;
1698 calc
->cb
[7].r
.top
= skipy
;
1699 calc
->cb
[7].r
.right
= SZ_MEDBTN_X
;
1700 calc
->cb
[7].r
.bottom
= SZ_MEDBTN_Y
;
1701 calc
->cb
[7].enable
= 0;
1703 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1705 calc
->cb
[8].id
= ID_CALC_RIGHTPAREN
;
1706 _tcscpy(calc
->cb
[8].label
,TEXT(")"));
1707 calc
->cb
[8].color
= CALC_COLOR_MAGENTA
;
1708 calc
->cb
[8].r
.left
= skipx
;
1709 calc
->cb
[8].r
.top
= skipy
;
1710 calc
->cb
[8].r
.right
= SZ_MEDBTN_X
;
1711 calc
->cb
[8].r
.bottom
= SZ_MEDBTN_Y
;
1712 calc
->cb
[8].enable
= 0;
1714 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1716 calc
->cb
[9].id
= ID_CALC_MEM_CLEAR
;
1717 LoadString( hInst
, IDS_BTN_MEM_CLEAR
, calc
->cb
[9].label
, sizeof(calc
->cb
[9].label
) / sizeof(calc
->cb
[9].label
[0]));
1718 calc
->cb
[9].color
= CALC_COLOR_RED
;
1719 calc
->cb
[9].r
.left
= skipx
;
1720 calc
->cb
[9].r
.top
= skipy
;
1721 calc
->cb
[9].r
.right
= SZ_MEDBTN_X
;
1722 calc
->cb
[9].r
.bottom
= SZ_MEDBTN_Y
;
1723 calc
->cb
[9].enable
= 1;
1725 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1727 calc
->cb
[10].id
= ID_CALC_SEVEN
;
1728 _tcscpy(calc
->cb
[10].label
,TEXT("7"));
1729 calc
->cb
[10].color
= CALC_COLOR_BLUE
;
1730 calc
->cb
[10].r
.left
= skipx
;
1731 calc
->cb
[10].r
.top
= skipy
;
1732 calc
->cb
[10].r
.right
= SZ_MEDBTN_X
;
1733 calc
->cb
[10].r
.bottom
= SZ_MEDBTN_Y
;
1734 calc
->cb
[10].enable
= 1;
1736 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1738 calc
->cb
[11].id
= ID_CALC_EIGHT
;
1739 _tcscpy(calc
->cb
[11].label
,TEXT("8"));
1740 calc
->cb
[11].color
= CALC_COLOR_BLUE
;
1741 calc
->cb
[11].r
.left
= skipx
;
1742 calc
->cb
[11].r
.top
= skipy
;
1743 calc
->cb
[11].r
.right
= SZ_MEDBTN_X
;
1744 calc
->cb
[11].r
.bottom
= SZ_MEDBTN_Y
;
1745 calc
->cb
[11].enable
= 1;
1747 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1749 calc
->cb
[12].id
= ID_CALC_NINE
;
1750 _tcscpy(calc
->cb
[12].label
,TEXT("9"));
1751 calc
->cb
[12].color
= CALC_COLOR_BLUE
;
1752 calc
->cb
[12].r
.left
= skipx
;
1753 calc
->cb
[12].r
.top
= skipy
;
1754 calc
->cb
[12].r
.right
= SZ_MEDBTN_X
;
1755 calc
->cb
[12].r
.bottom
= SZ_MEDBTN_Y
;
1756 calc
->cb
[12].enable
= 1;
1758 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1760 calc
->cb
[13].id
= ID_CALC_DIVIDE
;
1761 _tcscpy(calc
->cb
[13].label
,TEXT("/"));
1762 calc
->cb
[13].color
= CALC_COLOR_RED
;
1763 calc
->cb
[13].r
.left
= skipx
;
1764 calc
->cb
[13].r
.top
= skipy
;
1765 calc
->cb
[13].r
.right
= SZ_MEDBTN_X
;
1766 calc
->cb
[13].r
.bottom
= SZ_MEDBTN_Y
;
1767 calc
->cb
[13].enable
= 1;
1769 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1771 calc
->cb
[14].id
= ID_CALC_MOD
;
1772 _tcscpy(calc
->cb
[14].label
,TEXT("Mod"));
1773 calc
->cb
[14].color
= CALC_COLOR_RED
;
1774 calc
->cb
[14].r
.left
= skipx
;
1775 calc
->cb
[14].r
.top
= skipy
;
1776 calc
->cb
[14].r
.right
= SZ_MEDBTN_X
;
1777 calc
->cb
[14].r
.bottom
= SZ_MEDBTN_Y
;
1778 calc
->cb
[14].enable
= 1;
1780 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1782 calc
->cb
[15].id
= ID_CALC_AND
;
1783 _tcscpy(calc
->cb
[15].label
,TEXT("And"));
1784 calc
->cb
[15].color
= CALC_COLOR_RED
;
1785 calc
->cb
[15].r
.left
= skipx
;
1786 calc
->cb
[15].r
.top
= skipy
;
1787 calc
->cb
[15].r
.right
= SZ_MEDBTN_X
;
1788 calc
->cb
[15].r
.bottom
= SZ_MEDBTN_Y
;
1789 calc
->cb
[15].enable
= 1;
1793 skipx
= MARGIN_LEFT
;
1794 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1796 calc
->cb
[16].id
= ID_CALC_AVE
;
1797 _tcscpy(calc
->cb
[16].label
,TEXT("Ave"));
1798 calc
->cb
[16].color
= CALC_COLOR_GRAY
;
1799 calc
->cb
[16].r
.left
= skipx
;
1800 calc
->cb
[16].r
.top
= skipy
;
1801 calc
->cb
[16].r
.right
= SZ_MEDBTN_X
;
1802 calc
->cb
[16].r
.bottom
= SZ_MEDBTN_Y
;
1803 calc
->cb
[16].enable
= 0;
1805 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1807 calc
->cb
[17].id
= ID_CALC_DMS
;
1808 _tcscpy(calc
->cb
[17].label
,TEXT("dms"));
1809 calc
->cb
[17].color
= CALC_COLOR_MAGENTA
;
1810 calc
->cb
[17].r
.left
= skipx
;
1811 calc
->cb
[17].r
.top
= skipy
;
1812 calc
->cb
[17].r
.right
= SZ_MEDBTN_X
;
1813 calc
->cb
[17].r
.bottom
= SZ_MEDBTN_Y
;
1814 calc
->cb
[17].enable
= 1;
1816 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1818 calc
->cb
[18].id
= ID_CALC_EXP
;
1819 _tcscpy(calc
->cb
[18].label
,TEXT("Exp"));
1820 calc
->cb
[18].color
= CALC_COLOR_MAGENTA
;
1821 calc
->cb
[18].r
.left
= skipx
;
1822 calc
->cb
[18].r
.top
= skipy
;
1823 calc
->cb
[18].r
.right
= SZ_MEDBTN_X
;
1824 calc
->cb
[18].r
.bottom
= SZ_MEDBTN_Y
;
1825 calc
->cb
[18].enable
= 1;
1827 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1829 calc
->cb
[19].id
= ID_CALC_LN
;
1830 _tcscpy(calc
->cb
[19].label
,TEXT("ln"));
1831 calc
->cb
[19].color
= CALC_COLOR_MAGENTA
;
1832 calc
->cb
[19].r
.left
= skipx
;
1833 calc
->cb
[19].r
.top
= skipy
;
1834 calc
->cb
[19].r
.right
= SZ_MEDBTN_X
;
1835 calc
->cb
[19].r
.bottom
= SZ_MEDBTN_Y
;
1836 calc
->cb
[19].enable
= 1;
1838 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1840 calc
->cb
[20].id
= ID_CALC_MEM_RECALL
;
1841 _tcscpy(calc
->cb
[20].label
,TEXT("MR"));
1842 calc
->cb
[20].color
= CALC_COLOR_RED
;
1843 calc
->cb
[20].r
.left
= skipx
;
1844 calc
->cb
[20].r
.top
= skipy
;
1845 calc
->cb
[20].r
.right
= SZ_MEDBTN_X
;
1846 calc
->cb
[20].r
.bottom
= SZ_MEDBTN_Y
;
1847 calc
->cb
[20].enable
= 1;
1849 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1851 calc
->cb
[21].id
= ID_CALC_FOUR
;
1852 _tcscpy(calc
->cb
[21].label
,TEXT("4"));
1853 calc
->cb
[21].color
= CALC_COLOR_BLUE
;
1854 calc
->cb
[21].r
.left
= skipx
;
1855 calc
->cb
[21].r
.top
= skipy
;
1856 calc
->cb
[21].r
.right
= SZ_MEDBTN_X
;
1857 calc
->cb
[21].r
.bottom
= SZ_MEDBTN_Y
;
1858 calc
->cb
[21].enable
= 1;
1860 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1862 calc
->cb
[22].id
= ID_CALC_FIVE
;
1863 _tcscpy(calc
->cb
[22].label
,TEXT("5"));
1864 calc
->cb
[22].color
= CALC_COLOR_BLUE
;
1865 calc
->cb
[22].r
.left
= skipx
;
1866 calc
->cb
[22].r
.top
= skipy
;
1867 calc
->cb
[22].r
.right
= SZ_MEDBTN_X
;
1868 calc
->cb
[22].r
.bottom
= SZ_MEDBTN_Y
;
1869 calc
->cb
[22].enable
= 1;
1871 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1873 calc
->cb
[23].id
= ID_CALC_SIX
;
1874 _tcscpy(calc
->cb
[23].label
,TEXT("6"));
1875 calc
->cb
[23].color
= CALC_COLOR_BLUE
;
1876 calc
->cb
[23].r
.left
= skipx
;
1877 calc
->cb
[23].r
.top
= skipy
;
1878 calc
->cb
[23].r
.right
= SZ_MEDBTN_X
;
1879 calc
->cb
[23].r
.bottom
= SZ_MEDBTN_Y
;
1880 calc
->cb
[23].enable
= 1;
1882 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1884 calc
->cb
[24].id
= ID_CALC_MULTIPLY
;
1885 _tcscpy(calc
->cb
[24].label
,TEXT("*"));
1886 calc
->cb
[24].color
= CALC_COLOR_RED
;
1887 calc
->cb
[24].r
.left
= skipx
;
1888 calc
->cb
[24].r
.top
= skipy
;
1889 calc
->cb
[24].r
.right
= SZ_MEDBTN_X
;
1890 calc
->cb
[24].r
.bottom
= SZ_MEDBTN_Y
;
1891 calc
->cb
[24].enable
= 1;
1893 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1895 calc
->cb
[25].id
= ID_CALC_OR
;
1896 _tcscpy(calc
->cb
[25].label
,TEXT("Or"));
1897 calc
->cb
[25].color
= CALC_COLOR_RED
;
1898 calc
->cb
[25].r
.left
= skipx
;
1899 calc
->cb
[25].r
.top
= skipy
;
1900 calc
->cb
[25].r
.right
= SZ_MEDBTN_X
;
1901 calc
->cb
[25].r
.bottom
= SZ_MEDBTN_Y
;
1902 calc
->cb
[25].enable
= 1;
1904 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1906 calc
->cb
[26].id
= ID_CALC_XOR
;
1907 _tcscpy(calc
->cb
[26].label
,TEXT("Xor"));
1908 calc
->cb
[26].color
= CALC_COLOR_RED
;
1909 calc
->cb
[26].r
.left
= skipx
;
1910 calc
->cb
[26].r
.top
= skipy
;
1911 calc
->cb
[26].r
.right
= SZ_MEDBTN_X
;
1912 calc
->cb
[26].r
.bottom
= SZ_MEDBTN_Y
;
1913 calc
->cb
[26].enable
= 1;
1917 skipx
= MARGIN_LEFT
;
1918 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
1920 calc
->cb
[27].id
= ID_CALC_SUM
;
1921 _tcscpy(calc
->cb
[27].label
,TEXT("Sum"));
1922 calc
->cb
[27].color
= CALC_COLOR_GRAY
;
1923 calc
->cb
[27].r
.left
= skipx
;
1924 calc
->cb
[27].r
.top
= skipy
;
1925 calc
->cb
[27].r
.right
= SZ_MEDBTN_X
;
1926 calc
->cb
[27].r
.bottom
= SZ_MEDBTN_Y
;
1927 calc
->cb
[27].enable
= 0;
1929 skipx
+= MARGIN_SMALL_X
+ SZ_MEDBTN_X
+ SZ_SPACER_X
;
1931 calc
->cb
[28].id
= ID_CALC_SIN
;
1932 _tcscpy(calc
->cb
[28].label
,TEXT("sin"));
1933 calc
->cb
[28].color
= CALC_COLOR_MAGENTA
;
1934 calc
->cb
[28].r
.left
= skipx
;
1935 calc
->cb
[28].r
.top
= skipy
;
1936 calc
->cb
[28].r
.right
= SZ_MEDBTN_X
;
1937 calc
->cb
[28].r
.bottom
= SZ_MEDBTN_Y
;
1938 calc
->cb
[28].enable
= 1;
1940 skipx
+= MARGIN_SMALL_X
+ SZ_MEDBTN_X
;
1942 calc
->cb
[29].id
= ID_CALC_POWER
;
1943 _tcscpy(calc
->cb
[29].label
,TEXT("x^y"));
1944 calc
->cb
[29].color
= CALC_COLOR_MAGENTA
;
1945 calc
->cb
[29].r
.left
= skipx
;
1946 calc
->cb
[29].r
.top
= skipy
;
1947 calc
->cb
[29].r
.right
= SZ_MEDBTN_X
;
1948 calc
->cb
[29].r
.bottom
= SZ_MEDBTN_Y
;
1949 calc
->cb
[29].enable
= 1;
1951 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1953 calc
->cb
[30].id
= ID_CALC_LOG10
;
1954 _tcscpy(calc
->cb
[30].label
,TEXT("log"));
1955 calc
->cb
[30].color
= CALC_COLOR_MAGENTA
;
1956 calc
->cb
[30].r
.left
= skipx
;
1957 calc
->cb
[30].r
.top
= skipy
;
1958 calc
->cb
[30].r
.right
= SZ_MEDBTN_X
;
1959 calc
->cb
[30].r
.bottom
= SZ_MEDBTN_Y
;
1960 calc
->cb
[30].enable
= 1;
1962 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1964 calc
->cb
[31].id
= ID_CALC_MEM_STORE
;
1965 LoadString( hInst
, IDS_BTN_MEM_STORE
, calc
->cb
[31].label
, sizeof(calc
->cb
[31].label
) / sizeof(calc
->cb
[31].label
[0]));
1966 calc
->cb
[31].color
= CALC_COLOR_RED
;
1967 calc
->cb
[31].r
.left
= skipx
;
1968 calc
->cb
[31].r
.top
= skipy
;
1969 calc
->cb
[31].r
.right
= SZ_MEDBTN_X
;
1970 calc
->cb
[31].r
.bottom
= SZ_MEDBTN_Y
;
1971 calc
->cb
[31].enable
= 1;
1973 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
1975 calc
->cb
[32].id
= ID_CALC_ONE
;
1976 _tcscpy(calc
->cb
[32].label
,TEXT("1"));
1977 calc
->cb
[32].color
= CALC_COLOR_BLUE
;
1978 calc
->cb
[32].r
.left
= skipx
;
1979 calc
->cb
[32].r
.top
= skipy
;
1980 calc
->cb
[32].r
.right
= SZ_MEDBTN_X
;
1981 calc
->cb
[32].r
.bottom
= SZ_MEDBTN_Y
;
1982 calc
->cb
[32].enable
= 1;
1984 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1986 calc
->cb
[33].id
= ID_CALC_TWO
;
1987 _tcscpy(calc
->cb
[33].label
,TEXT("2"));
1988 calc
->cb
[33].color
= CALC_COLOR_BLUE
;
1989 calc
->cb
[33].r
.left
= skipx
;
1990 calc
->cb
[33].r
.top
= skipy
;
1991 calc
->cb
[33].r
.right
= SZ_MEDBTN_X
;
1992 calc
->cb
[33].r
.bottom
= SZ_MEDBTN_Y
;
1993 calc
->cb
[33].enable
= 1;
1995 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
1997 calc
->cb
[34].id
= ID_CALC_THREE
;
1998 _tcscpy(calc
->cb
[34].label
,TEXT("3"));
1999 calc
->cb
[34].color
= CALC_COLOR_BLUE
;
2000 calc
->cb
[34].r
.left
= skipx
;
2001 calc
->cb
[34].r
.top
= skipy
;
2002 calc
->cb
[34].r
.right
= SZ_MEDBTN_X
;
2003 calc
->cb
[34].r
.bottom
= SZ_MEDBTN_Y
;
2004 calc
->cb
[34].enable
= 1;
2006 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2008 calc
->cb
[35].id
= ID_CALC_MINUS
;
2009 _tcscpy(calc
->cb
[35].label
,TEXT("-"));
2010 calc
->cb
[35].color
= CALC_COLOR_RED
;
2011 calc
->cb
[35].r
.left
= skipx
;
2012 calc
->cb
[35].r
.top
= skipy
;
2013 calc
->cb
[35].r
.right
= SZ_MEDBTN_X
;
2014 calc
->cb
[35].r
.bottom
= SZ_MEDBTN_Y
;
2015 calc
->cb
[35].enable
= 1;
2017 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2019 calc
->cb
[36].id
= ID_CALC_LSH
;
2020 _tcscpy(calc
->cb
[36].label
,TEXT("Lsh"));
2021 calc
->cb
[36].color
= CALC_COLOR_RED
;
2022 calc
->cb
[36].r
.left
= skipx
;
2023 calc
->cb
[36].r
.top
= skipy
;
2024 calc
->cb
[36].r
.right
= SZ_MEDBTN_X
;
2025 calc
->cb
[36].r
.bottom
= SZ_MEDBTN_Y
;
2026 calc
->cb
[36].enable
= 1;
2028 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2030 calc
->cb
[37].id
= ID_CALC_NOT
;
2031 _tcscpy(calc
->cb
[37].label
,TEXT("Not"));
2032 calc
->cb
[37].color
= CALC_COLOR_RED
;
2033 calc
->cb
[37].r
.left
= skipx
;
2034 calc
->cb
[37].r
.top
= skipy
;
2035 calc
->cb
[37].r
.right
= SZ_MEDBTN_X
;
2036 calc
->cb
[37].r
.bottom
= SZ_MEDBTN_Y
;
2037 calc
->cb
[37].enable
= 1;
2041 skipx
= MARGIN_LEFT
;
2042 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
2044 calc
->cb
[38].id
= ID_CALC_S
;
2045 _tcscpy(calc
->cb
[38].label
,TEXT("s"));
2046 calc
->cb
[38].color
= CALC_COLOR_GRAY
;
2047 calc
->cb
[38].r
.left
= skipx
;
2048 calc
->cb
[38].r
.top
= skipy
;
2049 calc
->cb
[38].r
.right
= SZ_MEDBTN_X
;
2050 calc
->cb
[38].r
.bottom
= SZ_MEDBTN_Y
;
2051 calc
->cb
[38].enable
= 0;
2053 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2055 calc
->cb
[39].id
= ID_CALC_COS
;
2056 _tcscpy(calc
->cb
[39].label
,TEXT("cos"));
2057 calc
->cb
[39].color
= CALC_COLOR_MAGENTA
;
2058 calc
->cb
[39].r
.left
= skipx
;
2059 calc
->cb
[39].r
.top
= skipy
;
2060 calc
->cb
[39].r
.right
= SZ_MEDBTN_X
;
2061 calc
->cb
[39].r
.bottom
= SZ_MEDBTN_Y
;
2062 calc
->cb
[39].enable
= 1;
2064 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2066 calc
->cb
[40].id
= ID_CALC_CUBE
;
2067 _tcscpy(calc
->cb
[40].label
,TEXT("x^3"));
2068 calc
->cb
[40].color
= CALC_COLOR_MAGENTA
;
2069 calc
->cb
[40].r
.left
= skipx
;
2070 calc
->cb
[40].r
.top
= skipy
;
2071 calc
->cb
[40].r
.right
= SZ_MEDBTN_X
;
2072 calc
->cb
[40].r
.bottom
= SZ_MEDBTN_Y
;
2073 calc
->cb
[40].enable
= 1;
2075 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2077 calc
->cb
[41].id
= ID_CALC_FACTORIAL
;
2078 _tcscpy(calc
->cb
[41].label
,TEXT("n!"));
2079 calc
->cb
[41].color
= CALC_COLOR_MAGENTA
;
2080 calc
->cb
[41].r
.left
= skipx
;
2081 calc
->cb
[41].r
.top
= skipy
;
2082 calc
->cb
[41].r
.right
= SZ_MEDBTN_X
;
2083 calc
->cb
[41].r
.bottom
= SZ_MEDBTN_Y
;
2084 calc
->cb
[41].enable
= 1;
2086 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2088 calc
->cb
[42].id
= ID_CALC_MEM_PLUS
;
2089 LoadString( hInst
, IDS_BTN_MEM_PLUS
, calc
->cb
[42].label
, sizeof(calc
->cb
[42].label
) / sizeof(calc
->cb
[42].label
[0]));
2090 calc
->cb
[42].color
= CALC_COLOR_RED
;
2091 calc
->cb
[42].r
.left
= skipx
;
2092 calc
->cb
[42].r
.top
= skipy
;
2093 calc
->cb
[42].r
.right
= SZ_MEDBTN_X
;
2094 calc
->cb
[42].r
.bottom
= SZ_MEDBTN_Y
;
2095 calc
->cb
[42].enable
= 1;
2097 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2099 calc
->cb
[43].id
= ID_CALC_ZERO
;
2100 _tcscpy(calc
->cb
[43].label
,TEXT("0"));
2101 calc
->cb
[43].color
= CALC_COLOR_BLUE
;
2102 calc
->cb
[43].r
.left
= skipx
;
2103 calc
->cb
[43].r
.top
= skipy
;
2104 calc
->cb
[43].r
.right
= SZ_MEDBTN_X
;
2105 calc
->cb
[43].r
.bottom
= SZ_MEDBTN_Y
;
2106 calc
->cb
[43].enable
= 1;
2108 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2110 calc
->cb
[44].id
= ID_CALC_SIGN
;
2111 _tcscpy(calc
->cb
[44].label
,TEXT("+/-"));
2112 calc
->cb
[44].color
= CALC_COLOR_RED
;
2113 calc
->cb
[44].r
.left
= skipx
;
2114 calc
->cb
[44].r
.top
= skipy
;
2115 calc
->cb
[44].r
.right
= SZ_MEDBTN_X
;
2116 calc
->cb
[44].r
.bottom
= SZ_MEDBTN_Y
;
2117 calc
->cb
[44].enable
= 1;
2119 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2121 calc
->cb
[45].id
= ID_CALC_DECIMAL
;
2122 _tcscpy(calc
->cb
[45].label
,TEXT("."));
2123 calc
->cb
[45].color
= CALC_COLOR_BLUE
;
2124 calc
->cb
[45].r
.left
= skipx
;
2125 calc
->cb
[45].r
.top
= skipy
;
2126 calc
->cb
[45].r
.right
= SZ_MEDBTN_X
;
2127 calc
->cb
[45].r
.bottom
= SZ_MEDBTN_Y
;
2128 calc
->cb
[45].enable
= 1;
2130 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2132 calc
->cb
[46].id
= ID_CALC_PLUS
;
2133 _tcscpy(calc
->cb
[46].label
,TEXT("+"));
2134 calc
->cb
[46].color
= CALC_COLOR_RED
;
2135 calc
->cb
[46].r
.left
= skipx
;
2136 calc
->cb
[46].r
.top
= skipy
;
2137 calc
->cb
[46].r
.right
= SZ_MEDBTN_X
;
2138 calc
->cb
[46].r
.bottom
= SZ_MEDBTN_Y
;
2139 calc
->cb
[46].enable
= 1;
2141 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2143 calc
->cb
[47].id
= ID_CALC_EQUALS
;
2144 _tcscpy(calc
->cb
[47].label
,TEXT("="));
2145 calc
->cb
[47].color
= CALC_COLOR_RED
;
2146 calc
->cb
[47].r
.left
= skipx
;
2147 calc
->cb
[47].r
.top
= skipy
;
2148 calc
->cb
[47].r
.right
= SZ_MEDBTN_X
;
2149 calc
->cb
[47].r
.bottom
= SZ_MEDBTN_Y
;
2150 calc
->cb
[47].enable
= 1;
2152 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2154 calc
->cb
[48].id
= ID_CALC_INT
;
2155 _tcscpy(calc
->cb
[48].label
,TEXT("Int"));
2156 calc
->cb
[48].color
= CALC_COLOR_RED
;
2157 calc
->cb
[48].r
.left
= skipx
;
2158 calc
->cb
[48].r
.top
= skipy
;
2159 calc
->cb
[48].r
.right
= SZ_MEDBTN_X
;
2160 calc
->cb
[48].r
.bottom
= SZ_MEDBTN_Y
;
2161 calc
->cb
[48].enable
= 1;
2166 skipx
= MARGIN_LEFT
;
2167 skipy
+= SZ_MEDBTN_Y
+ MARGIN_SMALL_Y
;
2169 calc
->cb
[49].id
= ID_CALC_DAT
;
2170 _tcscpy(calc
->cb
[49].label
,TEXT("Dat"));
2171 calc
->cb
[49].color
= CALC_COLOR_GRAY
;
2172 calc
->cb
[49].r
.left
= skipx
;
2173 calc
->cb
[49].r
.top
= skipy
;
2174 calc
->cb
[49].r
.right
= SZ_MEDBTN_X
;
2175 calc
->cb
[49].r
.bottom
= SZ_MEDBTN_Y
;
2176 calc
->cb
[49].enable
= 0;
2178 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2180 calc
->cb
[50].id
= ID_CALC_TAN
;
2181 _tcscpy(calc
->cb
[50].label
,TEXT("tan"));
2182 calc
->cb
[50].color
= CALC_COLOR_MAGENTA
;
2183 calc
->cb
[50].r
.left
= skipx
;
2184 calc
->cb
[50].r
.top
= skipy
;
2185 calc
->cb
[50].r
.right
= SZ_MEDBTN_X
;
2186 calc
->cb
[50].r
.bottom
= SZ_MEDBTN_Y
;
2187 calc
->cb
[50].enable
= 1;
2189 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2191 calc
->cb
[51].id
= ID_CALC_SQUARE
;
2192 _tcscpy(calc
->cb
[51].label
,TEXT("x^2"));
2193 calc
->cb
[51].color
= CALC_COLOR_MAGENTA
;
2194 calc
->cb
[51].r
.left
= skipx
;
2195 calc
->cb
[51].r
.top
= skipy
;
2196 calc
->cb
[51].r
.right
= SZ_MEDBTN_X
;
2197 calc
->cb
[51].r
.bottom
= SZ_MEDBTN_Y
;
2198 calc
->cb
[51].enable
= 1;
2200 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2202 calc
->cb
[52].id
= ID_CALC_RECIPROCAL
;
2203 _tcscpy(calc
->cb
[52].label
,TEXT("1/x"));
2204 calc
->cb
[52].color
= CALC_COLOR_MAGENTA
;
2205 calc
->cb
[52].r
.left
= skipx
;
2206 calc
->cb
[52].r
.top
= skipy
;
2207 calc
->cb
[52].r
.right
= SZ_MEDBTN_X
;
2208 calc
->cb
[52].r
.bottom
= SZ_MEDBTN_Y
;
2209 calc
->cb
[52].enable
= 1;
2211 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2213 calc
->cb
[53].id
= ID_CALC_PI
;
2214 _tcscpy(calc
->cb
[53].label
,TEXT("pi"));
2215 calc
->cb
[53].color
= CALC_COLOR_BLUE
;
2216 calc
->cb
[53].r
.left
= skipx
;
2217 calc
->cb
[53].r
.top
= skipy
;
2218 calc
->cb
[53].r
.right
= SZ_MEDBTN_X
;
2219 calc
->cb
[53].r
.bottom
= SZ_MEDBTN_Y
;
2220 calc
->cb
[53].enable
= 1;
2222 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
+ SZ_SPACER_X
;
2224 calc
->cb
[54].id
= ID_CALC_A
;
2225 _tcscpy(calc
->cb
[54].label
,TEXT("A"));
2226 calc
->cb
[54].color
= CALC_COLOR_GRAY
;
2227 calc
->cb
[54].r
.left
= skipx
;
2228 calc
->cb
[54].r
.top
= skipy
;
2229 calc
->cb
[54].r
.right
= SZ_MEDBTN_X
;
2230 calc
->cb
[54].r
.bottom
= SZ_MEDBTN_Y
;
2231 calc
->cb
[54].enable
= 0;
2233 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2235 calc
->cb
[55].id
= ID_CALC_B
;
2236 _tcscpy(calc
->cb
[55].label
,TEXT("B"));
2237 calc
->cb
[55].color
= CALC_COLOR_GRAY
;
2238 calc
->cb
[55].r
.left
= skipx
;
2239 calc
->cb
[55].r
.top
= skipy
;
2240 calc
->cb
[55].r
.right
= SZ_MEDBTN_X
;
2241 calc
->cb
[55].r
.bottom
= SZ_MEDBTN_Y
;
2242 calc
->cb
[55].enable
= 0;
2244 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2246 calc
->cb
[56].id
= ID_CALC_C
;
2247 _tcscpy(calc
->cb
[56].label
,TEXT("C"));
2248 calc
->cb
[56].color
= CALC_COLOR_GRAY
;
2249 calc
->cb
[56].r
.left
= skipx
;
2250 calc
->cb
[56].r
.top
= skipy
;
2251 calc
->cb
[56].r
.right
= SZ_MEDBTN_X
;
2252 calc
->cb
[56].r
.bottom
= SZ_MEDBTN_Y
;
2253 calc
->cb
[56].enable
= 0;
2255 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2257 calc
->cb
[57].id
= ID_CALC_D
;
2258 _tcscpy(calc
->cb
[57].label
,TEXT("D"));
2259 calc
->cb
[57].color
= CALC_COLOR_GRAY
;
2260 calc
->cb
[57].r
.left
= skipx
;
2261 calc
->cb
[57].r
.top
= skipy
;
2262 calc
->cb
[57].r
.right
= SZ_MEDBTN_X
;
2263 calc
->cb
[57].r
.bottom
= SZ_MEDBTN_Y
;
2264 calc
->cb
[57].enable
= 0;
2266 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2268 calc
->cb
[58].id
= ID_CALC_E
;
2269 _tcscpy(calc
->cb
[58].label
,TEXT("E"));
2270 calc
->cb
[58].color
= CALC_COLOR_GRAY
;
2271 calc
->cb
[58].r
.left
= skipx
;
2272 calc
->cb
[58].r
.top
= skipy
;
2273 calc
->cb
[58].r
.right
= SZ_MEDBTN_X
;
2274 calc
->cb
[58].r
.bottom
= SZ_MEDBTN_Y
;
2275 calc
->cb
[58].enable
= 0;
2277 skipx
+= SZ_MEDBTN_X
+ MARGIN_SMALL_X
;
2279 calc
->cb
[59].id
= ID_CALC_F
;
2280 _tcscpy(calc
->cb
[59].label
,TEXT("F"));
2281 calc
->cb
[59].color
= CALC_COLOR_GRAY
;
2282 calc
->cb
[59].r
.left
= skipx
;
2283 calc
->cb
[59].r
.top
= skipy
;
2284 calc
->cb
[59].r
.right
= SZ_MEDBTN_X
;
2285 calc
->cb
[59].r
.bottom
= SZ_MEDBTN_Y
;
2286 calc
->cb
[59].enable
= 0;
2290 calc
->cb
[60].id
= ID_CALC_NS_HEX
;
2291 _tcscpy(calc
->cb
[60].label
,TEXT("Hex"));
2292 calc
->cb
[60].color
= CALC_COLOR_GRAY
;
2293 calc
->cb
[60].r
.left
= CALC_NS_HEX_LEFT
;
2294 calc
->cb
[60].r
.top
= CALC_NS_HEX_TOP
;
2295 calc
->cb
[60].r
.right
= SZ_RADIO_NS_X
;
2296 calc
->cb
[60].r
.bottom
= SZ_RADIO_NS_Y
;
2297 calc
->cb
[60].enable
= 1;
2299 calc
->cb
[61].id
= ID_CALC_NS_DEC
;
2300 _tcscpy(calc
->cb
[61].label
,TEXT("Dec"));
2301 calc
->cb
[61].color
= CALC_COLOR_GRAY
;
2302 calc
->cb
[61].r
.left
= CALC_NS_DEC_LEFT
;
2303 calc
->cb
[61].r
.top
= CALC_NS_DEC_TOP
;
2304 calc
->cb
[61].r
.right
= SZ_RADIO_NS_X
;
2305 calc
->cb
[61].r
.bottom
= SZ_RADIO_NS_Y
;
2306 calc
->cb
[61].enable
= 1;
2308 calc
->cb
[62].id
= ID_CALC_NS_OCT
;
2309 _tcscpy(calc
->cb
[62].label
,TEXT("Oct"));
2310 calc
->cb
[62].color
= CALC_COLOR_GRAY
;
2311 calc
->cb
[62].r
.left
= CALC_NS_OCT_LEFT
;
2312 calc
->cb
[62].r
.top
= CALC_NS_OCT_TOP
;
2313 calc
->cb
[62].r
.right
= SZ_RADIO_NS_X
;
2314 calc
->cb
[62].r
.bottom
= SZ_RADIO_NS_Y
;
2315 calc
->cb
[62].enable
= 1;
2317 calc
->cb
[63].id
= ID_CALC_NS_BIN
;
2318 _tcscpy(calc
->cb
[63].label
,TEXT("Bin"));
2319 calc
->cb
[63].color
= CALC_COLOR_GRAY
;
2320 calc
->cb
[63].r
.left
= CALC_NS_BIN_LEFT
;
2321 calc
->cb
[63].r
.top
= CALC_NS_BIN_TOP
;
2322 calc
->cb
[63].r
.right
= SZ_RADIO_NS_X
;
2323 calc
->cb
[63].r
.bottom
= SZ_RADIO_NS_Y
;
2324 calc
->cb
[63].enable
= 1;
2326 calc
->cb
[64].id
= ID_CALC_MS_DEGREES
;
2327 _tcscpy(calc
->cb
[64].label
,TEXT("Degrees"));
2328 calc
->cb
[64].color
= CALC_COLOR_GRAY
;
2329 calc
->cb
[64].r
.left
= CALC_MS_DEGREES_LEFT
;
2330 calc
->cb
[64].r
.top
= CALC_MS_DEGREES_TOP
;
2331 calc
->cb
[64].r
.right
= SZ_RADIO_MS_X
;
2332 calc
->cb
[64].r
.bottom
= SZ_RADIO_MS_Y
;
2333 calc
->cb
[64].enable
= 1;
2335 calc
->cb
[65].id
= ID_CALC_MS_RADIANS
;
2336 _tcscpy(calc
->cb
[65].label
,TEXT("Radians"));
2337 calc
->cb
[65].color
= CALC_COLOR_GRAY
;
2338 calc
->cb
[65].r
.left
= CALC_MS_RADIANS_LEFT
;
2339 calc
->cb
[65].r
.top
= CALC_MS_RADIANS_TOP
;
2340 calc
->cb
[65].r
.right
= SZ_RADIO_MS_X
;
2341 calc
->cb
[65].r
.bottom
= SZ_RADIO_MS_Y
;
2342 calc
->cb
[65].enable
= 1;
2344 calc
->cb
[66].id
= ID_CALC_MS_GRADS
;
2345 _tcscpy(calc
->cb
[66].label
,TEXT("Grads"));
2346 calc
->cb
[66].color
= CALC_COLOR_GRAY
;
2347 calc
->cb
[66].r
.left
= CALC_MS_GRADS_LEFT
;
2348 calc
->cb
[66].r
.top
= CALC_MS_GRADS_TOP
;
2349 calc
->cb
[66].r
.right
= SZ_RADIO_MS_X
;
2350 calc
->cb
[66].r
.bottom
= SZ_RADIO_MS_Y
;
2351 calc
->cb
[66].enable
= 1;
2353 calc
->cb
[67].id
= ID_CALC_CB_INV
;
2354 _tcscpy(calc
->cb
[67].label
,TEXT("Inv"));
2355 calc
->cb
[67].color
= CALC_COLOR_GRAY
;
2356 calc
->cb
[67].r
.left
= CALC_CB_INV_LEFT
;
2357 calc
->cb
[67].r
.top
= CALC_CB_INV_TOP
;
2358 calc
->cb
[67].r
.right
= SZ_RADIO_CB_X
;
2359 calc
->cb
[67].r
.bottom
= SZ_RADIO_CB_Y
;
2360 calc
->cb
[67].enable
= 1;
2362 calc
->cb
[68].id
= ID_CALC_CB_HYP
;
2363 _tcscpy(calc
->cb
[68].label
,TEXT("Hyp"));
2364 calc
->cb
[68].color
= CALC_COLOR_GRAY
;
2365 calc
->cb
[68].r
.left
= CALC_CB_HYP_LEFT
;
2366 calc
->cb
[68].r
.top
= CALC_CB_HYP_TOP
;
2367 calc
->cb
[68].r
.right
= SZ_RADIO_CB_X
;
2368 calc
->cb
[68].r
.bottom
= SZ_RADIO_CB_Y
;
2369 calc
->cb
[68].enable
= 1;
2371 calc
->cb
[69].id
= ID_CALC_WS_QWORD
;
2372 _tcscpy(calc
->cb
[69].label
,TEXT("Qword"));
2373 calc
->cb
[69].color
= CALC_COLOR_GRAY
;
2374 calc
->cb
[69].r
.left
= CALC_WS_QWORD_LEFT
;
2375 calc
->cb
[69].r
.top
= CALC_WS_QWORD_TOP
;
2376 calc
->cb
[69].r
.right
= SZ_RADIO_WS_X
;
2377 calc
->cb
[69].r
.bottom
= SZ_RADIO_WS_Y
;
2378 calc
->cb
[69].enable
= 1;
2380 calc
->cb
[70].id
= ID_CALC_WS_DWORD
;
2381 _tcscpy(calc
->cb
[70].label
,TEXT("Dword"));
2382 calc
->cb
[70].color
= CALC_COLOR_GRAY
;
2383 calc
->cb
[70].r
.left
= CALC_WS_DWORD_LEFT
;
2384 calc
->cb
[70].r
.top
= CALC_WS_DWORD_TOP
;
2385 calc
->cb
[70].r
.right
= SZ_RADIO_WS_X
;
2386 calc
->cb
[70].r
.bottom
= SZ_RADIO_WS_Y
;
2387 calc
->cb
[70].enable
= 1;
2389 calc
->cb
[71].id
= ID_CALC_WS_WORD
;
2390 _tcscpy(calc
->cb
[71].label
,TEXT("Word"));
2391 calc
->cb
[71].color
= CALC_COLOR_GRAY
;
2392 calc
->cb
[71].r
.left
= CALC_WS_WORD_LEFT
;
2393 calc
->cb
[71].r
.top
= CALC_WS_WORD_TOP
;
2394 calc
->cb
[71].r
.right
= SZ_RADIO_WS_X
;
2395 calc
->cb
[71].r
.bottom
= SZ_RADIO_WS_Y
;
2396 calc
->cb
[71].enable
= 1;
2398 calc
->cb
[72].id
= ID_CALC_WS_BYTE
;
2399 _tcscpy(calc
->cb
[72].label
,TEXT("Byte"));
2400 calc
->cb
[72].color
= CALC_COLOR_GRAY
;
2401 calc
->cb
[72].r
.left
= CALC_WS_BYTE_LEFT
;
2402 calc
->cb
[72].r
.top
= CALC_WS_BYTE_TOP
;
2403 calc
->cb
[72].r
.right
= SZ_RADIO_WS_X
;
2404 calc
->cb
[72].r
.bottom
= SZ_RADIO_WS_Y
;
2405 calc
->cb
[72].enable
= 1;
2408 // preload clip region for filler squares
2410 if (calc
->sciMode
) {
2413 rFiller
.left
= calc
->cb
[0].r
.left
;
2414 rFiller
.top
= calc
->cb
[0].r
.top
;
2415 rFiller
.right
= calc
->cb
[0].r
.right
;
2416 rFiller
.bottom
= calc
->cb
[0].r
.bottom
;
2421 rFiller
.left
= calc
->cb
[1].r
.left
;
2422 rFiller
.top
= calc
->cb
[1].r
.top
;
2423 rFiller
.right
= calc
->cb
[0].r
.right
;
2424 rFiller
.bottom
= calc
->cb
[0].r
.bottom
;
2427 top_button
= calc
->numButtons
- 1;
2429 top_button
-= CALC_NS_COUNT
+ CALC_MS_COUNT
+ CALC_CB_COUNT
+ CALC_WS_COUNT
;
2431 for (; n
<= top_button
; n
++) {
2434 calc
->cb
[n
].hBtn
= CreateWindow(
2437 WS_VISIBLE
| WS_CHILD
| WS_BORDER
| BS_CENTER
| BS_VCENTER
| BS_TEXT
|
2438 (calc
->cb
[n
].enable
? 0 : WS_DISABLED
), // BS_FLAT
2441 calc
->cb
[n
].r
.right
,
2442 calc
->cb
[n
].r
.bottom
,
2444 (HMENU
)calc
->cb
[n
].id
,
2449 if (!calc
->cb
[n
].hBtn
)
2452 SendMessage(calc
->cb
[n
].hBtn
, WM_SETFONT
, (WPARAM
)hFont
, TRUE
);
2455 if (!calc
->sciMode
) {
2456 top_button
+= CALC_NS_COUNT
;
2457 for (; n
<=top_button
; n
++) {
2458 int j
= ID_CALC_NS_HEX
+ n
- top_button
+ CALC_NS_COUNT
- 1;
2459 calc
->cb
[n
].hBtn
= CreateWindow(
2462 WS_VISIBLE
| WS_CHILD
| BS_LEFT
| BS_VCENTER
| BS_TEXT
| BS_RADIOBUTTON
,
2463 CALC_NS_OFFSET_X
+ calc
->cb
[n
].r
.left
,
2464 CALC_NS_OFFSET_Y
+ calc
->cb
[n
].r
.top
,
2465 calc
->cb
[n
].r
.right
,
2466 calc
->cb
[n
].r
.bottom
,
2473 if (!calc
->cb
[n
].hBtn
)
2476 SendMessage(calc
->cb
[n
].hBtn
, WM_SETFONT
, (WPARAM
)hFont
, TRUE
);
2479 top_button
+= CALC_MS_COUNT
;
2481 for (; n
<=top_button
; n
++) {
2482 calc
->cb
[n
].hBtn
= CreateWindow(
2485 WS_VISIBLE
| WS_CHILD
| BS_LEFT
| BS_VCENTER
| BS_TEXT
| BS_RADIOBUTTON
,
2486 CALC_MS_OFFSET_X
+ calc
->cb
[n
].r
.left
,
2487 CALC_MS_OFFSET_Y
+ calc
->cb
[n
].r
.top
,
2488 calc
->cb
[n
].r
.right
,
2489 calc
->cb
[n
].r
.bottom
,
2491 (HMENU
)(ID_CALC_MS_DEGREES
+ n
- top_button
+ CALC_MS_COUNT
- 1),
2496 if (!calc
->cb
[n
].hBtn
)
2499 SendMessage(calc
->cb
[n
].hBtn
, WM_SETFONT
, (WPARAM
)hFont
, TRUE
);
2502 top_button
+= CALC_CB_COUNT
;
2504 for (; n
<=top_button
; n
++) {
2505 calc
->cb
[n
].hBtn
= CreateWindow(
2508 WS_VISIBLE
| WS_CHILD
| BS_LEFT
| BS_VCENTER
| BS_TEXT
| BS_CHECKBOX
,
2509 CALC_CB_OFFSET_X
+ calc
->cb
[n
].r
.left
,
2510 CALC_CB_OFFSET_Y
+ calc
->cb
[n
].r
.top
,
2511 calc
->cb
[n
].r
.right
,
2512 calc
->cb
[n
].r
.bottom
,
2514 (HMENU
)(ID_CALC_CB_INV
+ n
- top_button
+ CALC_CB_COUNT
- 1),
2519 if (!calc
->cb
[n
].hBtn
)
2522 SendMessage(calc
->cb
[n
].hBtn
, WM_SETFONT
, (WPARAM
)hFont
, TRUE
);
2525 top_button
+= CALC_WS_COUNT
;
2527 for (; n
<=top_button
; n
++) {
2528 calc
->cb
[n
].hBtn
= CreateWindow(
2531 WS_CHILD
| BS_LEFT
| BS_VCENTER
| BS_TEXT
| BS_RADIOBUTTON
,
2532 CALC_WS_OFFSET_X
+ calc
->cb
[n
].r
.left
,
2533 CALC_WS_OFFSET_Y
+ calc
->cb
[n
].r
.top
,
2534 calc
->cb
[n
].r
.right
,
2535 calc
->cb
[n
].r
.bottom
,
2537 (HMENU
)(ID_CALC_WS_QWORD
+ n
- top_button
+ CALC_WS_COUNT
- 1),
2542 if (!calc
->cb
[n
].hBtn
)
2545 EnableWindow(calc
->cb
[n
].hBtn
, FALSE
);
2546 SendMessage(calc
->cb
[n
].hBtn
, WM_SETFONT
, (WPARAM
)hFont
, TRUE
);
2551 SendMessage(calc
->cb
[61].hBtn
, BM_SETCHECK
, 1, 0); // decimal
2552 SendMessage(calc
->cb
[64].hBtn
, BM_SETCHECK
, 1, 0); // degrees
2553 SendMessage(calc
->cb
[69].hBtn
, BM_SETCHECK
, 1, 0); // qword
2557 void DrawCalcRect (HDC hdc
, HDC hMemDC
, PAINTSTRUCT
*ps
, CALC
*calc
, int object
)
2568 int WDISPLAY_BOTTOM
;
2570 if (!calc
->sciMode
) {
2571 WDISPLAY_LEFT
= WDISPLAY_SCIENTIFIC_LEFT
;
2572 WDISPLAY_TOP
= WDISPLAY_SCIENTIFIC_TOP
;
2573 WDISPLAY_RIGHT
= WDISPLAY_SCIENTIFIC_RIGHT
;
2574 WDISPLAY_BOTTOM
= WDISPLAY_SCIENTIFIC_BOTTOM
;
2577 WDISPLAY_LEFT
= WDISPLAY_STANDARD_LEFT
;
2578 WDISPLAY_TOP
= WDISPLAY_STANDARD_TOP
;
2579 WDISPLAY_RIGHT
= WDISPLAY_STANDARD_RIGHT
;
2580 WDISPLAY_BOTTOM
= WDISPLAY_STANDARD_BOTTOM
;
2583 // never delete the active pen!
2587 hPenGray
= CreatePen(PS_SOLID
, 1, RGB(CALC_GRAY
,CALC_GRAY
,CALC_GRAY
));
2588 hPenBlack
= CreatePen(PS_SOLID
, 1, RGB(0,0,0));
2589 hPenWhite
= CreatePen(PS_SOLID
, 1, RGB(255,255,255));
2591 hPenOrg
= SelectObject(hdc
, hPenGray
);
2594 calc
->cb
[object
].r
.left
,
2595 calc
->cb
[object
].r
.bottom
,
2598 LineTo(hdc
, calc
->cb
[object
].r
.left
, calc
->cb
[object
].r
.top
);
2599 LineTo(hdc
, calc
->cb
[object
].r
.right
, calc
->cb
[object
].r
.top
);
2603 SelectObject(hdc
, hPenBlack
);
2606 calc
->cb
[object
].r
.right
-2,
2607 calc
->cb
[object
].r
.top
+1,
2610 LineTo(hdc
, calc
->cb
[object
].r
.left
+1, calc
->cb
[object
].r
.top
+1);
2611 LineTo(hdc
, calc
->cb
[object
].r
.left
+1, calc
->cb
[object
].r
.bottom
-1);
2613 SelectObject(hdc
, hPenBlack
);
2620 LineTo(hdc
, WDISPLAY_LEFT
- 1, WDISPLAY_TOP
- 1);
2621 LineTo(hdc
, WDISPLAY_RIGHT
+ 1, WDISPLAY_TOP
- 1);
2623 SelectObject(hdc
, hPenGray
);
2630 LineTo(hdc
, WDISPLAY_LEFT
- 2, WDISPLAY_TOP
- 2);
2631 LineTo(hdc
, WDISPLAY_LEFT
- 2, WDISPLAY_BOTTOM
+ 1);
2635 SelectObject(hdc
, hPenWhite
);
2638 calc
->cb
[object
].r
.left
,
2639 calc
->cb
[object
].r
.bottom
,
2642 LineTo(hdc
, calc
->cb
[object
].r
.right
, calc
->cb
[object
].r
.bottom
);
2643 LineTo(hdc
, calc
->cb
[object
].r
.right
, calc
->cb
[object
].r
.top
);
2645 SelectObject(hdc
, hPenOrg
);
2646 DeleteObject(hPenGray
);
2647 DeleteObject(hPenBlack
);
2648 DeleteObject(hPenWhite
);
2651 void DrawCalcRectSci(HDC hdc
, HDC hMemDC
, PAINTSTRUCT
*ps
, CALC
*calc
, RECT
*r
)
2657 // never delete the active pen!
2661 hPen
= CreatePen(PS_SOLID
, 1, RGB(255,255,255));
2662 hPenOrg
= SelectObject(hdc
, hPen
);
2669 LineTo(hdc
, r
->left
+ 1, r
->top
+ 1);
2670 LineTo(hdc
, r
->right
+ 1, r
->top
+ 1);
2671 LineTo(hdc
, r
->right
+ 1, r
->bottom
+ 1);
2672 LineTo(hdc
, r
->left
+ 1, r
->bottom
+ 1);
2674 SelectObject(hdc
, hPenOrg
);
2679 hPen
= CreatePen(PS_SOLID
, 1, RGB(CALC_GRAY
,CALC_GRAY
,CALC_GRAY
));
2680 hPenOrg
= SelectObject(hdc
, hPen
);
2687 LineTo(hdc
, r
->left
, r
->top
);
2688 LineTo(hdc
, r
->right
, r
->top
);
2689 LineTo(hdc
, r
->right
, r
->bottom
);
2690 LineTo(hdc
, r
->left
, r
->bottom
);
2692 SelectObject(hdc
, hPenOrg
);
2696 static RECT scirect1
= {
2697 WDISPLAY_SCIENTIFIC_LEFT
- 2,
2698 WDISPLAY_SCIENTIFIC_TOP
+ 25,
2699 WDISPLAY_SCIENTIFIC_LEFT
+ 202,
2700 WDISPLAY_SCIENTIFIC_TOP
+ 51
2703 static RECT scirect2
= {
2704 WDISPLAY_SCIENTIFIC_LEFT
+ 205,
2705 WDISPLAY_SCIENTIFIC_TOP
+ 25,
2706 WDISPLAY_SCIENTIFIC_RIGHT
,
2707 WDISPLAY_SCIENTIFIC_TOP
+ 51
2710 static RECT scirect3
= {
2711 WDISPLAY_SCIENTIFIC_LEFT
- 2,
2712 WDISPLAY_SCIENTIFIC_TOP
+ 57,
2713 WDISPLAY_SCIENTIFIC_LEFT
+ 102,
2714 WDISPLAY_SCIENTIFIC_TOP
+ 81
2717 void DrawCalc (HDC hdc
, HDC hMemDC
, PAINTSTRUCT
*ps
, CALC
*calc
)
2719 TCHAR s
[CALC_BUF_SIZE
];
2721 scirect1
.right
= calc
->cb
[0].r
.right
+ 2;
2722 scirect2
.left
= calc
->cb
[0].r
.right
+ 5;
2723 scirect3
.right
= calc
->cb
[1].r
.left
- 10;
2725 DrawCalcRect (hdc
, hMemDC
, ps
, calc
, 0);
2727 if (!calc
->sciMode
) {
2728 DrawCalcRect (hdc
, hMemDC
, ps
, calc
, 1);
2729 DrawCalcRectSci(hdc
, hMemDC
, ps
, calc
, &scirect1
);
2730 DrawCalcRectSci(hdc
, hMemDC
, ps
, calc
, &scirect2
);
2731 DrawCalcRectSci(hdc
, hMemDC
, ps
, calc
, &scirect3
);
2734 LoadString(calc
->hInst
, IDS_BTN_MEM_STATUS_M
, s
, sizeof(s
) / sizeof(s
[0]));
2736 DrawCalcText(hdc
, hMemDC
, ps
, calc
, 0, s
);
2739 void DrawCalcText (HDC hdc
, HDC hMemDC
, PAINTSTRUCT
*ps
, CALC
*calc
, int object
, TCHAR
*s
)
2749 TCHAR s2
[CALC_BUF_SIZE
];
2754 int WDISPLAY_BOTTOM
;
2756 if (!calc
->sciMode
) {
2757 WDISPLAY_LEFT
= WDISPLAY_SCIENTIFIC_LEFT
;
2758 WDISPLAY_TOP
= WDISPLAY_SCIENTIFIC_TOP
;
2759 WDISPLAY_RIGHT
= WDISPLAY_SCIENTIFIC_RIGHT
;
2760 WDISPLAY_BOTTOM
= WDISPLAY_SCIENTIFIC_BOTTOM
;
2763 WDISPLAY_LEFT
= WDISPLAY_STANDARD_LEFT
;
2764 WDISPLAY_TOP
= WDISPLAY_STANDARD_TOP
;
2765 WDISPLAY_RIGHT
= WDISPLAY_STANDARD_RIGHT
;
2766 WDISPLAY_BOTTOM
= WDISPLAY_STANDARD_BOTTOM
;
2769 // DEFAULT_GUI_FONT is Tahoma on 2000 and XP?
2770 // SYSTEM_FONT is MS Sans Serif?
2772 hFont
= GetStockObject(DEFAULT_GUI_FONT
);
2774 hFontOrg
= SelectObject(hdc
, hFont
);
2777 SetBkMode(hdc
, TRANSPARENT
);
2780 calc
->cb
[object
].r
.left
+ 9,
2781 calc
->cb
[object
].r
.top
+ 7,
2786 SetBkMode(hdc
, OPAQUE
);
2790 _stprintf(s2
, TEXT("(=%d"),calc
->paren
);
2792 SetBkMode(hdc
, TRANSPARENT
);
2794 SetTextAlign(hdc
, TA_CENTER
);
2797 calc
->cb
[object
+1].r
.left
+ 13,
2798 calc
->cb
[object
+1].r
.top
+ 6,
2803 SetBkMode(hdc
, OPAQUE
);
2806 hPen
= CreatePen(PS_SOLID
, 1, RGB(255,255,255));
2807 hPenOrg
= SelectObject(hdc
, hPen
);
2808 hBrush
= GetSysColorBrush(COLOR_WINDOW
);
2809 hBrushOrg
= SelectObject(hdc
, hBrush
);
2813 WDISPLAY_BOTTOM
+ 1,
2817 LineTo(hdc
, WDISPLAY_RIGHT
+ 1, WDISPLAY_BOTTOM
+ 1);
2818 LineTo(hdc
, WDISPLAY_RIGHT
+ 1, WDISPLAY_TOP
- 2);
2820 Rectangle(hdc
, WDISPLAY_LEFT
, WDISPLAY_TOP
, WDISPLAY_RIGHT
, WDISPLAY_BOTTOM
);
2822 SelectObject(hdc
, hPenOrg
);
2823 SelectObject(hdc
, hBrushOrg
);
2826 SetBkMode(hdc
, TRANSPARENT
);
2828 SetTextAlign(hdc
, TA_RIGHT
);
2834 _tcslen(calc
->display
)
2837 SelectObject(hdc
, hFontOrg
);
2840 void DestroyCalc (CALC
*calc
)
2844 for (i
=0;i
<calc
->numButtons
;i
++)
2845 DestroyWindow(calc
->cb
[i
].hBtn
);
2850 if (menus
[MENU_STD
] != 0)
2851 DestroyMenu(menus
[MENU_STD
]);
2853 if (menus
[MENU_SCIMS
] != 0)
2854 DestroyMenu(menus
[MENU_SCIMS
]);
2856 if (menus
[MENU_SCIWS
] != 0)
2857 DestroyMenu(menus
[MENU_SCIWS
]);
2860 void calc_buffer_format(CALC
*calc
) {
2866 // calc_buffer_format: enforce buffer content rules
2868 // disallow more than one point (beep)
2869 // remove leading zeros
2870 // remove trailing zeros after point (sprintf can cause this)
2871 // remove trailing points
2872 // chop at 32 digits. Though there could also be a point, and 10 separator characters.
2876 if (*p
++ == TEXT('.'))
2881 calc
->buffer
[_tcslen(calc
->buffer
)-1] = TEXT('\0');
2889 *(p
+n
) != TEXT('.') &&
2890 *(p
+n
) == TEXT('0')) {
2891 calc
->buffer
[n
] = TEXT('\0');
2896 // remove leading zeros
2900 if (*p
!= TEXT('0'))
2905 // remove trailing points
2910 if (*(p
+n
-1) == TEXT('.')) {
2912 *(p
+ n
) = TEXT('\0');
2925 // _tcscpy(p, TEXT("0"));
2927 // chop at 32 digits
2929 *(p
+33) = TEXT('\0');
2931 *(p
+32) = TEXT('\0');
2935 *(calc
->buffer
+ n
++) = *(p
++);
2936 *(calc
->buffer
+ n
) = TEXT('\0');
2939 void calc_buffer_display(CALC
*calc
) {
2941 TCHAR s
[CALC_BUF_SIZE
];
2944 static int old_base
= NBASE_DECIMAL
;
2947 switch (calc
->numBase
) {
2949 real
= calc_atof(calc
->buffer
, old_base
);
2950 _stprintf(calc
->display
, _T("%lx"), (long)real
);
2951 _stprintf(calc
->buffer
, _T("%lx"), (long)real
);
2952 old_base
= NBASE_HEX
;
2956 real
= calc_atof(calc
->buffer
, old_base
);
2957 _stprintf(calc
->display
, TEXT("%lo"), (long)real
);
2958 _stprintf(calc
->buffer
, TEXT("%lo"), (long)real
);
2959 old_base
= NBASE_OCTAL
;
2963 real
= calc_atof(calc
->buffer
, old_base
);
2965 _stprintf(calc
->display
, TEXT("%lx"), (long)real
);
2966 old_base
= NBASE_BINARY
;
2970 calc_buffer_format(calc
);
2972 if (calc
->displayMode
) {
2973 if (!_tcscmp(calc
->buffer
, TEXT("0")) || !calc
->buffer
[0]) {
2974 _tcscpy(calc
->display
, TEXT("0.e+0"));
2981 real
= calc_atof(calc
->buffer
, calc
->numBase
);
2982 _stprintf(s
, FMT_DESC_EXP
, real
);
2983 // remove leading zeros in exponent
2986 if (*p
== TEXT('e')) { // starting exponent parsing
2990 else if (exp
) { // inside exponent, and haven't seen a digit, so could be a leading zero
2992 if (*p
== TEXT('0'))
2996 if (exp
&& (*p
!= TEXT('e')) && (*p
!= TEXT('0')) && (*p
!= TEXT('+')) && (*p
!= TEXT('-'))) {
3002 calc
->display
[i
++] = *p
;
3007 if (calc
->display
[i
-1] == TEXT('+')) // all trailing zeros
3009 calc
->display
[i
++] = TEXT('0');
3011 calc
->display
[i
] = 0;
3015 // calc_buffer_display: display buffer after formatting
3017 // if digitGrouping, embed separators
3018 // add point if missing
3021 _tcscpy(s
,calc
->buffer
);
3025 if (*p
++ == TEXT('.'))
3030 _tcscpy(s
, TEXT("0"));
3032 if (calc
->digitGrouping
)
3035 if (!point
&& calc
->numBase
== NBASE_DECIMAL
)
3036 _tcscat(s
, TEXT("."));
3038 if (*s
== TEXT('.'))
3039 _tcscpy(calc
->display
, TEXT("0"));
3041 calc
->display
[0] = 0;
3042 _tcscat(calc
->display
, s
);
3044 old_base
= NBASE_DECIMAL
;
3047 InvalidateRect(calc
->hWnd
, NULL
, FALSE
);
3048 UpdateWindow(calc
->hWnd
);
3051 TCHAR
*calc_sep(TCHAR
*s
)
3059 TCHAR r
[CALC_BUF_SIZE
];
3068 // need to handle leading minus sign!
3070 // see if there is a point character
3073 if (*p
++ == TEXT('.')) {
3079 // if there is a point character, skip over decimal places
3088 // commify the integer part now
3090 while ((c
= *(s
+ --n
))) {
3098 if (r
[i
-1] == TEXT(','))
3099 r
[--i
] = TEXT('\0');
3103 _tcscpy(s
, _tcsrev(r
));
3108 long factorial(long n
)
3113 return n
* factorial(n
- 1);
3116 void calc_setmenuitem_radio(HMENU hMenu
, UINT id
)
3118 MENUITEMINFO menuItem
;
3120 menuItem
.fMask
= MIIM_FTYPE
;
3121 menuItem
.fType
= MFT_STRING
| MFT_RADIOCHECK
;
3122 // menuItem.fState = MFS_ENABLED;
3123 // menuItem.wID = id;
3124 // menuItem.hSubMenu = NULL;
3125 // menuItem.hbmpChecked = NULL;
3126 // menuItem.hbmpUnchecked = NULL;
3127 // menuItem.dwItemData = 0;
3128 // menuItem.dwTypeData = "Hex\tF5";
3129 // menuItem.cch = sizeof("Hex\tF5");
3130 menuItem
.cbSize
= sizeof(MENUITEMINFO
);
3132 SetMenuItemInfo(hMenu
, id
, FALSE
, &menuItem
);
3135 calcfloat
calc_convert_to_radians(CALC
*calc
)
3137 calcfloat r
= calc_atof(calc
->buffer
, calc
->numBase
);
3139 if (calc
->trigMode
== TRIGMODE_RADIANS
)
3141 if (calc
->trigMode
== TRIGMODE_DEGREES
)
3142 return r
* CONST_PI
/ 180;
3143 else if (calc
->trigMode
== TRIGMODE_GRADS
)
3144 return r
* CONST_PI
/ 200; // 90 degrees == 100 grads
3149 calcfloat
calc_convert_from_radians(CALC
*calc
)
3151 calcfloat r
= calc_atof(calc
->buffer
, calc
->numBase
);
3153 if (calc
->trigMode
== TRIGMODE_RADIANS
)
3155 if (calc
->trigMode
== TRIGMODE_DEGREES
)
3156 return r
* 180 / CONST_PI
;
3157 else if (calc
->trigMode
== TRIGMODE_GRADS
)
3158 return r
* 200 / CONST_PI
; // 90 degrees == 100 grads
3163 void show_debug(CALC
*calc
, TCHAR
*title
, long w
, long l
)
3169 TEXT("wParam = (%C) %d:%d, %x:%xh\n \
3170 lParam = %d:%d, %x:%x\n \
3174 display = \"%s\"\n \
3203 MessageBox(calc
->hWnd
, s
, title
, MB_OK
);
3206 calcfloat
calc_atof(const TCHAR
*s
, int base
)
3212 // converts from another base to decimal calcfloat
3215 wcstombs(s_ansi
, s
, sizeof(s_ansi
));
3216 return CALC_ATOF(s_ansi
);
3218 return (calcfloat
)_tcstol(s
, NULL
, 16);
3220 return (calcfloat
)_tcstol(s
, NULL
, 8);
3222 return (calcfloat
)_tcstol(s
, NULL
, 2);
3230 void calc_ftoa(CALC
*calc
, calcfloat r
, TCHAR
*buf
)
3232 // converts from decimal calcfloat to another base
3234 switch (calc
->numBase
) {
3236 _stprintf(buf
, FMT_DESC_FLOAT
, r
);
3239 _stprintf(buf
, TEXT("%lX"), (long)r
);
3242 _stprintf(buf
, TEXT("%lo"), (long)r
);
3244 case NBASE_BINARY
: // 911 - need routine here
3252 int parse(int wParam
, int lParam
)
3255 case TEXT('\b'): // backspace
3258 calc
.buffer
[_tcslen(calc
.buffer
)-1] = TEXT('\0');
3261 case TEXT('\x1b'): // ESC
3264 calc
.buffer
[0] = TEXT('\0');
3292 TCHAR s22
[CALC_BUF_SIZE
];
3293 TCHAR w
= (TCHAR
)LOWORD(wParam
);
3295 if (!keys
[calc
.numBase
][(WORD
)w
]) {
3300 if (calc
.next
) { // user first digit indicates new buffer needed after previous UI event
3302 calc
.buffer
[0] = TEXT('\0');
3306 _stprintf(s22
,TEXT("%C"), w
);
3307 _tcscat(calc
.buffer
, s22
);
3308 //MessageBox(NULL, s22, NULL, 0);
3313 case TEXT(','): // 911 - need to handle this, i18n
3315 if (calc
.numBase
== NBASE_DECIMAL
) {
3316 if (calc
.next
) { // first digit indicates new buffer needed after previous UI event
3318 calc
.buffer
[0] = TEXT('\0');
3321 _tcscat(calc
.buffer
, TEXT("."));
3330 case TEXT('X'): // exp, e(1)=2.718
3332 if (calc
.numBase
== NBASE_DECIMAL
) {
3334 calc
.value
= exp(calc_atof(calc
.buffer
, calc
.numBase
));
3335 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3346 if (calc_atof(calc
.buffer
, calc
.numBase
) == 0.0L) {
3347 _tcscpy(calc
.buffer
, err_invalid
);
3350 calc
.value
= log10(calc_atof(calc
.buffer
, calc
.numBase
));
3351 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3356 case TEXT('n'): // ln is natural logarithm
3359 if (calc_atof(calc
.buffer
, calc
.numBase
) == 0.0L) {
3360 _tcscpy(calc
.buffer
, err_invalid
);
3363 calc
.value
= log(calc_atof(calc
.buffer
, calc
.numBase
));
3364 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3370 if (calc
.numBase
== NBASE_DECIMAL
) {
3372 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, CONST_PI
);
3380 case TEXT('\x0c'): // Ctrl+L MC (only need to invalid rectangle if wasn't already zero, no need to update display)
3385 InvalidateRect(calc
.hWnd
, &rFiller
, TRUE
);
3386 UpdateWindow(calc
.hWnd
);
3392 case TEXT('\x12'): // Ctrl+R MR (value doesn't change, so no invalid rectangle. but display is updated.)
3395 if (calc
.memory
!= calc_atof(calc
.buffer
, calc
.numBase
))
3396 _stprintf(calc
.buffer
,FMT_DESC_FLOAT
,calc
.memory
);
3401 case TEXT('\x10'): // Ctrl+P M+ (need to invalidate rectangle in many cases but not display)
3404 InvalidateRect(calc
.hWnd
, &rFiller
, TRUE
);
3405 calc
.memory
+= calc_atof(calc
.buffer
, calc
.numBase
);
3409 case TEXT('\x0d'): // Ctrl+M MS (only need to invalid rectangle if was zero and now not,
3411 // or was not zero and now is, not display)
3414 int x
= GetKeyState(VK_CONTROL
);
3416 if (x
< 0 || lParam
== NUMBER_OF_THE_BEAST
) {
3417 if ((!calc
.memory
&& calc_atof(calc
.buffer
, calc
.numBase
)) ||
3418 (calc
.memory
&& !calc_atof(calc
.buffer
, calc
.numBase
))) {
3420 calc
.memory
= calc_atof(calc
.buffer
, calc
.numBase
);
3421 InvalidateRect(calc
.hWnd
, &rFiller
, FALSE
);
3422 UpdateWindow(calc
.hWnd
);
3425 calc
.memory
= calc_atof(calc
.buffer
, calc
.numBase
);
3430 // fall through for Enter processing
3434 calcfloat r
= calc
.operand
;
3436 if (calc
.newenter
) {
3438 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3439 r
= calc_atof(calc
.buffer
, calc
.numBase
); // convert buffer from whatever base to decimal real
3442 if (calc
.oper
== TEXT('+')) {
3445 else if (calc
.oper
== TEXT('-')) {
3448 else if (calc
.oper
== TEXT('*')) {
3451 else if (calc
.oper
== TEXT('%')) {
3452 calc
.value
= (long)calc
.value
% (long)r
;
3454 else if (calc
.oper
== TEXT('/')) {
3455 if (!calc_atof(calc
.buffer
, calc
.numBase
)) {
3456 _tcscpy(calc
.buffer
, err_undefined
);
3463 else if (calc
.oper
== TEXT('&')) {
3464 calc
.value
= (calcfloat
)((long)calc
.value
& (long)r
);
3466 else if (calc
.oper
== TEXT('|')) {
3467 calc
.value
= (calcfloat
)((long)calc
.value
| (long)r
);
3469 else if (calc
.oper
== TEXT('^')) {
3470 calc
.value
= (calcfloat
)((long)calc
.value
^ (long)r
);
3472 else if (calc
.oper
== TEXT('y')) {
3473 calc
.value
= (calcfloat
)pow(calc
.value
, r
);
3475 else if (calc
.oper
== TEXT('<')) {
3477 calc
.value
= (calcfloat
)((long)calc
.value
>> (long)calc_atof(calc
.buffer
, calc
.numBase
));
3479 calc
.value
= (calcfloat
)((long)calc
.value
<< (long)calc_atof(calc
.buffer
, calc
.numBase
));
3481 else { // must have been a gratuitous user =
3483 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3486 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3495 case TEXT('r'): // 1/x
3498 if (calc_atof(calc
.buffer
, calc
.numBase
) == 0) {
3500 _tcscpy(calc
.buffer
, err_divide_by_zero
);
3503 calc
.value
= 1/calc_atof(calc
.buffer
, calc
.numBase
);
3504 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3508 case TEXT('@'): // ^2 - sqrt in standard mode, squared in sci mode
3511 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3514 calc
.value
*= calc
.value
;
3516 calc
.value
= sqrt(calc
.value
);
3518 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3521 case TEXT('#'): // ^3
3524 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3525 calc
.value
*= calc
.value
* calc
.value
;
3526 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3530 case TEXT('y'): // x^y
3533 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3534 calc
.oper
= TEXT('y');
3538 case TEXT('<'): // Lsh
3541 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3542 calc
.oper
= TEXT('<');
3546 case TEXT(';'): // INT
3549 calc
.value
= (long)calc_atof(calc
.buffer
, calc
.numBase
);
3550 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3553 case TEXT('!'): // factorial, need to use gamma function for reals t^(z-1)*e^t dt
3556 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3557 calc
.value
= (calcfloat
)factorial((long)calc
.value
);
3558 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3561 case TEXT('&'): // bitwise and
3565 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3568 case TEXT('|'): // bitwise or
3570 calc
.oper
= TEXT('|');
3572 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3575 case TEXT('^'): // bitwise xor
3577 calc
.oper
= TEXT('^');
3579 calc
.value
= calc_atof(calc
.buffer
, calc
.numBase
);
3582 case TEXT('~'): // bitwise not
3585 calc
.value
= ~ (long) calc_atof(calc
.buffer
, calc
.numBase
);
3586 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3590 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3591 calc
.value
+= calc
.operand
;
3592 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3593 calc
.oper
= TEXT('+');
3601 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3602 calc
.value
= calc
.operand
;
3605 calc
.value
-= calc
.operand
;
3606 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3609 calc
.oper
= TEXT('-');
3617 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3618 calc
.value
= calc
.operand
;
3621 calc
.value
*= calc
.operand
;
3622 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3624 calc
.oper
= TEXT('*');
3632 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3633 calc
.value
= calc
.operand
;
3636 calc
.value
/= calc
.operand
;
3637 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3639 calc
.oper
= TEXT('/');
3645 if (!calc
.sciMode
) {
3648 calc
.operand
= calc_atof(calc
.buffer
, calc
.numBase
);
3649 calc
.value
= calc
.operand
;
3652 calc
.value
= (long)calc_atof(calc
.buffer
, calc
.numBase
) % (long)calc
.operand
;
3653 calc_ftoa(&calc
, calc
.value
, calc
.buffer
);
3658 r
= calc_atof(calc
.buffer
, calc
.numBase
);
3660 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, r
* calc
.value
/ (calcfloat
)100.0);
3663 calc
.oper
= TEXT('%');
3668 case TEXT('O'): // cos
3671 if (calc
.numBase
== NBASE_DECIMAL
) {
3675 r
= calc_convert_to_radians(&calc
);
3676 if (calc
.hypMode
&& calc
.invMode
)
3677 calc
.value
= acosh(r
);
3678 else if (calc
.invMode
)
3679 calc
.value
= acos(r
);
3680 else if (calc
.hypMode
)
3681 calc
.value
= cosh(r
);
3683 calc
.value
= cos(calc_atof(calc
.buffer
, calc
.numBase
));
3684 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3692 case TEXT('S'): // sin
3695 if (calc
.numBase
== NBASE_DECIMAL
) {
3697 calcfloat r
= calc_convert_to_radians(&calc
);
3699 if (calc
.hypMode
&& calc
.invMode
)
3700 calc
.value
= asinh(r
);
3701 else if (calc
.invMode
)
3702 calc
.value
= asin(r
);
3703 else if (calc
.hypMode
)
3704 calc
.value
= sinh(r
);
3706 calc
.value
= sin(r
);
3708 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3716 case TEXT('T'): // tan
3719 if (calc
.numBase
== NBASE_DECIMAL
) {
3720 calcfloat r
= calc_convert_to_radians(&calc
);
3722 if (calc
.hypMode
&& calc
.invMode
)
3723 calc
.value
= atanh(r
);
3724 else if (calc
.invMode
)
3725 calc
.value
= atan(r
);
3726 else if (calc
.hypMode
)
3727 calc
.value
= tanh(r
);
3729 calc
.value
= tan(r
);
3731 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3739 case TEXT('M'): // dms = Degrees Minutes Seconds
3742 if (calc
.numBase
== NBASE_DECIMAL
) {
3744 calcfloat r
= calc_atof(calc
.buffer
, calc
.numBase
);
3748 r
= (long)r
+ r2
* 0.6; // multiply by 60 and divide by 100
3750 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3758 case TEXT('V'): // toggle scientic notation like 1.e+2 or 100
3761 calc
.displayMode
= !calc
.displayMode
;
3764 // non-standard keystrokes ...
3769 if (calc_atof(calc
.buffer
, calc
.numBase
) < 0) {
3771 _tcscpy(calc
.buffer
, err_invalid
);
3774 calc
.value
= sqrt(calc_atof(calc
.buffer
, calc
.numBase
));
3775 _stprintf(calc
.buffer
, FMT_DESC_FLOAT
, calc
.value
);
3779 case TEXT('Z'): // +/-
3782 TCHAR s
[CALC_BUF_SIZE
] = TEXT("-");
3784 if (!_tcscmp(calc
.buffer
, TEXT("0")))
3787 if (calc
.buffer
[0] == TEXT('-'))
3788 _tcscpy(s
, calc
.buffer
+1);
3790 _tcscpy(s
+1, calc
.buffer
);
3792 _tcscpy(calc
.buffer
, s
);
3796 case TEXT('G'): // debug mode
3813 case WM_CONTEXTMENU: // need to subclass control and just call WinHelp!
3814 WinHelp((HWND) wParam, "c:/windows/help/calc.hlp", HELP_CONTEXTMENU, (DWORD)(LPVOID)2);